一、super 能出现在实例方法和构造方法中
1. 在构造方法执行过程中一连串调用了父类的构造方法,父类的构造方法又继续向下调用它的父类的构造方法,但是实际上对象只创建了一个。
2.super(实参)的作用:初始化当前的父类类型特征,并不是创建新对象,实际上之创建了一个
3.super关键字代表的就是“当前对象
”的那部分父类型特征。
4.super不能在静态类型中使用,大部分情况下是可以省略的,省略后默认有一个super。
5.如果父类中有super,子类中也有,想要在子类中访问父类的特征,super就不可以省略。在夫和子中有同名的属性,或者说有相同的方法,如果此时想在子类中访问父中的数据,必须使用“super.
”加以区分。
class Animal{
public void move(){
System.out.println("Animal move!");
}
}
class Cat extends Animal{
// 对move进行重写。
public void move(){
System.out.println("Cat move!");
}
// 单独编写一个子类特有的方法。
public void yiDong(){
this.move();//子类的move
//前面不写默认有this.
move();//子类的move
// super. 不仅可以访问属性,也可以访问方法。
super.move();//父类的move
}
}
public class Super{
public static void main(String[] args){
Vip v = new Vip("张三");
v.shopping();
}
}
class Customer {
String name;
public Customer(){}
public Customer(String name){
super();
this.name = name;
}
public void doSome(){
System.out.println(this.name + " do some!");
System.out.println(name + " do some!");
//错误: 找不到符号
//System.out.println(super.name + " do some!");//Object类没有name属性
}
}
class Vip extends Customer{
// 假设子类也有一个同名属性
// java中允许在子类中出现和父类一样的同名变量/同名属性。
String name; // 实例变量
public Vip(){
}
public Vip(String name){
super(name);
// this.name = null;
}
public void shopping(){
/*
this.name:当前对象的name属性
super.name:当前对象的父类型特征中的name属性。
*/
System.out.println(this.name + "正在购物!"); // null 正在购物 子类的name
System.out.println(super.name + "正在购物!"); // 张三正在购物 父类的name
System.out.println(name + "正在购物!"); //null 正在购物 子类的name
}
}
6.super()只能出现在构造方法的第一行,通过当前的构造方法去调用父类的构造方法 。
7.super不可以在静态方法中出现不然会报错