//生物
class Creator {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Creator() {
age = 1;
System.out.println("this is Creator's constructor");
}
}
//动物类
class Animal extends Creator {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Animal() {
name="Animal";
System.out.println("this is Animal's constructor");
}
}
//狗
class Dog extends Animal {
private String hostName;
public String getHostName() {
return hostName;
}
public void setHostName(String hostName) {
this.hostName = hostName;
}
public Dog() {
hostName="Dog";
System.out.println("this is Dog's constructor");
}
}
public class Demo{
public static void main(String[] args) {
Creator c = new Dog();
Animal a = (Animal)c;
Dog d = (Dog)c;
System.out.println(" age:" + c.getAge()+",name:" +
a.getName()+",HostName:" + d.getHostName());
}
}
控制台打印
this is Creator's constructor
this is Animal's constructor
this is Dog's constructor
age:1,name:Animal,HostName:Dog
其实在Creator c = new Dog();执行的时候就会把Animal和Dog信息存储在Creator中只是类型不一致无法获取,它们在JVM是如何执行的?这样设计是否合理,会不会造成空间浪费?
当我们用一个类型的构造器构造出一个对象时,这个对象的类型就已经确定的,也就说它的本质是不会再发生变化了。示例代码其实是使用Creator类型的引用,指向的是Dog对象。在Java中我们可以通过继承、向上转型的关系使用父类类型来引用它,这个时候我们是使用功能较弱的类型引用功能较强的对象,这是可行的。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。