java面試2019常考題系列——Java面向對象 一 (附帶答案)

一、Java面向對象:

1、super()與 this()的區別?

This():當前類的對象,super 父類對象。

Super():在子類訪問父類的成員和行爲,必須受類繼承規則的約束

而 this 他代表當前對象,當然所有的資源都可以訪問.

在構造函數中,如果第一行沒有寫 super(),編譯器會自動插入.但是如果父類沒有不帶參數的構

造函數,或這個函數被私有化了(用 private 修飾).此時你必須加入對父類的實例化構造.而 this 就

沒有這個要求,因爲它本身就進行實例化的構造.

而在方法中 super 和 this 使用的方法就差不多了.只不過 super 要考慮是否能訪問其父類的資源.

 

2、作用域 public,protected,private,以及不寫時的區別?

Public:不同包、同一包、類內都可用

Private:類內

Protected: 不同包的子類、同一包、類內都可用

不寫時:同一包

 

3、編程輸出如下圖形。

* * * * *

* * * *

* * *

* *

*

代碼如下:

public class Print {

public static void main(String[] args) {

for (int i = 0; i < 5; i++) {

for (int j = 5; j > i; j--) {

System.out.print("*");

}

System.out.println();

}

}

}

4、什麼是 java 序列化,如何實現 java 序列化?(寫一個實例)

序列化:

可以將一個對象保存到一個文件,所以可以通過流的方式在網絡上傳輸,可以將文件的內

容讀取,轉化爲一個對象。

處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化後的對象進行

讀寫操作,也可將流化後的對象傳輸於網絡之間。序列化是爲了解決在對對象流進行讀寫操作

時所引發的問題。

序列化的實現:

將需要被序列化的類實現 Serializable 接口,該接口沒有需要實現的方法,implements

Serializable 只是爲了標註該對象是可被序列化的,然後使用一個輸出流(如:

FileOutputStream) 來構造一個 ObjectOutputStream( 對象流 ) 對 象 , 接 着 , 使 用

ObjectOutputStream 對象的 writeObject(Object obj)方法就可以將參數爲 obj 的對象寫出

(即保存其狀態),要恢復的話則用輸入流。

 

5、Overload 和 Override 的區別。Overloaded 的方法是否可以改變返回值的類型?

方法的重寫 Override,子類覆蓋父類的方法,將子類傳與父類的引用調用的還是子類的方法。

重載 Overloading 一個類多個方法,名稱相同,參數個數類型不同。

兩者都是 Java 多態性的不同表現。

Overloaded 的方法是可以改變返回值的類型。

1, public class Ctest()

{

Public static void main()

{

System.out.prinln(8+8+”88”+8+8);

}

}

168888

 

5、繼承時候類的執行順序問題,一般都是選擇題,問你將會打印出什麼?

答:父類:

package test;

public class FatherClass

{

public FatherClass()

{

System.out.println("FatherClass Create");

}

}

子類:

package test;

import test.FatherClass;

public class ChildClass extends FatherClass

{

public ChildClass()

{

System.out.println("ChildClass Create");

}

public static void main(String[] args)

{

FatherClass fc = new FatherClass();

ChildClass cc = new ChildClass();

}

}

輸出結果:

C:>java test.ChildClass

FatherClass Create

FatherClass Create

ChildClass Create

 

6、用插入法進行排序代碼如下

package test;

import java.util.*;

class InsertSort

{

ArrayList al;

public InsertSort(int num,int mod)

{

al = new ArrayList(num);

Random rand = new Random();

System.out.println("The ArrayList Sort Before:");

for (int i=0;i<num ;i++ )

{

al.add(new Integer(Math.abs(rand.nextInt()) % mod + 1));

System.out.println("al["+i+"]="+al.get(i));

}

}

public void SortIt()

{

Integer tempInt;

int MaxSize=1;

for(int i=1;i<al.size();i++)

{

tempInt = (Integer)al.remove(i);

if(tempInt.intValue()>=((Integer)al.get(MaxSize-1)).intValue())

{

al.add(MaxSize,tempInt);

MaxSize++;

System.out.println(al.toString());

} else {

for (int j=0;j<MaxSize ;j++ )

{

if

(((Integer)al.get(j)).intValue()>=tempInt.intValue())

{

al.add(j,tempInt);

MaxSize++;

System.out.println(al.toString());

break;

}

}

}

}

System.out.println("The ArrayList Sort After:");

for(int i=0;i<al.size();i++)

{

System.out.println("al["+i+"]="+al.get(i));

}

}

public static void main(String[] args)

{

InsertSort is = new InsertSort(10,100);

is.SortIt();

}

}

