Java必须掌握的继承的特点和继承体系的设计(含面试大厂题和源码)

Java继承是面向对象编程的一个基本特性,它允许一个类继承另一个类的属性和方法。设计良好的继承体系是高质量软件开发的关键。在大厂面试中,面试官可能会询问关于Java继承特点及如何设计一个合理的继承体系的问题,以评估你的面向对象设计能力和对Java语言特性的理解。以下是关于Java继承特点和继承体系设计的面试题,包含问题描述和解答要点。

Java继承的特点

面试题:描述Java继承的特点,并说明为什么这些特点在软件开发中是有益的。

解答要点

  1. 单继承:Java类只能直接继承一个父类,这简化了继承体系,减少了复杂性,并避免了多继承带来的歧义和复杂性。

  2. 多层继承:虽然Java只支持单继承,但允许多层继承,形成一个继承树。这意味着一个类可以继承另一个类,而那个类又继承自另一个类,依此类推。

  3. 方法重写:子类可以重写继承自父类的方法,提供特定的实现。这是多态性的基础,允许在运行时根据对象的实际类型调用相应的方法。

  4. 访问控制和封装:通过访问修饰符(private、protected和public),类可以控制其成员变量和方法的访问级别,这有助于封装和隐藏实现细节。

  5. 构造器不被继承:子类不能继承父类的构造器,但子类的构造器可以通过super关键字调用父类的构造器,确保父类属性被正确初始化。

  6. 使用final防止继承:使用final关键字可以防止类被继承或方法被重写,这对于创建不可变类或方法是有用的。

继承体系的设计

面试题:设计一个继承体系示例,并解释设计中考虑的面向对象原则。

解答要点

  • 示例设计:设计一个交通工具继承体系。Vehicle作为基类,具有基本属性如speedcapacity,以及方法display()CarTruck继承自Vehicle,添加特有属性和方法,如Car可能有airConditioner属性,而TruckloadCapacity属性。

  • 面向对象原则

    1. 封装:通过将数据(属性)和行为(方法)封装在类中,并使用访问修饰符控制访问级别,保护了对象的状态和实现细节。

    2. 继承:利用继承共享和重用代码,同时通过方法重写实现行为的定制化。

    3. 多态:通过继承和方法重写,同一个方法调用可以表现出不同的行为,具体行为取决于对象的实际类型。

    4. 开闭原则(Open/Closed Principle):系统应该对扩展开放,对修改关闭。在继承体系中,可以通过添加新的子类来扩展系统功能,而不需要修改现有的代码。

    5. 里氏替换原则(Liskov Substitution Principle):子类对象应该能够替换其父类对象被使用,而不影响程序的正确性。这要求子类遵守父类的行为契约。

  • 设计考虑:在设计继承体系时,重要的是识别共同特性和行为,将它们定义在父类中。同时,应该注意避免过度使用继承,因为这可能会导致设计过于复杂,难以维护。组合和接口往往是更灵活、更适合的选择。

通过这些面试题和解答要点,你可以展示你对Java继承特点和设计原则的深入理解,以及你在面向对象设计方面的能力。这些都是大厂面试官在候选人中寻找的关键技能。
题目1:动物类继承体系设计
请设计一个动物类继承体系,包含一个基类Animal,以及两个子类:Dog和Cat。Animal类包含name和age属性,以及一个makeSound方法。Dog和Cat类分别重写makeSound方法,输出对应的叫声。

class Animal {protected String name;protected int age;public Animal(String name, int age) {this.name = name;this.age = age;}public void makeSound() {System.out.println("Animal makes a sound");}
}
class Dog extends Animal {public Dog(String name, int age) {super(name, age);}@Overridepublic void makeSound() {System.out.println("Dog says: Bow Wow");}
}
class Cat extends Animal {public Cat(String name, int age) {super(name, age);}@Overridepublic void makeSound() {System.out.println("Cat says: Meow");}
}
public class Main {public static void main(String[] args) {Animal myAnimal = new Animal("Generic Animal", 1);Animal myDog = new Dog("Tommy", 5);Animal myCat = new Cat("Kitty", 3);myAnimal.makeSound();myDog.makeSound();myCat.makeSound();}
}

题目2:形状类继承体系设计
请设计一个形状类继承体系,包含一个基类Shape,以及三个子类:Circle、Rectangle和Triangle。Shape类包含一个area方法,用于计算面积。Circle、Rectangle和Triangle类分别重写area方法,计算对应形状的面积。

