继承
成员变变量访问,就近原则
重写的本质:(覆盖虚方法表)
3举例:dog继承animal
animal有一个方法 public animal method()
dog重写的方法可以是 public animal method()也可以是 public dog method()
继承内存图
加载字节码文件到方法区中时,会把父类也加载进来
在子类创建对象时,堆中有一部分是父类继承下来的成员变量,一部分是自己的成员变量,使用时先查找自己的成员变量,再查找继承的成员变量
方法区还有一个object类,这里没有画出来
虚方法
先加载方法区,方法区中的"所有的成员变量"未画出。
object类共有5个虚方法
fu.class共有6个虚方法(其中private的成员方法不是虚方法)
zi.class的虚方法表共有7个虚方法(自己的1个)
小结
多态
Person类(day04 demo2)
package com.study.demo2;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 行为:
// keepPet(Dog dog,String something)方法
// 功能:喂养宠物狗,something表示喂养的东西
// 行为:
// keepPet(Cat cat,String something)方法
// 功能:喂养宠物猫,something表示喂养的东西
// 生成空参有参构造,set和get方法
// public void keepPet(Dog dog,String something){
// System.out.println("年龄为"+getAge()+"岁的"+getName()+"养了一只"+dog.getColor()+"的狗");
// dog.eat(something);
// }
//
// public void keepPet(Cat cat,String something){
// System.out.println("年龄为"+getAge()+"岁的"+getName()+"养了一只"+cat.getColor()+"的猫");
// cat.eat(something);
// }
public void keepPet(Animal animal,String something){
if (animal instanceof Dog){
Dog dog=(Dog) animal;
System.out.println("年龄为"+getAge()+"岁的"+getName()+"养了一只"+animal.getColor()+"的狗");
dog.eat(something);
}
else if (animal instanceof Cat){
Cat cat=(Cat) animal;
System.out.println("年龄为"+getAge()+"岁的"+getName()+"养了一只"+animal.getColor()+"的猫");
cat.eat(something);
}
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Person{name = " + name + ", age = " + age + "}";
}
}
测试类test
package com.study.demo2;
public class test {
public static void main(String[] args) {
Person person = new Person("老王",30);
Person person1 = new Person("老李",25);
Dog dog=new Dog("a",2,"black");
Cat cat=new Cat("a",3,"grey");
person.keepPet(dog,"骨头");
person1.keepPet(cat,"fish");
}
}