以前以为super也就那样了,就是调用父类的方法或者属性嘛
实际上,既然子类继承了父类,他自己就都有父类的所有东西,为什么还要去调用父类呢?
直接给我问懵了、、、
情况一:子类有和父类同名的字段
假如父类person里定义了一个属性id是身份证号的意思;
父类person中:
int id=1002;//身份证号
那么子类student中再定义一个id是学号的意思,这时候会冲突吗?
会引起一些小小的麻烦。此时,我们只有加super.id,才能访问到身份证号。
//在子类中:
public void show(){
System.out.println("name="+this.name+",age="+super.age);
System.out.println("id="+this.id);//id是学号
System.out.println("id="+super.id);//id是身份号
}
这么看着super也没啥大用处啊,不就是区分属性是自己的还是父类的嘛,
那看这个情况二:
众所周知:子类拥有父类非 private 的属性、方法。
我们想定义一个子类student的构造器,这么定义可以吗?
这时候你就会犯嘀咕了。this.name,this.age都是父类的属性。我在子类理所当然的可以拿到了。
要是父类把name,age私有化了,那你子类里怎么写构造器嘛???是个好问题吧
public Student(String name,int age,String major){
this.name=name;//name和age都是父类的属性,这里this.name,this.age可以拿得到吗
this.age=age;
this.major=major;
}
解决办法是调用父类构造器有参构造器super(String name, int age)
public Student(String name,int age,String major){
super(name,age);//这行代码必须在子类构造器的首行
this.major=major;
}
其实,super()几乎是无处不在的,我们的构造器里要么是this()开头的,要么是super()开头的,只是一般情况下把super()省掉不写罢了
public Student(String major){
super();//通常省略不写
this.major=major;
}
最后献上老师的笔记
Constructor 构造器 (创建对象)
在Person类中有构造方法,而且这个方法还很特别。它的名字是类名(一般方法名都是驼峰命名),既然是方法,谁来调用?类还是对象来调用,都不是。是 new +构造器!
- 没有显示定义类的构造器,则系统默认提供一个空参构造器
- 一个类中定义多个构造器,彼此构成重载
- 一旦显示定义了类的构造器,系统就不会再提供默认的空参构造器
class Person{
String name;
int age;
public Person(){
System.out.println("Person()....")
}
public Person(n){
name=n;
}
public Person(n,a){
name=n;
age=a;
}
}
public class PersonTest{
public static void main(String[] args){
//创建类的对象:new + 构造器
Person p=new Person();
p.eat();
}
}