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.pswp.cn/news/711818.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711818.shtml
英文地址,請注明出處:http://en.pswp.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;…