网站首页 > java教程 正文
面试官:对于 Java 中多态的理解是什么?
题目
面试官:对于 Java 中多态的理解是什么?
推荐解析
1.父类的引用指向子类的对象
子类重写父类的方法:子类可以继承父类的方法,并对其进行重写。当通过父类的引用调用这个方法时,实际执行的是子类重写后的方法。
比如 Person person = new Student Person 是父类 Student ,都有一个工作的方法,student 重写工作方法,比如上学。
class Person {
void work() {
System.out.println("工作");
}
}
class Student extends Person {
@Override
void work() {
System.out.println("上学");
}
}
public class Test {
public static void main(String[] args) {
Person person = new Student();
person.work(); // 输出 "上学"
}
}
2.接口的引用指向实现类的对象
1)List list = new ArrayList();
2)ArrayList list= new ArrayList()
List<String> list1 = new ArrayList<>();
ArrayList<String> list2 = new ArrayList<>();
// list1.trimToSize(); // 编译错误,因为 trimToSize 是 ArrayList 的特有方法
list2.trimToSize(); // 正确,因为 list2 是 ArrayList 类型的变量
在第一种情况下,无法使用 ArrayList 特有的方法,因为声明的是一个 List 类型的变量,只能使用 List 接口中定义的方法。而在第二种情况下,声明了一个 ArrayList 类型的变量,可以使用 ArrayList 特有的方法。
3.方法的重载
方法的重载:方法重载指的是在同一个类中定义多个同名但参数列表不同的方法。在调用这个方法时,编译器会根据参数的类型和数量来确定具体调用哪个方法。
class Test {
void show(int i) {
System.out.println("整型数值: " + i);
}
void show(String s) {
System.out.println("字符串: " + s);
}
void show(int i, String s) {
System.out.println("整型数值: " + i + ", 字符串: " + s);
}
public static void main(String[] args) {
Test test = new Test();
test.show(10); // 输出 "整型数值: 10"
test.show("Hello"); // 输出 "字符串: Hello"
test.show(10, "Hello"); // 输出 "整型数值: 10, 字符串: Hello"
}
}
4.方法重写
4.1 子类中的方法必须与父类中的方法具有相同的名称。
4.2 子类中的方法必须具有相同的参数列表(参数的类型、顺序和数量)。
4.3 子类中的方法的返回类型可以是父类方法返回类型的子类型(也称为协变返回类型)。
4.4 子类中的方法不能缩小父类方法的访问权限(即不能将父类方法的访问权限由 public 改为 private ),不能更加严格,但是可以扩大访问权限。
class Animal {
void eat() {
System.out.println("动物吃食物");
}
}
class Dog extends Animal {
@Override
void eat() {
System.out.println("狗吃骨头");
}
}
public class Test {
public static void main(String[] args) {
Animal animal = new Dog();
animal.eat(); // 输出 "狗吃骨头"
}
}
5.向上转型和向下转型
5.1 向上转型( Upcasting ):将一个子类对象转换为父类类型。这是一个隐式的转型过程,不需要显式地进行类型转换。
5.2 向下转型( Downcasting ):将一个父类对象转换为子类类型。这是一个显式的转型过程,需要使用强制类型转换符进行类型转换。需要注意进行类型检查,避免类型转换异常。
class Animal {
void eat() {
System.out.println("动物吃食物");
}
}
class Dog extends Animal {
void bark() {
System.out.println("狗叫");
}
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
Animal animal = dog; // 向上转型,将 Dog 对象转换为 Animal 类型
animal.eat(); // 输出 "动物吃食物"
Dog anotherDog = (Dog) animal; // 向下转型,将 Animal 对象转换为 Dog 类型
anotherDog.bark(); // 输出 "狗叫"
}
}
其他补充
鱼聪明AI 的回答:
鱼聪明 AI地址:鱼聪明AI
多态是面向对象编程的一个重要概念,它允许我们使用一个接口来表示多种实现。多态的主要目的是让程序员可以针对抽象而不是具体实现来编程,这样的代码会有更好的可扩展性。
多态的基本概念是,同一行为,通过不同的子类,可以体现出来的不同的形态。例如,如果我们有一个 Shape 类和两个子类 Circle 和 Rectangle,我们可以通过一个 Shape 类型的变量来引用 Circle 或 Rectangle 的实例,然后调用它们的 draw 方法。这个 draw 方法在 Circle 类中可能会画一个圆,而在 Rectangle 类中可能会画一个矩形。这就是多态的一个例子。
然而,需要注意的是,类的属性和构造函数不具备多态性。属性被子类继承,但不具备多态性,而构造函数实际上是static方法,所以构造函数不具备多态性。
总的来说,多态允许我们编写更加灵活和可扩展的代码,它可以让我们以一种统一的方式来处理不同的对象,而不需要关心这些对象的具体类型。
知乎回答:
CSDN 某同学:
1)多态成员变量:编译运行看左边
2)多态成员方法:编译看左边,运行看右边
欢迎交流
在阅读本文后,你应该对多态有了一些了解,那么我将会提出三个问题,如果你能完整回答这三个回答的话,在面试中将大概率得到面试官的认可。
1.多态的实现原理是什么?
2.多态在 Java 中的实现方式是什么?
3.多态在框架设计中有什么应用场景?
猜你喜欢
- 2024-09-27 Java多态重载和重写(类方法设计中多态与重载的区别是什么)
- 2024-09-27 什么是多态?Java为什么要用多态?(java中什么是多态性)
- 2024-09-27 别找了!月薪30k的T6大佬整理的Java多态知识点总结,限时收藏
- 2024-09-27 三十一、Java面向对象编程特性-多态
- 2024-09-27 Java多中包括态理解、多态实现、重写、转型和抽象类
- 2024-09-27 Java中的封装、继承和多态,你真的都懂了吗
- 2024-09-27 java基础之多态与向上转型,很用心的一篇笔记
- 2024-09-27 Java多态的介绍-学习日志(java的多态是什么)
- 2024-09-27 Java路径-25-Java多态(java路径错误)
- 2024-09-27 Java中的多态(基础语法)(java多态的定义和应用)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)