多态性的总结回顾,以及引入instanceof

本文围绕Java展开,介绍了对象多态性,指出其适用于方法、不适用于属性,还讲解了虚拟方法调用。阐述了重写规则、super的使用,重点介绍了instanceof关键字,它用于解决多态下调用子类特有属性和方法的问题,强转可能有风险,引入该关键字可避免。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对象的多态性只适用于方法,不适用于属性(编译运行都看左边).
3.多态的使用称为虚拟方法调用
子类方法重写的时候,父类称为虚拟方法,编译调用虚拟方法。

方法可以重写,属性不重写。如果父类和子类拥有同名属性,则调用改子类的时候实际有两个同名变量,可以通过this和super来区别。

1.什么是多态性

2.什么是虚拟方法调用

3.一个类可以有几个父类,一个父类可以有多少个子类,
子类能获取直接父类的父类中的结构吗,子类能否获取父类中private权限的属性或方法
(可以,写get,set方法)

重写
方法名形参列表一样,子类权限必须比父类大,父类是private子类不能继承,void void ,
父类是引用数据类 子类必须是继承类的引用数据类,父类是基本数据类,子类也是一样的基本数据类。
super
调用属性方法构造器
super调用构造器
this形参列表调用本类重载的构造器,
super形参列表调用父类重载的构造器。

instanceof

有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法,但由于变量声明为父类类型,
导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。

如何调用子类特有的属性和方法?
强制类型转换
Man子 m1=(Man)P2父;向下转型
强转有风险。使用强转时可能出现ClassCastException 异常

所以引入一个关键字instanceof;

问题:我强转之后还能使用父类的特有的方法吗。
可以

格式

if(A instanceof a){
	子类 B = 子类 A
}

如过上面能通过那么

if(A instanceof a的父类){
	sout"这也能通过"
}

强转一般用于不满足于父类仅有的多态性,想要使用子类特有的方法时。