JAVA 類實現序例化的方法是實現 java.io.Serializable 接口

Collection 框架中實現比較要實現 Comparable 接口和 Comparator 接口

 

7、編程:編寫一個截取字符串的函數,輸入爲一個字符串和字節數,輸出爲按字節截取的字符串。 但是要保證漢字不被截半個,如"我 ABC"4,應該截爲"我 AB",輸入"我 ABC 漢 DEF",6,應該輸出爲"

我 ABC"而不是"我 ABC+漢的半個"。

答:代碼如下:

public static void split(String source,int num) throws Exception

{

int k=0;

String temp="";

for (int i = 0; i <source.length(); i++)

{

byte[] b=(source.charAt(i)+"").getBytes();

k=k+b.length;

if(k>num)

{

break;

}

temp=temp+source.charAt(i);

}

System.out.println(temp);

}

 

8、指出下面程序的運行結果。

class A{

static{

System.out.print("1");

}

public A(){

System.out.print("2");

}

}

class B extends A{

static{

System.out.print("a");

}

public B(){

System.out.print("b");

}

}

public class Hello{

public static void main(String[] ars){

A ab = new B(); //執行到此處,結果: 1a2b

ab = new B(); //執行到此處,結果: 1a2b2b

}

}

 注:類的 static 代碼段,可以看作是類首次加載(被虛擬機加載)執行的代碼,而對於類的

加載,首先要執行其基類的構造,再執行其本身的構造

 

9、抽象類和接口的區別?

(1)接口可以被多重 implements,抽象類只能被單一 extends

(2)接口只有定義,抽象類可以有定義和實現

(3)接口的字段定義默認爲:public static final, 抽象類字段默認是"friendly"(本包可見)

當功能需要累積時用抽象類,不需要累積時用接口。

 

10、什麼是類的返射機制?

通過類(Class 對象),可以得出當前類的 fields、method、construtor、interface、superClass、

modified 等,同是可以通過類實例化一個實例、設置屬性、喚醒方法。Spring 中一切都是返

射、struts、hibernate 都是通過類的返射進行開發的。

 

11、類的返射機制中的包及核心類?

java.lang.Class

java.lang.refrection.Method

java.lang.refrection.Field

java.lang.refrection.Constructor

java.lang.refrection.Modifier

java.lang.refrection.Interface

 

12、得到 Class 的三個過程是什麼?

對象.getClass()類.class 或 Integer.type(int) Integer.class(java.lang.Integer)

Class.forName();

 

13、如何喚起類中的一個方法?

產生一個 Class 數組,說明方法的參數

通過 Class 對象及方法參數得到 Method

通過 method.invoke(實例,參數值數組)喚醒方法

 

14、如何將數值型字符轉換爲數字(Integer,Double)?

Integer.parseInt(“1234”)

Double.parseDouble(“123.2”)

 

15、如何將數字轉換爲字符?

1+””

1.0+””

 

16、如何去小數點前兩位,並四捨五入?

double d=1256.22d;

d=d/100;

System.out.println(Math.round(d)*100);

 

17、如何取得年月日,小時分秒?

Calendar c=Calendar.getInstance();

c.set(Calendar.YEAR,2004);

c.set(Calendar.MONTH,0);

c.set(Calendar.DAY_OF_MONTH,31);

