(10)Java中内存示意图(其二)

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;
    }
}


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方法。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值