首页 > 分享 > Java多态与隐藏覆盖

Java多态与隐藏覆盖

1、编译时类型和运行时类型

Java的引用变量有两个类型,一个是编译时类型,一个是运行时类型

编译时类型:由声明该变量时使用的类型决定

运行时类型:由该变量指向的对象类型决定

如果编译时类型和运行时类型不一致,会出现所谓的多态。因为子类其实是一种特殊的父类,因此java允许把一个子类对象直接赋值给一个父类引用变量,无须任何类型转换,或者被称为向上转型,由系统自动完成。

如 Father  f  =  new  Son();  Son是Father的子类

引用变量f就会出现编译时类型和运行时类型不一致的情况 编译时是Father类型的 运行时是Son类型的

当变量的编译时类型和运行时类型不一致时,通过变量访问它所引用的对象的实例时,该实例变量的值由声明该变量的类型决定。

通过变量访问它所引用的对象的方法时,该方法的行为由所引用的对象实际类型所决定。

2、隐藏和覆盖

覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同。

覆盖是对于实例方法而言的

方法不能交叉覆盖:子类实例方法不能覆盖父类的静态方法;

                  子类的静态方法也不能覆盖父类的实例方法(编译时报错)

隐藏:父类和子类拥有相同名字的属性或者方法( 方法隐藏只有一种形式,就是父类和子类存在相同的静态方法)时,父类的同名的属性或者方法形式上不见了,实际是还是存在的。

隐藏是对于静态方法和成员变量(静态变量和实例变量)而言的

(1)当发生隐藏的时候,声明类型是什么类,就调用对应类的属性或者方法,而不会发生动态绑定

  (2) 属性只能被隐藏,不能被覆盖

 (3)变量可以交叉隐藏:子类实例变量/静态变量可以隐藏父类的实例/静态变量

3、隐藏和覆盖的区别

(1)被隐藏的属性,在子类被强制转换成父类后,访问的是父类中的属性

  在无强制转换时子类要访问父类的属性使用super关键字

(2)被覆盖的方法,在子类被强制转换成父类后,调用的还是子类自身的方法

     子类要是想访问父类的方法,可以使用super关键字

RTTI(run time type identification,运行时类型检查)

RTTI只针对覆盖,不针对隐藏:因为覆盖是动态绑定,是受RTTI约束的,隐藏不受RTTI约束

运行时类型为引用变量所指向的对象的类型,编译时类型是引用变量自身的类型

4、常见的笔试面试题

public class Test {

public static void main(String[] args) {

Circle circle = new Circle();

Shape shape = new Circle();

System.out.println(circle.name);

circle.printType();

circle.printName();

System.out.println(shape.name);

shape.printType();

shape.printName();

}

}

class Shape {

public String name = "shape";

public Shape(){

System.out.println("shape constructor");

}

public void printType() {

System.out.println("this is shape");

}

public static void printName() {

System.out.println("shape");

}

}

class Circle extends Shape {

public String name = "circle";

public Circle() {

System.out.println("circle constructor");

}

public void printType() {

System.out.println("this is circle");

}

public static void printName() {

System.out.println("circle");

}

}

运行结果:

shape constructor

circle constructor

circle

this is circle

circle

shape

this is circle

shape


相关知识

Java编程,揭秘那些鲜为人知的“花指令”:效率提升还是隐藏风险?
C++中重载、重写(覆盖)的区别实例分析
花中珍品——优雅多态山茶花,花型秀美多态,气味芬芳袭人
网上鲜花订购系统(鲜花管理、用户留言版)
Java的代码书写规范
java如何调用支付接口测试
《JAVA语言程序设计》期末考试试题及答案
Java程序设计在线作业解析
【JAVA】Java基础—面向对象编程:类与对象
Java十大经典案例源码解析与实战应用

网址: Java多态与隐藏覆盖 https://m.huajiangbk.com/newsview1239061.html

所属分类:花卉
上一篇: 覆盖处理对滇牡丹嫁接成活率的影响
下一篇: 美过蝴蝶的角堇花,现在正适合播种