<think>好的,我现在要帮用户解答关于Java泛型在面试中的常见问题和知识点。首先,我需要回顾用户提供的引用内容,特别是引用[1]、[2]、[3]、[4],这些引用中提到了泛型的基本概念、类型擦除、通配符、泛型方法、泛型类、以及一些常见面试题。用户的需求是了解面试中常见的泛型问题和相关知识点,所以需要把这些内容整理得清晰易懂,结构分明。 首先,我应该从最基础的问题开始,比如什么是泛型,使用泛型的好处是什么。根据引用[2]和[3],泛型提供了类型安全,避免了类型转换,同时提高了代码的可读性和重用性。这里需要强调类型擦除,因为这是Java泛型的实现机制,可能在面试中被深入提问。 接下来,用户可能想知道如何编写泛型方法和类。引用[4]中的示例代码展示了泛型类Box<T>和泛型方法printArray,这可以作为具体例子来说明。需要解释泛型方法的定义方式,比如使用<E>在方法返回类型之前。 然后是关于通配符的问题,包括限定通配符(如<? extends T>和<? super T>)和非限定通配符<?>。根据引用[2],PECS原则(Producer Extends, Consumer Super)需要解释清楚,并举例子说明何时使用extends和super。 另外,数组中使用泛型的问题,引用[2]提到数组不能使用泛型,因为类型擦除会导致运行时类型信息丢失,而数组需要知道具体的类型信息。这一点需要明确说明,可能涉及到为什么List可以而数组不行。 类型擦除是另一个重点,引用[3]提到泛型在编译时被擦除,运行时无法获取类型参数的信息。需要解释类型擦除带来的限制,比如不能进行instanceof检查,以及如何影响重载方法。 还有关于List<String>和原始类型List的区别,引用[2]和[3]都提到了类型安全的问题,原始类型不会进行类型检查,而泛型类型在编译时检查。需要强调类型安全的重要性,以及如何避免ClassCastException。 可能还需要提到泛型的一些限制,比如不能使用基本类型作为类型参数,必须使用包装类。引用[2]中的问题14提到了这一点,所以需要解释原因,即泛型在编译后变为Object,而基本类型无法继承Object。 此外,静态上下文中使用泛型的限制,比如静态变量不能引用泛型类型参数,因为类型参数属于实例级别,而静态成员属于类级别。这点在引用[2]的问题16中提到,需要举例说明。 还有关于泛型在继承中的表现,比如List<String>并不是List<Object>的子类型,这可能导致一些常见的错误理解,需要澄清。同时,通配符的使用可以增加灵活性,比如List<? extends Number>可以接受List<Integer>或List<Double>。 最后,需要整理相关问题,确保覆盖用户可能关心的其他方面,比如类型擦除的细节、通配符的应用场景、泛型与数组的对比、以及实际编程中的注意事项。 在组织内容时,要保持结构清晰,分点回答,每个问题先解释概念,再给出示例或应用场景,必要时引用提供的资料中的例子。同时,语言要简洁明了,符合面试准备的实用性,帮助用户快速掌握重点。</think>### Java泛型面试核心知识点解析 #### 一、泛型基础概念 1. **什么是泛型?** 泛型是JDK5引入的**类型参数化机制**,允许在类、接口、方法中使用类型参数(如`List<T>`)。通过泛型,编译器可在编译时检查类型安全性,避免运行时的`ClassCastException`[^3]。 2. **泛型的好处** - **类型安全**:编译时检测类型错误,如`List<String>`只能添加字符串[^2] - **消除强制转换**:如从集合中获取元素时无需显式转换 - **代码复用**:同一套逻辑可处理多种数据类型(如泛型方法`printArray`)[^4] #### 二、泛型实现机制 1. **类型擦除** 泛型信息在编译后被擦除,运行时仅保留原始类型。例如`List<String>`和`List<Integer>`在JVM中均为`List`[^3]。 ```java // 编译前 List<String> list = new ArrayList<>(); // 编译后 List list = new ArrayList(); ``` 2. **桥方法(Bridge Method)** 用于解决泛型类型擦除后多态性冲突的问题。例如子类重写父类泛型方法时,编译器会生成桥方法保证类型正确性。 #### 三、核心语法与应用 1. **泛型类与泛型方法** - **泛型类**:通过类型参数定义类(如`Box<T>`)[^4] - **泛型方法**:在方法返回值前声明类型参数(如`<E> void printArray(E[] array)`)[^4] 2. **通配符与边界** - **`<?>`(非限定通配符)**:表示未知类型,如`List<?>`可接受任何泛型类型的List[^2] - **`<? extends T>`(上界通配符)**:接受T或其子类,遵循**PECS原则(Producer Extends)** - **`<? super T>`(下界通配符)**:接受T或其父类,遵循**PECS原则(Consumer Super)** ```java // 示例:使用上界通配符读取数据 void process(List<? extends Number> list) { Number num = list.get(0); // 安全读取 } ``` #### 四、常见面试问题解析 1. **为什么数组不能使用泛型?** 数组需要明确的类型信息(如`new Integer[10]`),而泛型在运行时被擦除,导致无法保证类型安全[^2]。 2. **`List<String>`与原始类型`List`的区别?** - `List<String>`:编译时检查元素类型,插入非String对象会报错 - `List`:绕过类型检查,可能引发运行时异常[^3] 3. **如何编写泛型方法?** ```java public static <T> T getFirst(List<T> list) { return list.get(0); } ``` 4. **泛型类型擦除导致的问题** - **无法使用`instanceof`检查泛型类型**:如`if (list instanceof List<String>)`会编译报错 - **无法重载参数类型为泛型的方法**:如`void method(List<String> list)`和`void method(List<Integer> list)`会被擦除为相同签名[^3] #### 五、实际应用场景 1. **集合框架**:如`ArrayList<E>`、`HashMap<K,V>` 2. **通用工具类**:如`Collections.sort()`通过泛型支持多种数据类型 3. **设计模式**:工厂模式、策略模式中通过泛型解耦逻辑与类型[^1] #### 六、注意事项与限制 1. **基本类型不可用**:泛型类型参数必须是包装类(如`List<Integer>`而非`List<int>`)[^2] 2. **静态上下文限制**:静态变量不能引用泛型类型参数(如`class Box<T> { static T t; }`非法) 3. **类型擦除的影响**:无法在运行时获取泛型信息(如通过反射获取`T`的实际类型) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值