重載和重寫的區(qū)別★★★
重載(Overloading)和重寫(Overriding)都是Java中面向對象編程的特性,它們都可以讓子類繼承父類的方法。但是它們之間有一些重要的區(qū)別:
-
定義方式:
- 重載(Overloading):在同一個類中,可以有多個方法名相同但參數(shù)列表不同的方法。當調用一個方法時,編譯器會根據(jù)參數(shù)的數(shù)量、類型和順序來判斷調用哪個方法。
- 重寫(Overriding):在子類中,必須定義與父類同名、參數(shù)類型和返回值類型相同的方法。這樣才能覆蓋掉父類中的方法,使得子類對象調用該方法時執(zhí)行的是子類自己的代碼。
-
訪問權限:
- 重載(Overloading):方法名相同但參數(shù)列表不同,因此它們的訪問權限是一樣的,都是public、protected或private。
- 重寫(Overriding):子類中的方法必須使用super關鍵字來調用父類的方法,這意味著子類中的方法具有比父類中相同的方法更低的訪問權限。
總之,重載和重寫都是Java中多態(tài)性的重要特性,但它們的作用和實現(xiàn)方式有所不同。重載允許在同一類中定義多個同名但參數(shù)不同的方法,而重寫允許子類覆蓋父類的方法并提供自己的實現(xiàn)。
Java的三大特性
Java的三大特性是:
- 面向對象編程(Object-Oriented Programming,OOP):Java是一種純面向對象的編程語言,它支持封裝、繼承和多態(tài)等面向對象的特性。通過封裝,Java可以將數(shù)據(jù)和方法封裝在一起,形成一個類,從而實現(xiàn)對數(shù)據(jù)的保護;通過繼承,Java可以從已有的類中繼承屬性和方法,避免重復編寫代碼;通過多態(tài),Java可以讓不同的對象對同一個消息做出不同的響應,提高了代碼的復用性和靈活性。
- 平臺無關性(Platform Independence):Java程序可以在不同的操作系統(tǒng)上運行,這是因為Java編譯器將Java源代碼編譯成字節(jié)碼(bytecode),然后由Java虛擬機(JVM)將字節(jié)碼解釋執(zhí)行。因此,無論在哪個平臺上安裝了Java虛擬機,都可以運行Java程序。這種平臺無關性使得Java成為一種非常適合開發(fā)跨平臺應用程序的語言。
- 安全性(Security):Java提供了多種安全機制來保護應用程序的安全,包括沙箱安全模型、類加載器、安全管理器等。這些機制可以限制應用程序的訪問權限,防止惡意代碼的執(zhí)行,保證了應用程序的安全性和穩(wěn)定性。同時,Java還提供了加密和數(shù)字簽名等標準安全協(xié)議,使得Java應用程序可以方便地與其他系統(tǒng)進行安全通信。
請說明一下Super關鍵字的作用?
在Java類中使用super來調用父類中的指定操作
-
super可以用來訪問父類中定義的屬性
-
super可以用于調用父類中定義的成員方法
-
super可以同于子類構造器中調用父類的構造器
static關鍵字的作用?
在Java中,static關鍵字有以下幾種作用:
1.修飾類成員變量和方法:
- 修飾類成員變量:被static修飾的成員變量是靜態(tài)變量,它們屬于類而不是對象。靜態(tài)變量可以在類的任何地方訪問,且只有一份實例。例如:
- public static int count = 0;。
- 修飾類成員方法:被static修飾的方法是靜態(tài)方法,它們不依賴于對象而是直接通過類名調用。靜態(tài)方法可以在類的任何地方調用,且沒有this指針。例如:public static void printCount() { System.out.println(count); }。
2.修飾局部變量:
- 被static修飾的局部變量成為靜態(tài)局部變量,它們屬于類而不是對象。靜態(tài)局部變量只能在類的靜態(tài)方法中初始化一次。例如:public static void test() { static int count = 0; count++; System.out.println(“count=” + count); }。
3.表示類和接口的常量:
-
被static修飾的常量是類和接口的常量,它們在整個程序中都是可見的。例如:public static final int MAX_COUNT = 100;。
- 表示線程安全:
-
被static修飾的方法可以保證多線程訪問時的安全性。例如:public static synchronized void printCount() { System.out.println(count); }。
總之,static關鍵字可以用來修飾類、方法、局部變量、常量和線程安全等方面,具有不同的作用和意義。
final關鍵字的作用?
在Java中,final關鍵字有以下幾種作用:
-
修飾類和方法:
- 修飾類:被final修飾的
類不能被繼承
。例如:final class MyClass。 - 修飾方法:被final修飾的方法不能被子類
重寫
。例如:final void myMethod() {}。
- 修飾類:被final修飾的
-
修飾變量:
- 修飾全局變量:被final修飾的全局變量只能在聲明時賦值一次。例如:final int MAX_VALUE = 100;。
- 修飾局部變量:被final修飾的局部變量只能在定義時初始化一次。例如:final int x = 5;。
-
表示常量:
- final修飾的常量是不可修改的,一旦賦值就不能再改變。例如:final int MAX_VALUE = 100;。
-
表示線程安全:
- final修飾的實例方法可以保證多線程訪問時的安全性。例如:final class MyClass { … }。
總之,final關鍵字可以用來修飾類、方法、變量和線程安全等方面,具有不同的作用和意義。
super關鍵字和this關鍵字的作用?
面向對象的三大特性★★★
面向對象編程的三大特性是封裝、繼承和多態(tài)。
- 封裝(Encapsulation):封裝是指將數(shù)據(jù)和方法捆綁在一起,形成一個類,對外部隱藏實現(xiàn)細節(jié),只提供必要的接口給外部使用。通過封裝,可以保護數(shù)據(jù)的安全性和完整性,防止外部程序直接訪問和修改數(shù)據(jù),從而提高程序的可維護性和穩(wěn)定性。
- 繼承(Inheritance):繼承是指子類可以從父類中繼承屬性和方法,避免重復編寫代碼。通過繼承,可以提高代碼的復用性和靈活性,使得程序更加模塊化和可擴展。但是需要注意的是,過度的繼承會導致代碼變得復雜和難以維護。
- 多態(tài)(Polymorphism):多態(tài)是指同一個方法可以根據(jù)不同的參數(shù)類型和數(shù)量表現(xiàn)出不同的行為。通過多態(tài),可以提高代碼的靈活性和可擴展性,使得程序更加通用和易于維護。Java中的多態(tài)主要有兩種形式:方法重載(Method Overloading)和方法重寫(Method Overriding)。
成員變量和局部變量的區(qū)別?
Java能實現(xiàn)多繼承么
Java不支持多繼承,它只支持單繼承。這意味著一個類只能繼承自一個直接父類,而不能同時繼承多個父類。
在Java中,一個類可以實現(xiàn)多個接口。
抽象類(abstract class) 與接口(interface)的區(qū)別?★★★
抽象類和接口都是用來定義類或類的成員的,但它們之間有以下區(qū)別:
1. 實現(xiàn)方式不同:抽象類必須被子類實現(xiàn),而接口可以被多個類實現(xiàn)。
2. 抽象方法和默認方法不同:抽象類中可以定義抽象方法和非抽象方法,而接口只能定義抽象方法。
3. 構造函數(shù)不同:抽象類可以定義構造函數(shù),而接口不能定義構造函數(shù)。
4. final修飾符的使用不同:抽象類中可以定義final修飾符,而接口中的所有方法都不能被final修飾。
5. 繼承限制不同:子類只能繼承一個抽象類,而一個類可以實現(xiàn)多個接口。
總之,抽象類更像是一種“半成品”,它提供了一些基本的實現(xiàn),但還需要子類去完善;而接口則更像是一種規(guī)范,它規(guī)定了一組方法和常量,但并不提供具體的實現(xiàn)。
能詳細解釋一下封裝么?
將類的某些信息隱藏在類內部,不允許外部程序直接訪問,而是通過該類提供的方法來實現(xiàn)對隱藏信息的操作和訪問 成員變量private,提供對應的getXxx()/setXxx()方法
- 封裝可以被認為是一個保**護屏障,**防止該類的代碼和數(shù)據(jù)被外部類定義的代碼隨機訪問。
- 要訪問該類的代碼和數(shù)據(jù),必須通過嚴格的接口控制。
- 封裝最主要的功能在于我們能修改自己的實現(xiàn)代碼,而不用修改那些調用我們代碼的程序片段。
- 適當?shù)姆庋b可以讓程式碼更容易理解與維護,也加強了程式碼的安全性。
程序涉及追求——>高內聚,低耦合
高內聚:類的內部數(shù)組操作細節(jié)自己完成,不允許外部干涉。
低耦合:僅對外暴露少量的方法用于使用。
關于四種權限修飾符的說明:
繼承你了解哪些?
Java中繼承是一種面向對象編程的基本概念,它允許一個類(子類)從另一個類(父類)中繼承屬性和方法。以下是Java中繼承的一些基本知識:
1. 繼承的語法:在Java中,使用extends關鍵字來聲明一個類繼承另一個類。例如:
class Animal {
// 父類中的屬性和方法
}
class Dog extends Animal {
// 子類中的額外屬性和方法
}
2. 子類可以重寫父類的方法:子類可以覆蓋(override)父類中定義的方法,以實現(xiàn)自己的行為。例如:
class Animal {
public void eat() {
System.out.println("Animal is eating");
}
}
class Dog extends Animal {
@Override
public void eat() {
System.out.println("Dog is eating");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); //輸出 "Dog is eating"
}
}
3. 子類可以訪問父類中的公有、受保護和默認(package-private)成員:子類可以訪問其繼承的父類中的公有、受保護和默認(package-private)成員。例如:
class Animal {
public int age;
}
class Dog extends Animal {
public void bark() {
System.out.println("Woof! My age is " + age);
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.age = 3; //可以修改子類的屬性age,但不能修改父類的屬性age
dog.bark(); //輸出 "Woof! My age is 3"
}
}
多態(tài)你了解哪些?
多態(tài)是同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力。
多態(tài)一般分為兩種:重寫式多態(tài)和重載式多態(tài)。
重載式多態(tài),也叫編譯時多態(tài)。也就是說這種多態(tài)再編譯時已經(jīng)確定好了。重載大家都知道,方法名相同而參數(shù)列表不同的一組方法就是重載。在調用這種重載的方法時,通過傳入不同的參數(shù)最后得到不同的結果。
但是這里是有歧義的,有的人覺得不應該把重載也算作多態(tài)。因為很多人對多態(tài)的理解是:程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調用在編程時并不確定,而是在程序運行期間才確定,這種情況叫做多態(tài)。 這個定義中描述的就是我們的第二種多態(tài)—重寫式多態(tài)。
重寫式多態(tài),也叫運行時多態(tài)。這種多態(tài)通過動態(tài)綁定(dynamic binding)技術來實現(xiàn),是指在執(zhí)行期間判斷所引用對象的實際類型,根據(jù)其實際的類型調用其相應的方法。也就是說,只有程序運行起來,你才知道調用的是哪個子類的方法。 這種多態(tài)通過函數(shù)的重寫以及向上轉型來實現(xiàn),我們上面代碼中的例子就是一個完整的重寫式多態(tài)。我們接下來講的所有多態(tài)都是重寫式多態(tài),因為它才是面向對象編程中真正的多態(tài)。
總而言之我的理解:重載式多態(tài),在編碼等過程中,并沒有很好的體現(xiàn)出多態(tài)的優(yōu)勢,但是不得否認也是多態(tài)的一種編寫方式,而給出的重寫式多態(tài)案例中,相比于重載式多態(tài),在編碼思路和代碼量以及聚合度方面都較好的體現(xiàn)出了多態(tài)的優(yōu)勢。
多態(tài)的優(yōu)點文章來源:http://www.zghlxwxcb.cn/news/detail-515171.html
- 消除類型之間的耦合關系
- 可替換性
- 可擴充性
- 接口性
- 靈活性
- 簡化性
多態(tài)存在的三個必要條件文章來源地址http://www.zghlxwxcb.cn/news/detail-515171.html
- 繼承
- 重寫
- 父類引用指向子類對象
public class Test {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 對象調用 show 方法
show(new Dog()); // 以 Dog 對象調用 show 方法
/**
* 上面兩行可以發(fā)現(xiàn),show方法要求傳入的是動物對象,因為貓和狗都繼承了動物類,因此符合規(guī)范,
* 同時體現(xiàn)出多態(tài)的優(yōu)勢:一個形參可以對應多個實參,同時這也是一個重寫式多態(tài)
*/
Animal a = new Cat(); // 向上轉型:通過子類實例化父類
a.eat(); // 調用的是 Cat 的 eat
//a.work();如果運行這一行就會發(fā)現(xiàn),無法調用work方法,因為動物類只有eat一個方法,從而cat失去了特有方法
Cat c = (Cat)a; // 向下轉型:通過父類強制轉化為子類
c.work(); // 調用的是 Cat 的 work
/**
* 上面兩行體現(xiàn)了向下轉型的用處,我們可以知道,對象a目前是一個動物對象,不能執(zhí)行貓或者狗的特有方法
* 但是,如果通過向下轉型,將動物a對象,轉化為一個貓c對象,這樣就可以調用貓的特有方法了
*/
/**
* 得出結論:
* 向上轉型 : 通過子類對象(小范圍)實例化父類對象(大范圍),這種屬于自動轉換
* 向下轉型 : 通過父類對象(大范圍)實例化子類對象(小范圍),這種屬于強制轉換
*/
}
public static void show(Animal a) {
a.eat();
// 類型判斷
if (a instanceof Cat) { // 貓做的事情
Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
//定義一個抽象類
abstract class Animal {
abstract void eat();
}
//下面的每一個類繼承抽象類,重寫接口中的方法
class Cat extends Animal {
public void eat() {
System.out.println("吃魚");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨頭");
}
public void work() {
System.out.println("看家");
}
}
到了這里,關于【Java面試題】Java基礎——面向對象的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!