class Shape {public double area() {return 0;}
}
class Circle extends Shape {private double radius;public Circle(double radius) {this.radius = radius;}@Overridepublic double area() {return Math.PI * radius * radius;}
}
class Rectangle extends Shape {private double width;private double height;public Rectangle(double width, double height) {this.width = width;this.height = height;}@Overridepublic double area() {return width * height;}
}
class Triangle extends Shape {private double base;private double height;public Triangle(double base, double height) {this.base = base;this.height = height;}@Overridepublic double area() {return 0.5 * base * height;}
}
public class Main {public static void main(String[] args) {Shape myCircle = new Circle(5);Shape myRectangle = new Rectangle(4, 5);Shape myTriangle = new Triangle(3, 4);System.out.println("Area of Circle: " + myCircle.area());System.out.println("Area of Rectangle: " + myRectangle.area());System.out.println("Area of Triangle: " + myTriangle.area());}
}

题目3:交通工具类继承体系设计
请设计一个交通工具类继承体系,包含一个基类Vehicle,以及三个子类:Car、Bike和Plane。Vehicle类包含一个move方法,用于描述交通工具的移动方式。Car、Bike和Plane类分别重写move方法,描述对应交通工具的移动方式。

class Vehicle {public void move() {System.out.println("This vehicle moves on the ground");}
}
class Car extends Vehicle {@Overridepublic void move() {System.out.println("Car moves on four wheels");}
}
class Bike extends Vehicle {@Overridepublic void move() {System.out.println("Bike moves on two wheels");}
}
class Plane extends Vehicle {@Overridepublic void move() {System.out.println("Plane moves in the air");}
}
public class Main {public static void main(String[] args) {Vehicle myCar = new Car();Vehicle myBike = new Bike();Vehicle myPlane = new Plane();myCar.move();myBike.move();myPlane.move();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/711818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ICLR 2024|ReLU激活函数的反击,稀疏性仍然是提升LLM效率的利器

论文题目: ReLU Strikes Back: Exploiting Activation Sparsity in Large Language Models 论文链接: https://arxiv.org/abs/2310.04564 参数规模超过十亿(1B)的大型语言模型(LLM)已经彻底改变了现阶段人工…

gcc和g++的区别,如何看自己的编译器支持的C++的版本

gcc和g的区别 用一句话来说,就是gcc将程序视为c语言的,g将程序视为C的 gcc和g的区别主要在于它们处理不同后缀的文件类型、编译和连接阶段的不同调用方式,以及它们对C特性的支持方式。以下是详细介绍:123 文件类型。gcc将后缀为…

通过多线程并发方式实现服务器

与多进程实现对比来看。 示例来源于网络视频 #include <stdio.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> #include <ctype.h> #include <unistd.h> #include <fcntl.h>#include "wrap.h"#de…

【C++ 测试】

C 测试 一、二维数组二、私有成员三、function用法四、类里面创建另一个类五、lambda六、Map动态申请 一、二维数组 #include <iostream> #include<windows.h> #include <map> // SetConsoleOutputCP ( CP_UTF8 ) ; using namespace std;void test1() {map…

求最短路径之迪杰斯特拉算法

对fill用法的介绍 1.用邻接矩阵实现 const int maxn100; const int INF100000000;//无穷大&#xff0c;用来初始化边 int G[maxn][maxn];//用邻接矩阵存储图的信息 int isin[maxn]{false};//记录是否已被访问 int minDis[maxn];//记录到顶点的最小距离void Dijkstra(int s,in…

网格图的搜索

来自灵神网格图题单。 1. 网格图 1.1. LC 200 岛屿数量 这题我一开始想繁了&#xff0c;想维护并查集&#xff0c;然后看等价类个数。其实完全没有必要。因为连通分量深搜到头就可以直接给答案计数1。利用vis数组维护访问过的点&#xff0c;然后碰到新连通分量重新深搜即可。…

Pinia使用

官方地址&#xff1a;Pinia | The intuitive store for Vue.js (vuejs.org)https://pinia.vuejs.org/ 1.安装 npm install pinia npm install pinia-plugin-persistedstate Pinia是一个基于Vue 3的状态管理库&#xff0c;它使得管理Vue的全局状态变得更加容易和直观。 而…

自定义el-dialog的样式

实现效果&#xff1a; 样式代码如下&#xff1a;&#xff08;可以写在common.scss文件夹中&#xff09; .el-dialog__header {padding: 16px 20px;border-bottom: 1px solid #DCDFE6;display: flex;align-items: center;.el-dialog__title {font-size: 16px;position: relativ…

utniy urp shinyssrr插件使用

文章目录 前言步骤1首先在URP的配置文件里添加SSR后处理2 修改RenderingPath为延迟渲染3 启用深度纹理4 为物体添加脚本 插件下载 前言 用来实现屏幕空间反射效果 unity 版本为2021.3.8LTS&#xff0c;低版本的untiy URP的参数设置位置z可能会不同 步骤 1首先在URP的配置文件…

记录阿里云换源失败的惨痛教训

声明 首先我不是一个云服务器小白&#xff0c;但是之前一直在使用腾讯云和火山引擎的云服务器。从未见过阿里云这样如此**的运营商。 问题 服务器到手&#xff0c;第一步在我进行sudo apt update的时候&#xff0c;也就是更新软件包的时候&#xff0c;我发现&#xff0c;一直…

1028. 从先序遍历还原二叉树(三种方法:栈+递归+集合)

文章目录 1028. 从先序遍历还原二叉树&#xff08;三种方法&#xff1a;栈递归集合&#xff09;一、栈 while迭代1.思路2.代码 二、递归法1.思路2.代码 三、集合存储1.思路2.代码 1028. 从先序遍历还原二叉树&#xff08;三种方法&#xff1a;栈递归集合&#xff09; 一、栈 wh…

hive报错:FAILED: NullPointerException null

发现问题 起因是我虚拟机的hive不管执行什么命令都报空指针异常的错误 我也在网上找了很多相关问题的资料&#xff0c;发现都不是我这个问题的解决方法&#xff0c;后来在hive官网上与hive 3.1.3版本相匹配的hadoop版本是3.x的版本&#xff0c;而我的hadoop版本还是2.7.2的版本…

HTTPS的加密过程

文章目录 前言一、为什么需要加密&#xff1f;二、只用对称加密可以吗&#xff1f;三、只使用非对称加密四、双方都使用非对称加密五、使用非对称加密对称加密六、引入证书1.如何放防止数字证书被篡改&#xff1f;2.中间人有可能篡改该证书吗&#xff1f;3.中间人有可能掉包该证…

开窗函数rank() over,dense_rank() over,row_number() over的区别

1.rank() over 查询出指定的条件进行排名&#xff0c;条件相同排名相同的话&#xff0c;排名之间是不连续的 例如排名如 1 2 3 3 5 6 7 等&#xff0c;相同的排名会自动跳过 2.dense_rank() over 查询出指定的条件后进行排名&#xff0c;条件相同&#xff0c;排名相同的话&…

【YOLO系列】YOLOv9论文超详细解读(翻译 +学习笔记)

前言 时隔一年&#xff0c;YOLOv8还没捂热&#xff0c;YOLO系列最新版本——YOLOv9 终于闪亮登场&#xff01; YOLOv9的一作和v7一样。v4也有他。 他于2017年获得台湾省National Central University计算机科学与信息工程博士学位&#xff0c;现在就职于该省Academia Sinica的…

【大数据】Flink SQL 语法篇(六):Temporal Join

《Flink SQL 语法篇》系列&#xff0c;共包含以下 10 篇文章&#xff1a; Flink SQL 语法篇&#xff08;一&#xff09;&#xff1a;CREATEFlink SQL 语法篇&#xff08;二&#xff09;&#xff1a;WITH、SELECT & WHERE、SELECT DISTINCTFlink SQL 语法篇&#xff08;三&…

机器视觉——硬件选型

1、相机选型 在选择机器视觉相机时&#xff0c;通常需要考虑以下几个方面&#xff1a; 1、分辨率&#xff1a;相机的分辨率决定了其拍摄图像的清晰度和细节程度。根据具体的应用需求&#xff0c;可以选择适当的分辨率范围。 2、帧率&#xff1a;帧率表示相机每秒钟能够拍摄的…

2023年营养保健品线上电商市场行业分析(2024年营养保健行业未来趋势分析)

近年来&#xff0c;受人口老龄化、养生年轻化等因素驱动&#xff0c;保健品行业增长强劲&#xff0c;加之越来越多的年轻人也加入养生大军&#xff0c;成为保健品市场上的一股新力量&#xff0c;进一步带动市场扩容。 鲸参谋数据显示&#xff0c;2023年度&#xff0c;京东平台…

[pdf]《软件方法》2024版部分公开-共196页

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 潘加宇《软件方法》2024版部分公开pdf文件&#xff0c;共196页&#xff0c;已上传CSDN资源。 也可到以下地址下载&#xff1a; http://www.umlchina.com/url/softmeth2024.html 如果…

Ubuntu20.04 ssh终端登录后未自动执行.bashrc

sudo vim ~/.profile输入以下内容 if [ -n "$BASH_VERSION" ]; then if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi fi 执行 source ~/.profile重新测试 其他答案 如果你的~/.bashrc文件在Ubuntu中没有自动生效&#xff0c;…