1 目录及资源索引
Java4Android自学过程目录及资源索引
2 向上转型
2.1 基本概念
首先了解一个概念,面向对象三个特征:封装、继承、多态。
什么是向上转型?
向上转型 —— 将子类的对象赋值给父类的引用;代码示例:
Student s = new Student(); // 定义子类对象
Person p = s; // 向上转型
参考老师课件,他们的内存分布图如下,可以看到都指向同一块内存地址。
向上转型,老师举了两个生活中很常见的例子:
- 所有的笔记本电脑都是电脑。向上转型,转到父类;
- 比如张三这个对象,既可以是学生这个类,又可以是人这个类。
编译没有问题,向上向下,父类在上,子类在下。抽象的在上,具体的在下
2.2 代码示例
直接用代码来演示,新建一个父类 Person,代码如下:
class Person
{
String name;
int age;
void introduce()
{
System.out.println("我的姓名是" + name + ",我的年龄是" + age);
}
}
新建一个子类 Student,代码如下:
class Student extends Person
{
String address;
void introduce()
{
super.introduce();
System.out.println("我的家在" + address);
}
void study()
{
System.out.println("我正在学习");
}
}
新建一个类,用来写主函数,代码如下:
class Test
{
public static void main(String args[])
{
Student stu = new Student();
Person per = stu; // 向上转型
per.name = "张三";
per.age = 20;
per.address = "北京";
}
}
上述代码编译结果如下:
可以看到出错了,提示找不到符号,分析一下原因,发现变量 per ,类型为 Person,而 Person类型中没有这个 address 这个变量。
语法1:一个引用 能够调用哪些成员(变量和函数),取决于这个引用的类型。
尝试用父类对象 per 调用子类成员函数 study,发现编译也是会报错误的。
2.3 问题1
父类和子类都有这个函数,如果是向上转型,到底调用的是哪个里边的这个函数?
修改主函数中代码,如下:
class Test
{
public static void main(String args[])
{
Student stu = new Student();
Person per = stu; // 向上转型
per.name = "张三";
per.age = 20;
per.introduce();
}
}
编译后的运行结果如下:
由上图运行结果可以看到,运行的应该是子类的函数。至于为什么是 NULL,因为没有给他赋初值,就是 NULL了。
语法2:一个引用调用的是哪一个方法,取决于这个引用所指向的对象。
老师指点:
- 要先学会语法,练熟,接下来才能去说怎么用,用在哪。
- 向上转型:生成一个子类对象,然后把子类对象赋值给父类的引用。不用生成子类对象也可以。例如:Person p = new Student(); 不需要 先生成子类。
- 向上转型是不可能失败的,是一定会成功的。只要继承关系没问题。
3 向下转型
3.1 基本概念
向下转型——将父类的对象赋值给子类的引用。代码如下:
Student s1 = new Student();
Person p = s1; // 向上转型
Student s2 = (Student)p; // 向下转型
内存分布图如下:
向下转型的前提就是,首先进行向上转型。然后再转换回来,后边这个过程就叫做向下转型,前边必须要加上强制类型转换。
老师描述:先把一个对象向上转型,再把这个对象强制转换,后边这个叫做向下转型。(父类转换为子类)
老师举的例子:去超市买泡面,泡面是有包装的,我们买回来之后必须要拆开才能吃,那既然这样很麻烦的话,为什么厂家在生产的时候必须要加上包装呢,不加包装不是更好吗?
老师举的例子很贴切,总结一下就是,先使用向上转型,在使用向下转型,是有用的,不过现在我们还没体会到。
需要注意的是:直接生成的父类对象是无法转型成为子类对象的。例如:
Person p = new Person();
Student s = (Student)p;
上述代码是不正确的,必须要现有子类转换为父类的向上转型,然后接下来的才能叫做向下转型。
对象的向上转型、向下转型,是面向对象多态性的一种体现。
4 总结
- 向上向下转型只是知道基本概念,区分的还不是很清楚;要说具体作用,那就更迷了。
- 老师举的一些例子真的很贴近生活,通俗易懂;
- 向上转型的两个语法还不是很理解,成员方法是成员函数吗?还不确定。如果方法是函数的话,那两个语法之间不就相互矛盾了吗。
- 后续深入理解后,在来理清楚思路吧。