java学习笔记4——多态
- java引用类型有两个类型:编译类型和运行类型;编译类型由声明该变量时的类型决定,运行类型由实际赋给该变量的对象决定。
- 向上转型:父类可以指向子类
Base base=new Sub();//父类指向子类对象,Base是编译类型,Sub是运行类型
- 向下转型:编译类型为父类可以向下转型为运行子类
Sub sub=(Sub)base;//base向下转型,强制类型转化,编译类型由Base转为Sub
- 多态下,成员变量从编译类型开始访问
System.out.println(base.a);//输出10;
System.out.println(((Sub)base).a);//输出9;
- 多态下,成员方法若被重写,调用被重写的方法,且不在编译类型下的方法无法调用
base.function1();//调用了Sub的重写方法
((Sub) base).sub_function();//加强制类型转换,否则无法调用子类的特有方法
6.本质类型是运行类型
System.out.println(base.getClass());//输出都是com.test.Sub
System.out.println(((Sub)base).getClass());
全部测试代码如下:
package com.test;
public class Test03 {
public static void main(String[] args) {
Base base=new Sub();//父类指向子类对象,Base是编译类型,Sub是运行类型
System.out.println(base.a);//输出10;
System.out.println(((Sub)base).a);//输出9;
base.function1();//调用了Sub的重写方法
((Sub) base).sub_function();//加强制类型转换,否则无法调用子类的特有方法
System.out.println(base.getClass());//输出都是com.test.Sub
System.out.println(((Sub)base).getClass());
}
}
class Base{//父类Base
public int a=10;//子类a初始化10
public static void f1(){
System.out.println("nihao");
}
public void function1(){
System.out.println("Base的function1调用");//父类的function1
}
}
class Sub extends Base{
public int a=9;//子类a初始化9
@Override
public void function1() {
System.out.println("Sub的function1调用");//子类的function1
}
public void sub_function(){}//子类特有方法
}