super代表父类的属性,this代表当前类的属性
子类调用父类时this和super的区别
package Test_Demo4; import Test_Demo1.Demo13; public class Demo1 { public static void main(String[] args) { Demo3 D= new Demo3(); //实例化对象 D.Print("李四"); //调用Print方法时传参 } } class Demo2{ //创建Demo2父类,并创建父类属性name String name="张三"; public Demo2(){ //显式构造方法,名字与类名一致且没有返回值 } } class Demo3 extends Demo2{ //创建Demo3并继承Demo2的属性和方法 String name="王二"; //定义类变量 public void Print(String name){ //创建输出方法,定义形式参数name System.out.println(this.name); //this.name是当前类下的name System.out.println(super.name); //super是父类的name属性 System.out.println(name); //形式参数name } }
执行结果:
王二 张三 李四
子类调用父类的方法时this和super的区别
package Demo1; public class Demo001 { public static void main(String[] args) { Demo003 D3=new Demo003(); //实例化对象 D3.test(); //调用Demo003下的test()方法 } } class Demo002{ //定义Demo002方法用作父类 String name="张三"; //定义实例变量赋予初始值 public void demo(){ //定义公共方法 System.out.println(this.name); //输出当前类中的name属性 } } class Demo003 extends Demo002{ //定义Demo003用于继承Demo002的属性和方法 String name="李四"; //定义实例变量赋予初始值 public void demo(){ //定义公共方法 System.out.println(this.name); 输出当前类中的name属性 } public void test(){ //创建测试方法用于实现方法的调用 this.demo(); //调用当前类的demo()方法 super.demo(); //调用父类的demo()方法 demo(); //调用公共类的demo()方法 } }
执行结果:
李四 张三 李四
使用继承的时候如果要继承父类的方法需要在前面的修饰符加上public(公共的)才能够使子类继承父类的方法
如果子类在继承父类的方法或者属性时,前面的修饰符为private(私有的)时则子类无法直接进行调用或者操作
父类属性前加修饰符private子类无法直接调用
使用get/set方法进行私有属性方法调用
虽然无法直接调用父类的private属性,但是可以通过get/set方法进行调用和修改
public class Demo004 { public static void main(String[] args) { Demo007 D7=new Demo007(); //实例化对象 String s1=D7.getName(); //将D7.getName()方法赋值于s1属性 System.out.println(s1); //输出s1 } } class Demo006{ //定义Demo006类 private String name="许志滨2"; //定义私有属性 private void demo006(){ //定义私有方法 System.out.println(this.name); } public String getName() { //定义getName()方法 return name; } public void setName(String name) { //定义setName()方法 this.name = name; } } class Demo007 extends Demo006{ //定义Demo007类用于集成Demo006 public Demo007(){ //构造方法,不写默认也会有 } }
执行结果:许志滨2
为什么没有输出两次许志滨2,因为只是调用了name属性,并未调用demo006的方法
使用set方法对私有属性进行修改
Demo007 通过继承Demo006类使用set()方法将私有属性进行修改
package Demo1; public class Demo004 { public static void main(String[] args) { Demo007 D7=new Demo007(); D7.setName("许志滨666"); //调用时传实际参数 D7.demo006(); //调用demo006公共方法 } } class Demo006{ private String name="许志滨2"; //定义私有属性 public void demo006(){ //定义公共方法 System.out.println(this.name); //输出当前类name的值 } public void setName(String name) { //创建set方法 this.name = name; } } class Demo007 extends Demo006{ //继承 public Demo007(){ } }
注意:父类的私有方法无法被继承
package Demo1; public class Demo008 { public static void main(String[] args) { new demo010(); //调用无参构造 } } class demo009{ public demo009(){ //定义无参构造 System.out.println("demo009"); } } class demo010 extends demo009{ //继承demo009 public demo010(){ //定义无参构造 System.out.println("demo010"); } }
执行结果:
demo009 demo010
在demo010构造方法中隐形的在首部调用了父类的构造方法
class demo010 extends demo009{ public demo010(){ super(); //隐形在首部调用了父类的构造方法 System.out.println("demo010"); } }
且super();会默认的被隐形添加,只能写在构造方法的首部
super调用父类的构造方法,必须在构造方法的首部
super必须只能出现在子类的方法或者构造方法中
super和this不能同时调用构造方法
this没有继承关系也可以进行调用,super只能在有继承条件下才能使用
this本类构造,super父类构造