java子類的子類
❶ java的單繼承中允許一個父類有多個子類嗎
java中對於繼承,java只支持單繼承。java雖然不直接支持多繼承,但是保留了這種多繼承機制,進行改良。
單繼承:一個類只能有一個父類。
多繼承:一個類可以有多個父類。
為什麼不支持多繼承呢?
因為當一個類同時繼承兩個父類時,兩個父類中有相同的功能,那麼子類對象調用該功能時,運行哪一個呢?因為父類中的方法中存在方法體。
但是java支持多重繼承。A繼承BB繼承CC繼承D。
多重繼承的出現,就有了繼承體系。體系中的頂層父類是通過不斷向上抽取而來的。它裡面定義的該體系最基本最共性內容的功能。
所以,一個體系要想被使用,直接查閱該系統中的父類的功能即可知道該體系的基本用法。那麼想要使用一個體系時,需要建立對象。建議建立最子類對象,因為最子類不僅可以使用父類中的功能。還可以使用子類特有的一些功能。
簡單說:對於一個繼承體系的使用,查閱頂層父類中的內容,創建最底層子類的對象。
子父類出現後,類中的成員都有了哪些特點:
1:成員變數。
當子父類中出現一樣的屬性時,子類類型的對象,調用該屬性,值是子類的屬性值。
如果想要調用父類中的屬性值,需要使用一個關鍵字:super
This:代表是本類類型的對象引用。
Super:代表是子類所屬的父類中的內存空間引用。
注意:子父類中通常是不會出現同名成員變數的,因為父類中只要定義了,子類就不用在定義了,直接繼承過來用就可以了。
❷ java 小問題 子類的子類是父類的子類還是間接子類
你應該這樣去理解 「所有「 的 Exception 類。
在 java 中 java.lang.Exception 是 java.lang.Throwable 的子類,而 java.lang.RuntimeException 也是 java.lang.Throwable 的子類。
因此,如果有一段代碼,不管是會發生 Exception 還是 RuntimeException ,而你想一次性捕獲所有錯誤的時候,這樣寫:
publicstaticvoidmain(String[]args){
System.out.println("----------測試輸出1----------");
try{
Strings=null;
//註:這一個會拋出NullPointException,即RuntimeException的子類。
s=s.substring(0);
}catch(Throwableex){
ex.printStackTrace();
}
System.out.println("----------測試輸出2----------");
try{
Strings="123";
//註:這一個會拋出IndexOutOfBoundsException,即RuntimeException的子類。
inti=s.indexOf(200);
}catch(Throwableex){
ex.printStackTrace();
}
System.out.println("----------測試輸出3----------");
}
你在上面的代碼裡面可以看到,即使是發生了 RuntimeException ,但是使用了 Throwable 也可以捕獲到,而且你不用關心具體是什麼原因出錯了,只要有錯誤,用 Throwable 都可捕獲到。
如果不使用 Throwable ,又是一個什麼情況呢,這個時候,你就需要在程序中針對某一個 Exception 或 RuntimeException 來寫 catch 了:
publicstaticvoidmain(String[]args){
System.out.println("----------測試輸出4----------");
try{
Strings=null;
//註:這一個會拋出NullPointException,即RuntimeException的子類。
s=s.substring(0);
}catch(NullPointExceptionex){
ex.printStackTrace();
}
System.out.println("----------測試輸出5----------");
try{
Strings="123";
//註:這一個會拋出IndexOutOfBoundsException,即RuntimeException的子類。
inti=s.indexOf(200);
}catch(IndexOutOfBoundsExceptionex){
ex.printStackTrace();
}
System.out.println("----------測試輸出6----------");
}
但是,其實所有 RuntimeException 及其子類都不需要在程序中顯式調用的,如果不進行顯式調用,則表明你不需要理會錯誤,當有任何錯誤發生時,讓程序自動終止:
publicstaticvoidmain(String[]args){
System.out.println("----------測試輸出7----------");
Strings=null;
//註:這一個會拋出NullPointException,即RuntimeException的子類。
s=s.substring(0);
System.out.println("----------測試輸出8----------");
Strings="123";
//註:這一個會拋出IndexOutOfBoundsException,即RuntimeException的子類。
inti=s.indexOf(200);
System.out.println("----------測試輸出9----------");}
這個時候,在上面代碼中,因為沒有進行 catch ,所以,第 2 句 「測試輸出 8」 就不會執行到了。
❸ Java面試題,常見面試題及答案匯總
Java最新面試題附贈答案
Q1: Java內部類和子類之間有什麼區別?
答案:內部類是指在一個外部類的內部再定義一個類,內部類對外部類有訪問許可權,可以訪問類中定義的所有變數和方法。子類是從父類(superclass)中繼承的類,子類可以訪問父類所有public和protected的欄位和方法。
Q2: 靜態方法和靜態變數的目的是什麼?
答案:靜態變數被類的所有實例共用,靜態類只能訪問類的靜態變數,或調用類的靜態方法。
Q3: Java語言中有哪些常見的訪問說明符,有什麼意義?
答案:Java中的訪問說明符是放在類名之前,用於定義訪問范圍的關鍵字,常見的訪問說明符有以下幾類:
Public:公共,能被項目中的任何一個Class、Method、Field訪問。
Protected:受保護,能被同類或子類訪問,不能從外部訪問。
Default:默認,只能被同一個包的ClassMethod、Field訪問。
Private:私有,只能被本類訪問。
Q4: 什麼是數據封裝及其意義?
答案:封裝是面向對象編程中用於在單個單元中組合屬性和方法。封裝可以幫助程序員遵循模塊化方法進行軟體開發,每個對象都有自己的一組方法和變數,並且可以獨立干其他對象來執行其功能。另外,封裝也有數據隱藏的目的。
Q5: 什麼是 singleton class(單例類)? 並給出其用法的實際例子。
答案:單例類只能有一個實例,必須自己創建自己的唯一實例,必須給所有其他對象提供這一實例。單例做差枯使用場景的最佳實踐是由於某些驅動程序限制,或由於許可問題的限制只能連接資料庫。
Q6: 什麼是循環? Java中有哪些循環?
答案:循環用於編程中重復執行語句,Java中的循環有三類:
1、for循環
for循環用於執行指定重復次數的語句,當程序員明確知道循環次數可以使用for循環。
2、While循環
當語句滿足條件時開始進行重復執行,直到語句不再滿足條件退出循環。While循環中在執行語句之前先檢查是否滿足條件。
3、do while循環
Do while 和while循環基本類似,唯一不同的是do while是先執行語句再檢查條件,也就是說dowhile循環至少會執行一次語句。
Q7: 什麼是無限循環? 如何聲明無限循環?
答案:無限循環是指無條件執行,無限運行。無限循環可以由定義中斷語句塊來結束。
Q8: Java中的double和float變數有什麼區別?
答案: float是單精度浮點數,內存中佔用4位元組double是雙精慶冊度浮點數,內存中佔用8位元組。
Q9: Java中的Final關鍵字是什麼意思純洞? 請舉例說明。
答案: final是Java中的關鍵字,有「無法改變」、「終態」的含義,final類不能被繼承,沒有子類,final類中的方法默認是final的,且不能被子類的方法覆蓋,但可以被繼承。final成員變數表示常量,只能被賦值一次,賦值後值不再改變。final不能用於修飾構造方法。下面的例子中,const_val被聲明且賦值為常量100:Private Final int const_val=100而當一個方法被聲明為final之後,它不能被子類覆蓋,而且會比其他方法都快。
Q10: 舉例說明什麼是三元運算符?
答案:三元運算符,也稱為條件運算符,根據布爾值來決定將哪個值分配給變數,它被表示為...? ...:...
在下面的示例中,如果rank為1,status=Done,否則status=Pending。
Q11: 什麼是Java Packages? 其意義是什麼?
答案:為了更好地組織類,Java 提供了包機制,用於區別類名的命名空間。
包的作用:
1、把功能相似或相關的類或介面組織在同一個包中,方便類的查找和使用。
2、如同文件夾一樣,包也採用了樹形目錄的存儲方式。同一個包中的類名字是不同的,不同的包中的類的名字是可以相同的,當同時調用兩個不同包中相同類名的類時,應該加上包名加以區別。因此,包可以避免名字沖突。3、包也限定了訪問許可權,擁有包訪問許可權的類才能訪問某個包中的類。
❹ Java中怎樣獲取一個類的所有子類
1、面向對象思想的繼承是子類繼承父類,父類被其它子類繼承在JAVA虛擬機的容器中並沒有直接介面獲取;
2、如果是在一個項目內獲取父類的子類繼承情況,參考這個代碼:
packagefind;
importjava.io.File;
importjava.io.IOException;
importjava.net.URL;
importjava.util.ArrayList;
importjava.util.List;
importfind.test.Intf;
importfind.test.Man;
publicclassClassUtil{
publicstaticvoidmain(String[]args){
try{
System.out.println("介面實現類:");
for(Class<?>c:getAllAssignedClass(Intf.class)){
System.out.println(c.getName());
}
System.out.println("子類:");
for(Class<?>c:getAllAssignedClass(Man.class)){
System.out.println(c.getName());
}
}catch(ClassNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
/**
*獲取同一路徑下所有子類或介面實現類
*
*@paramintf
*@return
*@throwsIOException
*@throwsClassNotFoundException
*/
publicstaticList<Class<?>>getAllAssignedClass(Class<?>cls)throwsIOException,
ClassNotFoundException{
List<Class<?>>classes=newArrayList<Class<?>>();
for(Class<?>c:getClasses(cls)){
if(cls.isAssignableFrom(c)&&!cls.equals(c)){
classes.add(c);
}
}
returnclasses;
}
/**
*取得當前類路徑下的所有類
*
*@paramcls
*@return
*@throwsIOException
*@throwsClassNotFoundException
*/
publicstaticList<Class<?>>getClasses(Class<?>cls)throwsIOException,
ClassNotFoundException{
Stringpk=cls.getPackage().getName();
Stringpath=pk.replace('.','/');
ClassLoaderclassloader=Thread.currentThread().getContextClassLoader();
URLurl=classloader.getResource(path);
returngetClasses(newFile(url.getFile()),pk);
}
/**
*迭代查找類
*
*@paramdir
*@parampk
*@return
*@throwsClassNotFoundException
*/
privatestaticList<Class<?>>getClasses(Filedir,Stringpk)throwsClassNotFoundException{
List<Class<?>>classes=newArrayList<Class<?>>();
if(!dir.exists()){
returnclasses;
}
for(Filef:dir.listFiles()){
if(f.isDirectory()){
classes.addAll(getClasses(f,pk+"."+f.getName()));
}
Stringname=f.getName();
if(name.endsWith(".class")){
classes.add(Class.forName(pk+"."+name.substring(0,name.length()-6)));
}
}
returnclasses;
}
}