1、对象转型(casting)
在这里复习下这个概念:
(1)一个基类的引用类型变量可以指向其子类的对象。例:Animal a = new Cat();
(2)一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)。比如:Cat继承Animal后增加furColor属性,Animal对象是不能访问该属性的。
(3)可以使用引用变量 instanceof 类名 来判断该引用型变量所“指向”的对象是否属于该类或该类的子类。
(4)子类的对象可以当作基类的对象来使用称作向上转型(upcasting,即父类对象引用指向子类对象),反之称为向下转型(downcasting)。
可以参照下面的例子,理解上面几句话。理解之后画出内存图!
例:
package com.review02.memory;
public class Casting {
public static void main(String[] args) {
Animal animal = new Animal("aname");
Dog dog = new Dog("dogname","black");
System.out.println(animal instanceof Animal); //true
System.out.println(dog instanceof Animal); //true
System.out.println(animal instanceof Dog); //false
animal = new Dog("Dahuang","yellow");
System.out.println(animal.name); //Dahuang
//System.out.println(animal.furColor);//这句话是错的,animal无法访问其子类Dog的新增属性furColor
System.out.println(animal instanceof Animal); //true
System.out.println(animal instanceof Dog); //true
Dog dog1 = (Dog)animal; //加强制转换符
System.out.println(dog1.furColor); //yellow
}
}
class Animal{
public String name;
Animal(String name) {
this.name = name;
}
}
class Dog extends Animal { //Dog类继承Animal类
public String furColor;
Dog(String name,String furColor) {
super(name);
this.furColor = furColor;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/468c2466751d5395dd0e10173d00cb1c.png)
2.动态绑定和多态
动态绑定和多态是一个意思,他们是指“在执行期间(而非编译期间)判断所引用对象的实际类型,根据其实际类型调用相应的方法“
多态的三个必要条件: 《1》有继承 《2》有方法重写 《3》有父类引用指向子类对象
例:
package com.review02.memory;
public class TestPolymoph {
public static void main(String[] args) {
Pig pig = new Pig("PinkPig","pink");
Fish fish = new Fish("Huahua","tiny");
Lady lady1 = new Lady("July",pig);
Lady lady2 = new Lady("Merry",fish);
lady1.myPetEnjoy();
lady2.myPetEnjoy();
}
}
class Pet{
private String name;
Pet(String name) {
this.name = name;
}
public void enjoy() {
System.out.println("小宠物在玩耍");
}
}
class Pig extends Pet {
private String color;
Pig(String name,String color) {
super(name);
this.color = color;
}
@Override
public void enjoy() {
System.out.println("猪在憨憨大睡");
}
}
class Fish extends Pet {
private String size;
Fish(String name,String size) {
super(name);
this.size = size;
}
@Override
public void enjoy() {
System.out.println("鱼在跳舞");
}
}
class Lady {
private String name;
private Pet pet;
Lady(String name, Pet pet) {
this.name = name;
this.pet = pet;
}
public void myPetEnjoy() {
pet.enjoy();
}
}
运行后控制台打印结果:
内存示意图:
从上图可以看出:根据lady对象的成员变量pet所引用的不同的实际类型而调用相应的enjoy方法。