1. 程式人生 > >java自動拆裝箱,介面和抽象類

java自動拆裝箱,介面和抽象類

1.Java支援的資料型別有哪些?什麼是自動拆裝箱?

Java語言支援的8中基本資料型別是:
byte
short
int
long
float
double
boolean
char
自動裝箱是Java編譯器在基本資料型別和對應的物件包裝型別之間做的一個轉化。比如:把int轉化成Integer,double轉化成double,等等。反之就是自動拆箱。


2.介面和抽象類的區別是什麼?

Java提供和支援建立抽象類和介面。它們的實現有共同點,不同點在於:
介面中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
類可以實現很多個介面,但是隻能繼承一個抽象類
類如果要實現一個介面,它必須要實現介面宣告的所有方法。但是,類可以不實現抽象類宣告的所有方法,當然,在這種情況下,類也必須得宣告成是抽象的。
抽象類可以在不提供介面方法實現的情況下實現介面。
Java介面中宣告的變數預設都是final的。抽象類可以包含非final的變數。
Java介面中的成員函式預設是public的。抽象類的成員函式可以是private,protected或者是public。
介面是絕對抽象的,不可以被例項化。抽象類也不可以被例項化,但是,如果它包含main方法的話是可以被呼叫的。


3.介面是否可繼承介面?介面類是否實現介面?介面類是否可繼承實體類?

介面是可以繼承介面的,抽象類是可以實現介面的,抽象類可以繼承實體類,但前提是實體類必須要有明確的建構函式


面試常考題

1.Java抽象類可以有建構函式嗎?

抽象類雖然自身不可以例項化,但是其子類覆蓋了所有的抽象方法後,是可以例項化的,所以抽象類的建構函式,適用於給其子類物件進行初始化的


2.Java抽象類可以實現介面嗎?它們需要實現所有的方法嗎?

可以,抽象類可以通過使用關鍵字implements來實現介面。因為它們是抽象的,所以它們不需要實現所有的方法,抽象類可以不實現介面的方法,由抽象類的子類實現



3.Java抽象類可以是final的嗎?

不可以,Java抽象類不能是final的。final的不能被繼承。


4.Java抽象類可以有static方法嗎?

可以,抽象類可以宣告並定義static方法。


5.可以建立抽象類的例項嗎?

不可以,你不能建立Java抽象類的例項,它們是不完全的。即使你的抽象類不包含任何抽象方法,你也不能對它例項化。將類宣告為abstract的,就等你你告訴編譯器,它是不完全的不應該被例項化。當一段程式碼嘗試例項化一個抽象類時Java編譯器會拋錯誤。


6.抽象類必須有抽象方法嗎?

抽象類可以沒有抽象方法,但有抽象方法的必須是抽象類。


7.Java抽象類和介面有何不同?

Java提供和支援建立抽象類和介面。它們的實現有共同點,不同點在於:
介面中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
類可以實現很多個介面,但是隻能繼承一個抽象類
類如果要實現一個介面,它必須要實現介面宣告的所有方法。但是,類可以不實現抽象類宣告的所有方法,當然,在這種情況下,類也必須得宣告成是抽象的。
抽象類可以在不提供介面方法實現的情況下實現介面。
Java介面中宣告的變數預設都是final的。抽象類可以包含非final的變數。
Java介面中的成員函式預設是public的。抽象類的成員函式可以是private,protected或者是public。
介面是絕對抽象的,不可以被例項化。抽象類也不可以被例項化,但是,如果它包含main方法的話是可以被呼叫的。


8.何時選用抽象類而不是介面?

1.寫一個形狀介面Shape  有兩個方法一個求周長,一個求面積    2. 寫一個長方形類Rect繼承於形狀類  增加屬性長和寬  分別去覆蓋求周長和求面積的方法    3.寫一個圓形類Circle  增加屬性半徑  分別去覆蓋求周長和求面積的方法  寫一個測試類,在測試類中分別建立不同的物件放入進一個Shape  陣列中進行,迴圈陣列中的元素求周長和麵積 

<span style="font-family:SimSun;">package method;
interface Shape{
	public abstract void Per();
	public abstract void Area();	
}
class Rect implements Shape{
	private double length;	
	public double getLength() {
		return length;
	}
	public void setLength(double length) {
		this.length = length;
	}
	public double getWide() {
		return wide;
	}
	public void setWide(double wide) {
		this.wide = wide;
	}
	private double wide;
	public void Per(){
		System.out.println("長方形長:"+this.length+"長方形寬:"+this.wide+"周長:"+(2*(this.length+this.wide)) );
	}	
	public void Area() {
		System.out.println("長方形長:"+this.length+"長方形寬:"+this.wide+"面積:"+(this.length*this.wide) );		
	}
	public Rect(double length, double wide) {
		setLength(length);
		setWide(wide);
	}
}

class Circle implements Shape{
	private double radius;
	public double getRadius() {
		return radius;
	}

	public void setRadius(double radius) {
		this.radius = radius;
	}

	public void Per() {
		System.out.println("圓半徑:"+this.radius+"圓面積:"+(Math.PI*this.radius*this.radius) );
		
	}

	public void Area() {
		System.out.println("圓半徑:"+this.radius+"圓周長:"+(Math.PI*this.radius*2) );
		
	}
	public Circle(double radius){
		setRadius(radius);
	}
	
}
public class demo6 {

	public static void main(String[] args) {
		Shape[] Shape=new Shape[2];
		Rect a=new Rect(5,10);
		Circle b=new Circle(5);
		Shape[0]=a;
		Shape[1]=b;
  for(int i=0;i<2;i++){
	  Shape[i].Per();   Shape[i].Area();
  }

	}

}
</span>