0
点赞
收藏
分享

微信扫一扫

Java4Android自学记录(15):对象的转型


1 目录及资源索引

  Java4Android自学过程目录及资源索引

2 向上转型

2.1 基本概念

  首先了解一个概念,面向对象三个特征:封装、继承、多态。

  什么是向上转型?

  向上转型 —— 将子类的对象赋值给父类的引用;代码示例:

Student s = new Student();  // 定义子类对象
Person p = s; // 向上转型

  参考老师课件,他们的内存分布图如下,可以看到都指向同一块内存地址。

Java4Android自学记录(15):对象的转型_向上转型

  向上转型,老师举了两个生活中很常见的例子:


  1. 所有的笔记本电脑都是电脑。向上转型,转到父类;
  2. 比如张三这个对象,既可以是学生这个类,又可以是人这个类。

  编译没有问题,向上向下,父类在上,子类在下。抽象的在上,具体的在下

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 = "北京";
}
}

  上述代码编译结果如下:

Java4Android自学记录(15):对象的转型_子类_02

  可以看到出错了,提示找不到符号,分析一下原因,发现变量 per ,类型为 Person,而 Person类型中没有这个 address 这个变量。

  语法1:一个引用 能够调用哪些成员(变量和函数),取决于这个引用的类型。

  尝试用父类对象 per 调用子类成员函数 study,发现编译也是会报错误的。

Java4Android自学记录(15):对象的转型_向上转型_03

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

  编译后的运行结果如下:

Java4Android自学记录(15):对象的转型_向下转型_04

  由上图运行结果可以看到,运行的应该是子类的函数。至于为什么是 NULL,因为没有给他赋初值,就是 NULL了。

  语法2:一个引用调用的是哪一个方法,取决于这个引用所指向的对象。

  老师指点:


  1. 要先学会语法,练熟,接下来才能去说怎么用,用在哪。
  2. 向上转型:生成一个子类对象,然后把子类对象赋值给父类的引用。不用生成子类对象也可以。例如:Person p = new Student(); 不需要 先生成子类。
  3. 向上转型是不可能失败的,是一定会成功的。只要继承关系没问题。

3 向下转型

3.1 基本概念

  向下转型——将父类的对象赋值给子类的引用。代码如下:

Student s1 = new Student();   
Person p = s1; // 向上转型
Student s2 = (Student)p; // 向下转型

  内存分布图如下:

Java4Android自学记录(15):对象的转型_子类_05

  向下转型的前提就是,首先进行向上转型。然后再转换回来,后边这个过程就叫做向下转型,前边必须要加上强制类型转换。

  老师描述:先把一个对象向上转型,再把这个对象强制转换,后边这个叫做向下转型。(父类转换为子类)

  老师举的例子:去超市买泡面,泡面是有包装的,我们买回来之后必须要拆开才能吃,那既然这样很麻烦的话,为什么厂家在生产的时候必须要加上包装呢,不加包装不是更好吗?

  老师举的例子很贴切,总结一下就是,先使用向上转型,在使用向下转型,是有用的,不过现在我们还没体会到。

  需要注意的是:直接生成的父类对象是无法转型成为子类对象的。例如:

Person p = new Person();
Student s = (Student)p;

  上述代码是不正确的,必须要现有子类转换为父类的向上转型,然后接下来的才能叫做向下转型。

  对象的向上转型、向下转型,是面向对象多态性的一种体现。

4 总结


  1. 向上向下转型只是知道基本概念,区分的还不是很清楚;要说具体作用,那就更迷了。
  2. 老师举的一些例子真的很贴近生活,通俗易懂;
  3. 向上转型的两个语法还不是很理解,成员方法是成员函数吗?还不确定。如果方法是函数的话,那两个语法之间不就相互矛盾了吗。
  4. 后续深入理解后,在来理清楚思路吧。


举报

相关推荐

0 条评论