注意一:继承的内存布局
即使父类当中的成员变量被private修饰,但是也会被子类继承下来,在子类对象的堆中开辟空间,但是不可以被访问
如果子类与父类中都有重名的变量,那么子类对象的堆上有两个重名的变量。子类方法中会默认访问子类中的崇明变量,若非要访问父
类中的重名变量,那么就用super关键字。
注意二:继承中的重载
public class Animal {
public String name;
public int age;
public Animal(String name , int age){
this.name = name;
this.age = age;
}
public void func(int a){
}
}
public class Dog extends Animal{
boolean silly;
String name;
public Dog(String name, int age, boolean silly){
super(name , age);
this.silly = silly;
}
public void func(){
System.out.println(this.name+" "+this.age+" "+this.silly);
}
}
public void func(int a){
}
public void func(){
System.out.println(this.name+" "+this.age+" "+this.silly);
}
// 这两个func函数构成重载
// 啥叫重载:
//如果一个类的两个方法(无论是在同一个类中声明,还是都由一个类继承,或者一个声明一个继承)具有相同的名称但签名不是覆盖等效的,则该方法名称被称为重载
注意三:super与this 在内存中的表现形式
public class Animal {
public String name;
public int age;
public Animal(String name , int age){
this.name = name;
this.age = age;
}
public void func(int a){
}
}
public class Dog extends Animal{
boolean silly;
String name;
public Dog(String name, int age, boolean silly){
super(name , age);
this.silly = silly;
}
public void func(){
System.out.println(this.name+" "+this.age+" "+this.silly);
}
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog("wangcai",1,false);
dog.func();
}
}
this 会优先访问自己的 ,如果自己的没有就访问父类当中继承下来的,
super 只是一个关键字在代码层面上好理解 ,就是用来访问父类当中 方法 与 变量 ,有些书中讲:super是父类的引用这是错误的,
我们只创建了子类对象,根本就没有创建父类对象,哪来父类引用一说。
注意四:super的用途
1 super . 普通成员变量 调用父类的成员变量
2 super . 普通成员方法 调用父类的成员方法
3 super ( ) 调用父类的构造方法
// super . 静态成员变量/方法 调用父类的静态成员变量与方法 可以但不建议
可以直接父类类名. 静态成员变量/方法 来调用父类的静态成员变量与方法
注意五:先构造父类后构造子类
public class Animal {
public String name;
public int age;
public Animal(String name , int age){
this.name = name;
this.age = age;
}
}
public class Dog extends Animal{
boolean silly;
String name;
public Dog(String name, int age, boolean silly){
super(name , age); // 先构造父类后构造子类 必须放在第一行
this.silly = silly;
}
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog("wangcai",1,false);
}
}