目录
1、super可以修饰父类的属性和方法
2、super修饰构造器
1、super可以修饰父类的属性和方法
先创建一个Pet类作为父类:
public class Pet {
int age;
String name;
public void eat(){
System.out.println("---吃东西---");
}
public void sleep(){
System.out.println("zzzzzzz~~~~");
}
}
再创建一个Cat类作为子类:
public class Cat extends Pet {
double weight;
public void talk(){
System.out.println("喵喵喵~~~");
}
}
通过Cat类调用父类的属性和方法:
public class Cat extends Pet {
double weight;
public void talk(){
System.out.println("喵喵喵~~~");
System.out.println("我的名字是:"+name);
eat();
}
}
由此可见,super确实可以修饰父类的属性和方法,并且子类可以通过super.属性或super.方法的方式去调用父类提供的属性或方法,在这种情况下,super.一般省略不写,但有一种情况例外:
public class Pet {
int age = 3;
String name;
public class Cat extends Pet {
double weight;
int age = 5;
public void talk(){
System.out.println("喵喵喵~~~");
System.out.println(age);
}
}
当子类和父类中都定义了age时,子类的方法只会输出子类的age
喵喵喵~~~
5
要想访问父类的age,只能通过super关键字
public class Cat extends Pet {
double weight;
int age = 5;
public void talk(){
System.out.println("喵喵喵~~~");
System.out.println(age);
System.out.println(super.age);
}
}
喵喵喵~~~
5
3
不光成员变量如此,成员方法也是这样
public class Cat extends Pet {
double weight;
int age = 5;
public void eat(){
System.out.println("吃肉");
}
public void talk(){
System.out.println("喵喵喵~~~");
System.out.println(age);
System.out.println(super.age);
eat();
super.eat();
}
}
输出结果:
喵喵喵~~~
5
3
吃肉
---吃东西---
小结:当子类和父类的属性名或方法名重名时,要想从子类访问父类的属性或方法,必须加上super修饰符;没有重名就不用。
2、super修饰构造器
在父类中创建一个构造器
public class Pet {
int age = 3;
String name;
public void eat(){
System.out.println("---吃东西---");
}
public void sleep(){
System.out.println("zzzzzzz~~~~");
}
public Pet() {
}
public Pet(int age, String name) {
this.age = age;
this.name = name;
}
}
子类就可以通过super调用父类的构造器:
public class Cat extends Pet {
double weight;
public void talk(){
System.out.println("喵喵喵~~~");
}
public Cat() {
}
public Cat(int age, String name, double weight) {
super(age, name);//使用super调用父类的构造器
this.weight = weight;
}
}
注:super调用父类构造器和this调用子类构造器只能存在一个,两者不能共存,因为super修饰构造器要放在代码块第一行,this修饰构造器也要放在第一行,两者冲突。
public class Cat extends Pet {
double weight;
public void talk(){
System.out.println("喵喵喵~~~");
}
public Cat() {
}
public Cat(double weight) {
this.weight = weight;
}
public Cat(int age, String name, double weight) {
super(age, name);//使用super调用父类的构造器
this(weight);
}
}
这种写法是错误的!!!



