super
我们先创建3个类
Application 测试类
Person 父类
Student 子类
我们现在Person类里面定义一个属性
protected 受保护的
protected String name = "最左";
然后我们在Student类里面定义一个属性
private 私有的
private String name = "zuiyou";
我们继续在Student类里面输入
public void test(String name){
System.out.println(name); //这是String name传递的参数
System.out.println(this.name); //这是Student类里面的 name 子类
System.out.println(super.name); //这是Person类里面的name 父类
}
我们在Application类里面输出一下
先new一个Student
然后再里面输入
Student student = new Student();
student.test("最右");
输出
输出结果为 最右 zuiyou 最左
第一个 最右 是 我们在Application类里面给他赋的值
第二个 zuiyou 是Student类里面的值
第三个 最左 是Person 类里面的值
我们在Person里面写一个方法print方法
public void print(){
System.out.println("Person");
}
然后再Student类里面写一个print方法
public void print(){
System.out.println("Student");
}
然后在创建一个test1方法
public void test1(){
print();
this.print();
super.print();
}
在Application类里面输入
student.test1();
输出一下
发现输出了3个值 Student Student Person
前面2个Student 是子类里面的
后面那个Person 是父类里面的
我们在把Person类里面的 public 改成private就会发现
super.print 报错了
私有的东西可以被继承!,但是无法访问,只能在本类访问
我们在Person里面输入无参构造
public Person(){
System.out.println("Person无参执行了");
}
然后再Student类里面输入无参构造
public Student(){
System.out.peintln("Student无参构造执行了")
}
然后再Application里面new一个Student
输出一下
为很么 先输出父类的无参构造之后才输出子类的无参构造
说明子类里面有一句隐藏代码,我们看不到的
默认调用了父类的无参构造
这里有个方法叫做super();
这行代码是隐藏的,他调用父类的
不然这就是为什么我new Student 他却把Person类里面的也给调用了
我们把
super(); //调用父类的构造器,必须要在子类的第一行
System.out.println("Student无参构造执行了");
}
这2个调换一下位置
System.out.println("Student无参构造执行了");
}
super(); //调用父类的构造器,必须要在子类的第一行
就会发现
super报错了
也就是说super 调用父类的东西,必须放在第一行
所以 调用父类的构造器,必须在子类的第一行
在子类的内部中调用父类的方法和属性是通过super来实现的
当然, this关键词也是一样
调用自己构造器也是要放到第一行
但是this放在第一行的话,super就会报错
笔记
super注意点
1.super调用父类的构造方法,必须在构造方法的第一个
2.super 必须只能出现在子类的方法或者构造方法中!
3.super 和this 不能同时调用构造方法
this:
代表的对象不同:
this:本身调用者这个对象
super:代表父类对象的引用
前提
this:没有继承也可以使用
super:只能在继承条件下才可以使用
构造方法
this();本类的构造
super();父类的构造!