問答題
(1)面嚮對象語言有哪三個特性?
(2)類名應當遵守怎樣的編程風格?
(3)變量和方法的名字應當遵守怎樣的編程風格?
(4)類體內容中聲明成員變量是爲了體現對象的屬性還是行爲?
(5)類體中定義的非構造方法是爲了體現對象的屬性還是行爲?
(6)什麼時候使用構造方法?構造方法有類型嗎?
(7)類中的實例變量在什麼時候會被分配內存空間?
(8)什麼叫方法的重載?構造方法可以重載嗎?
(9)類中的實例方法可以操作類變量(static變量)嗎?類方法(static方法)可以操作實例變量嗎?
(10)類中的實例方法可以用類名直接調用嗎?
(11)簡述類變量和實例變量的區別。
(12)this關鍵字代表什麼?this可以出現在類方法中嗎?
問答題解析
1.封裝、繼承和多態。
2.當類名由幾個單詞複合而成時,每個單詞的首字母使用大寫。
3.名字的首單詞的首字母使用小寫,如果變量的名字由多個單詞組成,從第2個單詞開始的其他單詞的首字母使用大寫。
4.屬性。
5.行爲。
6.用類創建對象時。沒有類型。
7.用類創建對象時。
8.一個類中可以有多個方法具有相同的名字,但這些方法的參數必須不同,即是參數的個數不同,或者是參數的類型不同。可以。
9.可以。不可以。
10.不可以。
11.一個類通過使用new運算符可以創建多個不同的對象,不同的對象的實例變量將被分配不同的內存空間。所有對象的類變量都分配給相同的一處內存,對象共享類變量。
12.代表調用當前方法的對象。不可以。
選擇題
(1) 下列哪個敘述是正確的?
A. Java應用程序由若干個類所構成,這些類必須在一個源文件中。
B. Java應用程序由若干個類所構成,這些類可以在一個源文件中,也可以分佈在若干個源文件中,其中必須有一個源文件含有主類。
C. Java源文件必須含有主類。
D. Java源文件如果含有主類,主類必須是public類。
(2) 下列哪個敘述是正確的?
A. 成員變量的名字不可以和局部變量的名字相同。
B. 方法的參數的名字可以和方法中聲明的局部變量的名字相同。
C. 成員變量沒有默認值。
D 局部變量沒有默認值.。
(3) 對於下列Hello類,哪個敘述是正確的?
A. Hello類有兩個構造方法。
B. Hello類的int Hello()方法是錯誤的方法。
C. Hello類沒有構造方法。
D. Hello無法通過編譯,因爲其中的hello方法的方法頭是錯誤的(沒有類型)
Java
class Hello{
Hello (int m){
}
int Hello(){
return 20;
}
hello(){
}
}
(4)對於下列Dog類,哪個敘述是錯誤的?
A. Dog(int m)與Dog(double m)是互爲重載的構造方法。
B. int Dog(int m)與void Dog(double m)是互爲重載的非構造方法。
C. Dog類只有兩個構造方法,而且沒有無參數的構造方法。
D. Dog類有三個構造方法。
Java
class Dog{
Dog(int m){
}
Dog(int double m){
}
int Dog(int m){
return 23;
}
void Dog(double m){
}
}
(5) 下列哪些類聲明是錯誤的?
A. class A
B. public class A
C. protected class A
D. private class A
(6) 下列A類中【代碼1】~【代碼5】哪些是錯誤的?
Java
class Tom{
private int x = 120;
protected int y = 20;
int z = 11;
private void f(){
x = 200;
System.out.println(x);
}
void g(){
x = 200;
System.out.println(x);
}
}
public class A{
public static void main(String args[]){
Tom tom = new Tom();
tom.x = 22; //【代碼1】
tom.y = 33; //【代碼2】
tom.z = 55; //【代碼3】
tom.f(); //【代碼4】
tom.g(); //【代碼5】
(7) 下列E類的類體中哪些【代碼】是錯誤的?
Java
classE{
int x;
long y = x;
public void f(int n){
int m;
int t = n+m;
}
}
選擇題解析
1.B
C選項中一個源文件可以沒有主類,但在一個應用程序(工程)下必須由一個主類
D選項如果若干源文件在同一個包下,主類可以不加public修飾。
2.D
B選項如果相同,那麼在方法內賦值操作就會混亂。
C選項成員變量都是有默認值的比如int 是0 double 是0.0 String 是null。而局部變量是沒有默認值的,所以在使用之前必須要進行初始化。
3.D
Hello只有一個構造方法,構造方法是沒有類型的,構造方法名必須和類名相同,故hello()不是構造方法,但他又沒有類型,不符合普通方法的規定,所以編譯會發生錯誤。
4.D
方法重載要求方法名相同,參數列表不同,可以是參數個數或者類型不同。構造方法也是可以重載的。Dog類有兩個構造方法(不帶類型的),而後兩個方法是互爲重載的非構造方法。
5.CD
類只能用public 修飾或者默認(友好)
6.【代碼1】【代碼4】
Tom類中的成員變量x是私有變量,不能直接使用對象調用。
f是私有方法,也不能直接使用對象調用
protect允許在同一個包中或者是子類調用
7.【代碼4】
m是局部變量,沒有默認值,所以在沒有初始化的前提下使用會報錯。
閱讀程序
(1) 說出下列E類中【代碼1】~【代碼3】的輸出結果。
Java
class Fish{
int weight = 1;
}
class Lake{
Fish fish;
void setFish(Fish s){
fish = s;
}
void foodFish(int m){
fish.weight=fish.weight + m;
}
}
public class E{
public static void main(String args[]){
Fish redFish = new Fish();
System.out.println(redFish.weight);//【代碼1】
Lake lake = new Lake();
lake.setFish(redFish);
lake.foodFish(120);
System.out.println(redFish.weight);//【代碼2】
System.out.prihtln(lake.fish.weight);//【代碼3】
}
}
(2)請說出A類中System.out.println的輸出結果
Java
calss B{
int x = 100, y = 200;
public void setX(int x){
x = x;
}
public void setY(int y){
this.y=y;
}
public int getXYSum(){
return x+y;
}
}
public class A{
public static void main(String args[]){
B b = new B();
b.setX(-100);
b.setY(-200);
System.out.println("sum="+b.getXYSum());
}
}
(3)請說出A類中System.out.println的結果。
Java
class B{
int n;
static int sum = 0;
void setN(int n){
this.n = n;
}
int getSum(){
for(int i=1;i<=n;i++)
sum=sum+i;
return sum;
}
}
public class A{
public static void main(String args[]){
B b1 = new B(),b2=new B();
b1.setN(3);
b2.setN(5);
int s1 = b1.getSum();
int s2 = b2.getSum();
System.out.println(s1+s2);
(4)請說出E類中【代碼1】和【代碼2】的輸出結果。
Java
class A{
double f(int x,double y){
return x+y;
}
int f(int x,int y){
return x*y;
}
}
public class E{
public static void main(String args[]){
A a = new A();
System.out.println(a.f(10,10));//【代碼1】
System.out.println(a.f(10,10.0));//【代碼2】
}
}
閱讀程序題解析
1.【代碼1】:1,【代碼2】:121,【代碼3】:121。
redFish對象是Fish類的實例,所以具有Fish類的屬性,輸出的weight是1。
lake.setFish方法傳遞的是redFish對象,將redFish對象賦值給Lake中的fish對象,那麼二者就具有了相同的引用,從而具有完全相同的變量。那麼調用lake.foodFish(120)時,lake對象中的fish對象的weight就變成了121,而redFish和fish的引用相同,其變量也相同,所以redFish中的weight也同樣變成了121。
2.sum=-100
這道題涉及了this關鍵字的用法。
主類中聲明瞭B類的對象先調用setX方法傳遞參數爲-100,但在這個方法體中的語句爲x=x,等號右邊的x是傳遞進的參數,而等號左邊的x同樣也指這個參數,所以相當於把參數的值賦值給本身,是沒有任何意義的。
而調用setY方法,等號左邊是this.y指的就是當前類下的成員變量y,所以此時成員變量y被賦值爲-200,返回x+y的和就爲-100。
3.27
這道題考察類變量(static變量)
無論一個類實例了多少個對象,他們都共享類中的類變量。b1中的n是3,b2中的n是5,調用b1.getSum求和後得到的結果是1+2+3=6賦值給s1,由於sum是類變量,所以b2中的sum也是6,再調用b2.getsum求和,就是6+1+2+3+4+5=21賦值給了s2,此時b1中的sum也變成了21,最後輸出s1+s2的值就爲6+21=27。
4.【代碼1】100 【代碼2】20.0
這道題考察方法重載,方法重載要求方法名必須相同,參數列表不同(參數的個數不同或者是參數類型不同),【代碼1】傳遞的參數是兩個int變量10和10,那麼與int f(int x,int y)方法匹配,輸出結果100,【代碼2】傳遞的參數是int 10和double 10.0,和double f(int x, double y)匹配,輸出結果是20.0注意不能寫成20,返回的是double類型。
編程題
用類描述計算機中CPU的速度和硬盤的容量,要求Java應用程序由4個類,名字分別是PC、CPU、HardDisk、和Test,其中Test是主類。
- PC類與CPU和HardDisk類關聯的UML圖
其中,CPU類要求getSpeed()返回speed的值,要求setSpeed(int m)方法將參數m的值賦值給speed;HardDisk類要求getAmount()返回amount的值,要求setAmount(int m)方法將參數m的值賦值給amount;PC類要求setCPU(CPU c)將參數c的值賦值給CPU,要求setHardDisk(HardDisk h)方法將參數h的值賦值給HD,要求show()方法能顯示CPU的速度和硬盤的容量。 - 主類Test的要求
(1)main方法中創建一個CPU對象cpu,cpu將自己的speed設置爲2200.
(2)main方法中創建一個HardDisk對象disk,disk將自己的amount設置爲200。
(3)main方法中創建一個PC對象pc。
(4)pc調用setCPU(CPU c)方法,調用時實參是cpu。
(5)pc調用setHardDisk(HardDisk h)方法,調用時實參是disk。
(6)pc調用show方法。
Java
public class CPU{
int speed;
int getSpeed(){
return speed;
}
public void setSpeed(int speed){
this.speed = speed;
}
}
public class HardDisk{
int amount;
int getAmount(){
return amount;
}
public void setAmount(int amount){
this.amount = amount;
}
}
public class PC{
CPU cpu;
HardDisk HD;
void setCPU(CPU cpu){
this.cpu = cpu;
}
void setHardDisk(HardDisk HD){
this.HD = HD;
}
void show(){
System.out.println("CPU速度:"+cpu.getSpeed());
System.out.println("硬盤容量"+HD.getAmount());
}
}
public class Test{
public static void main(String args[]){
CPU cpu = new CPU();
HardDisk HD = new HardDisk();
cpu.setSpeed(2200);
HD.setAmount(200);
PC pc = new PC();
pc.setCPU(cpu);
pc.setHardDisk(HD);
pc.show();
}
}