向上造型:父类引用子类对象,由子类对象转化为父类对象。
一个类可以向上造型的类型有:父类的类型,其实现的接口类型;
格式:
父类类型 对象名 = new 子类类名
接口类型 对象名 = new 类名(接口实现后才可以实现向上造型)
简单例子讲解:
/**
* Person类,父类,用于描述人的共有的属性
* */
*
class Person {
String name; //人的属性,代表人的名字
public Person() {
name = "Person"; //初始化一个值
System.out.println("I'm Person!");
}
//定义sayHi()方法,默认输出HelloWorld
protected void SayHi() {
System.out.println("HelloWorld!");
}
}
Person类代表了人的部分属性(name)和共有行为SayHi()。
下边是子类:
/**
* Student类, 继承了Person类
* */
class Student extends Person {
String className; //班级名
public Student() {
name="student"; //将父类里的name重新赋值
className = "计算机1401班"; //为className赋值
System.out.println("I'm Student");
}
//这里重写了父类的SayHi方法
protected void SayHi() {
System.out.println("stuName=" + name);
System.out.println("stuClassName=" + className);
}
//定义学生专有方法stuTalk()
public void stuTalk() {
System.out.println("I like Java");
}
}
子类里SayHi()方法的访问权限、返回值类型、方法名和父类一样,其是重写了父类中的SayHi()方法。稍后我们来详细说明,先看测试类。
测试类代码如下
public static void main(String[] args) {
Person pstu = new Student();
System.out.println("name="+pstu.name);
pstu.sayHi();
}
输出结果:
I’m Person!
I’m Student
name=student
stuName=student
stuClassName=计算机1401班
执行过程:
在new Student()的时候由于继承关系,先后分别执行了他们的无参构造,输出了I’m Person!和I’m Student。执行Person构造时name被赋值为”person” 。执行Student构造时name被重新赋值为”student”,所以打印了name=student。由于子类重写了父类的方法,于是打印了stuClassName=计算机1401班。这就是向上造型。
总结说:能点出来的看的是对象类型;实现的方法是重写后的方法,看的是对象;
例如:
public static void main(String[] args) {
Person pstu = new Student();
System.out.println("name="+pstu.name);
pstu.sayHi();
//编译出错,父类不能直接调用子类属性和方法
//pstu.className;
//pstu.stuTalk();
}
重写时对访问权限和返回值的说明:
在Java中向上造型的父类被认为是“大”的,所以在向上造型的时候重写父类方法,方法的访问权限一定要大于等于父类,返回值要和父类相同。
一个类型的引用在指向不同的对象是会有不同的表现,就像人既可以是学生还可以是孩子;
Person person1 = new student();
Person person1 = new child();
person1.写作业();
person2.孝敬父母();
同样一个对象造型成不同的类型时,会有不同的工能。
Teacher teacher = new Teacher();
企业顾问 consultant = teacher;
图书作者 author = teacher;
consultant.培训员工();
author.出版图书();
标签:向上,name,pstu,造型,Person,Student,println,父类
From: https://blog.51cto.com/u_16488678/9068860