System.out.println(c.get(Calendar.YEAR)+" "+(c.get(Calendar.MONTH)+1)+"

"+c.get(Calendar.DAY_OF_MONTH));

 

18、如何獲取某個日期是當月的最後一天?

當前日期加一天,若當前日期與結果的月份不相同,就是最後一天。

取下一個月的第一天,下一個月的第一天-1

public static void main(String[] args)

{

Calendar c=Calendar.getInstance();

c.set(Calendar.YEAR,2004);

c.set(Calendar.MONTH,0);

c.set(Calendar.DAY_OF_MONTH,30);

Calendar c1=(Calendar)c.clone();

System.out.println(c.get(Calendar.YEAR)+" "+(c.get(Calendar.MONTH)+1)+"

"+c.get(Calendar.DAY_OF_MONTH));

c.add(Calendar.DAY_OF_MONTH,1);

if(c.get(Calendar.MONTH)!=c1.get(Calendar.MONTH))

{

System.out.println("是最後一天");

}

else

{

System.out.println("不是取後一天");

}

}

 

19、float 型 float f=3.4 是否正確?

報錯,應當是 float f=3.4f

如果是 float f=3(整數)正確

 

20、說出一些常用的類,包,接口,請各舉 5 個

常用的類:BufferedReader BufferedWriter FileReader FileWirter String Integer

常用的包:java.lang java.awt java.io java.util java.sql javax.xml javax.sevlet

javax.ejb. java.net javax.faces

常用的接口 : List Map Document NodeList EjbObject EjbHome SessionBean

EntityBean

 

21、java 中會存在內存泄漏嗎,請簡單描述。

會。如:int i,i2; return (i-i2); //when i 爲足夠大的正數,i2 爲足夠大的負數。結果

會造成溢位,導致錯誤。

 

22、java 中實現多態的機制是什麼?

靜態的多態:方法名相同,參數個數或類型不相同。(overloading)

動態的多態:

子類覆蓋父類的方法,將子類的實例傳與父類的引用調用的是子類的方法

實現接口的實例傳與接口的引用調用的實現類的方法。

 

23、垃圾回收器的基本原理是什麼?垃圾回收器可以馬上回收內存嗎?有什麼辦法主動通知虛擬機進行垃圾回收?

動態內存

存放類實例

靜態內存

類本身

垃圾收集主要針對的是動態內存,一般當內存不夠用時會進行垃圾收集。

或通過 System.gc()手動收集,但不保證一定執行。

 

24、靜態變量和實例變量的區別?

static i = 10; //常量

 class A a; a.i =10;//可變

靜態方法可以調用靜態變量。

實現方法可以調用靜態變量、實例變量

 

25、是否可以從一個 static 方法內部發出對非 static 方法的調用?

不可以,如果其中包含對象的 method();不能保證對象初始化.

 

26、寫 clone()方法時,通常都有一行代碼,是什麼?

Clone 有缺省行爲,super.clone();他負責產生正確大小的空間,並逐位複製。

 

27、JAVA 語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally 分別代表什麼意義?在

try 塊中可以拋出異常嗎?

Try:執行部分,產生異常

Catch:捕捉異常

Finally:不管有沒有異常都執行

Throws:在方法聲明處聲明要拋出的異常,調用者必須對其進行處理。

Throw:拋出一個異常

在 try 中可以拋出異常,一般與聲明的異常相同。

自定義異常要繼承於 Exception 或 Exception 的子類

 

28、冒泡排序法

//相鄰兩個數比較,將最小或最大的放到後面,最後面數的不參與比較

public class BubbleSort {

private static int al[] = new int[10];

public BubbleSort() {

al[0]=2;

al[1]=3;

al[2]=23;

al[3]=45;

al[4]=1;

al[5]=67;

al[6]=23;

al[7]=80;

al[8]=35;

al[9]=72;

}

 

public static void main(String[] args) {

BubbleSort bs = new BubbleSort();

System.out.println("排序前:");

display(al);

for(int i=0;i<al.length;i++) {

for (int j = 0; j < al.length-i-1; j++) {

if(al[j]>al[j+1]) {

swap(j,j+1);

}

}

}

System.out.println();

System.out.println("排序後:");

display(al);

}

private static void display(int[] al2) {

for (int i = 0; i < al2.length; i++) {

System.out.print(al2[i]+" ");

}

}

private static void swap(int i, int j) {

int temp = al[i];

al[i]= al[j];

al[j] = temp;

}

}

 

29、String and StringBuffer 的區別?

String:長度給定不可變,當多個字符串聯合時要先轉爲StringBuffer,再聯合,速度慢。

StringBuffer:長度可變,可以將多個字符串值直接聯合,效率高

 

30用 java 代碼編寫堆棧

public class Stack {

int[] data;

int maxSize;

int top;

public Stack(int maxSize) {

this.maxSize = maxSize;

data = new int[maxSize];

top = -1;

}

/**

* 依次加入數據

* @param data 要加入的數據

* @return 添加是否成功

*/

public boolean push(int data) {

if(top+1== maxSize) {

System.out.println("棧已滿!");

return false;

}

this.data[++top] = data;

return true;

}

/**

* 從棧中取出數據

* @return 取出的數據

*/

public int pop() throws Exception{

if(top==-1) {

throw new Exception("棧已空!");

}

return this.data[top--];

}

public static void main(String[] args) throws Exception {

Stack stack=new Stack(1000);

stack.push(1);

stack.push(2);

stack.push(3);

stack.push(4);

stack.push(5);

while(stack.top>=0)

{

System.out.println(stack.pop());

}

}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章