super关键字
super不是引用类型,,super中存储的不是内存地址,,super指向的不是父类对象
super代表的是前子类对象中的父类型特征
什么时候使用 super?
子类和父类中都有某个数据,例如,子类和父类中都有name这个属性
如果要再子类中访问父类中的name属性,需要使用 supersuper可以用在什么地方?
- 可以用在成员方法中,但是不能用在静态方法中
- super可以用在构造方法中
super关键字用在构造方法中:
语法: super(实参);
注意:super()括号中传入的是实参而不是形参作用:通过子类的构造方法去调用父类的构造方法
语法规则(重点):
一个构造方法第一行如果没有this(….);
也没有显示的去调用 super(….);
系统会默认调用 super();例如:
// 父类 public class Bank { private int id; public Bank() { System.out.println("Bank无参构造函数执行"); } } // 子类 public class Credit extends Bank { public Credit() { // 因为这里既没有this()也没有super(),所以JVM默认执行super() } } // 测试类 public class BankTest { public static void main(String[] args) { Credit credit = new Credit(); // ---------> Bank无参构造函数执行 } }
在Java语言中只要是创建Java对象,那么Object中的无参数构造方法一定会执行
因为所有方法默认继承于Object注意: super(….);的调用只能放在构造方法的第一行
super(….);和this(….);不能共存
super(….);调用了父类中的构造方法,但是并不会创建父类对象.
通过子类的构造方法去调用父类的构造方法,
作用是:给当前子类对象中的父类型特征赋值。注意:调用构造方法不一定是创建对象
super()的个人理解:
- super()只能在子类的构造函数中使用
- super()给当前子类对象中的父类型特征赋值
- 因为父类里面成员方法是私有的所以子类无法无法直接访问
- 如果子类调用父类的成员变量还要new一个空间,费空间
- 但是使用super()可以不用创建父类对象直接间接赋值然后直接使用父类get方法访问
例如:
// 父类 public class Bank { private int id; Credit credit; public Bank() { } public Bank(int id) { this.id = id; } public void setId(int id) { this.id = id; } public int getId() { return id; } // 子类 public class Credit extends Bank { private int passWorld; public Credit() { } public Credit(int id,int passWorld) { super(id); // 将id传给父类构造函数,但是父类不会创建对象 this.passWorld = passWorld; } public void setPassWorld(int passWorld) { this.passWorld = passWorld; } public int getPassWorld() { return passWorld; } } // 测试 public static void main(String[] args) { Credit credit = new Credit(100,200); // 创建一个子类对象,为父类型特征id赋值100,子类passWorld赋值200 System.out.println(credit.getId()); // --------> 父类型特征id=100 System.out.println(credit.getPassWorld()); // ----------> passWorld=200 credit.setId(74); // 重新定义父类型特征id=74 System.out.println(credit.getId()); // -------------> 父类型特征id=74 }
super总结:
super关键字: 类似与this关键字(当前当前对象);super关键字代表父类对象
可以利用super关键字代表父类对象访问父类的属性和方法。
- super.属性—>访问父类的属性
- super.方法名()—>调用父类的方法
可以使用super关键字调用父类的构造函数,必须出现在构造函数的第一行。
super不能与static混用。