public class MyDog //先把MyDog.class文件加载到虚拟机,
{
private static Animal myAnimal; //把Animal.class文件加载进虚拟机,在方法区的静态数据区开辟空间初始值为null,并和MyDog这个类做静态绑定。
public static void main(String args[]) //在栈中开辟一个主方法栈帧
{
· /*创建对象使父类指向子类,让new的Dog对象和Animal做动态绑定向上转型的特点
①对象调用的方法如果已被子类覆写过了则调用的是子类的方法,如果没有被覆写则调用父类的方法
②如果想要调用子类和父类同名的静态方法不能使用对象点静态方法
③不能调用子类特有的属性和方法
④如果想得到子类中和父类同名的非私有属性只能通过getter和setter方法。
⑤父类指向子类的两种写法
· Father f = new Son() Son s = new Son(); Father f = (Father) s;
继承: 创建子类对象不会创建父类对象只会调用父类的构造器!!!!!!
在创建子类对象时候,首先调用子类的构造器,
子类的构造器的第一句话必须是调用父类的构造器直到Object的构造器,否则编译异 常。
创建子类对象的顺序 父类的成员变量->父类的构造方法 -> 子类成员变量 -> 子类的构造方法。
执行子类对象的方法或者非私有属性会先去调用this.方法 如果没有该方法则会调用this.super.方法
Super的作用:super关键字在java中的作用是使被屏蔽的成员变量或者成员方法变为可见,
super只是记录在对象内部对父类的属性和方法进行引用。
总结:相同的方法会被重写,变量没有重写之说,如果子类声明了跟父类一样的变量,
那意味着子类将有两个相同名称的变量。一个存放在子类实例对象中,
一个存放在父类子对象中。父类的private变量,也会被继承并且初始化在子类父对象中,只不过对外不可见*/
myAnimal=new Dog();
myAnimal.setWeight(50); 父类的方法
System.out.println("My Dog's Weight is"+myAnimal.getWeight());
//myAnimal.weight=100;
// myAnimal.Bark();
//Dog dog=new Dog();
//dog.Bark();
}
}
class Animal
{
private int weight; 父类的私有属性不会被子类继承
Boolean sex;
public Animal()
{System.out.println("Animal(): "+this);
this.weight=20;
this.sex=true;
//this.age=10;//看不到子类新增的属性
}
public int getWeight()
{
return this.weight;
}
public void setWeight(int w)
{
this.weight=w;
this.sex=false;
//this.age=10;//看不到子类新增的属性
}
}
class Dog extends Animal
{ /**子类新增属性*/
int age;
public Dog()
{
System.out.println("Dog(): "+this);
this.age=10;
this.sex=false; 父类的属性
//this.weight=20; 父类的私有属性不能被继承
}
/**
*子类新增方法
*/
public void Bark()
{
//this.weight=20;
this.sex=false;
System.out.println("Wang~~Wang~~~");
}
}
结合内存分析继承的实现
最新推荐文章于 2023-01-19 20:58:56 发布