1、問答題 1.子類能夠有多個父類嗎?
答案:不能夠
2.java.lang包中的Object類是全部其餘類的祖先類嗎? 答案:是
3.若是子類和父類不在同一個包中,子類是否繼承父類的友好成員? 答案:不繼承
4.子類怎樣隱藏繼承的成員變量?
答案: 聲明與父類同名的成員變量
5.子類重寫方法的規則是怎樣的?重寫方法的目的是什麼?
答案:子類重寫的方法類型和父類的方法的類型一致或者是父類的方法的類型的子類型,重寫的方法的名字、參數個數、參數的類型和父類的方法徹底相同。重寫方法的目的是隱藏繼承的方法。
6.父類的final方法能夠被子類重寫嗎? 答案:不能夠
7.什麼類中能夠有abstract方法?
答案:abstract類
8.對象的上轉型對象有怎樣的特色?
答案:上轉型對象不能操做子類新增的成員變量;不能使用子類新增的方法。上轉型對象能夠操做子類繼承或者隱藏的成員變量,也可使用子類繼承的或者重寫的方法。上轉型對象操做子類繼承或重寫的方法,其做用等價於子類對象去調用這些方法。所以,若是子類重寫了父類的某個方法,則當對象的上轉型對象調用這個方法時必定是調用了這個重寫的方法。
9.一個類的各個子類是怎樣體現多態的? 答案:經過重寫
10.面向抽象編程的目的和核心是什麼?
答案:目的是爲了應對用戶需求的變化,核心是讓類中每種可能的變化對應地交給抽象類的一個子類類去負責,從而讓該類的設計者不去關心具體實現。
2、選擇題
1.下列哪一個敘述是正確的?
A. 子類繼承父類的構造方法。
B. abstract類的子類必須是非abstract類。
C. 子類繼承的方法只能操做子類繼承和隱藏的成員變量。
D. 子類重寫或新增的方法也能直接操做被子類隱藏的成員變量。 答案:C
2.下列哪一個敘述是正確的?
A. final 類能夠有子類。
B. abstract類中只能夠有abstract方法。
C. abstract類中能夠有非abstract方法,但該方法不能夠用final修飾。
D. 不能夠同時用final和abstract修飾同一個方法。
E. 容許使用static修飾abstract方法。 答案:D
3.下列程序中註釋的哪兩個代碼(A,B,C,D)是錯誤的(沒法經過編譯)?
class Father {
private int money =12;
float height;
int seeMoney(){
return money ; //A
}
}
class Son extends Father {
int height;
int lookMoney() {
int m = seeMoney(); //B
return m;
}
}
class E {
public static void main(String args[]) {
Son erzi = new Son();
erzi.money = 300; //C
erzi.height = 1.78F; //D
}
}
答案:CD
4.假設C是B的子類,B是A的子類,cat是C類的一個對象,bird是B類的一個對象,下列哪一個敘述是錯誤的?
A. cat instanceof B的值是true。
B. bird instanceof A的值是true。
C. cat instanceof A的值是true。
D. bird instanceof C的值是true。 答案:D
5.下列程序中註釋的哪一個代碼(A,B,C,D)是錯誤的(沒法經過編譯)?
class A {
static int m;
static void f(){
m = 20 ; //A
}
}
class B extends A {
void f() //B
{ m = 222 ; //C
}
}
class E {
public static void main(String args[]) {
A.f(); // D
}
}
答案:B
6.下列代碼中標註的(A,B,C,D)中,哪個是錯誤的?
abstract class Takecare {
protected void speakHello() {} //A
public abstract static void cry(); //B
static int f(){ return 0 ;} //C
abstract float g(); //D
}
答案:B 7.下列程序中註釋的哪一個代碼(A,B,C,D)是錯誤的(沒法經過編譯)?
abstract class A {
abstract float getFloat (); //A
void f() //B
{ }
}
public class B extends A {
private float m = 1.0f; //C
private float getFloat () //D
{ return m;
}
} 答案:D
8.將下列哪一個代碼(A,B,C,D)放入程序中標註的【代碼】處將致使編譯錯誤?
A. public float getNum(){return 4.0f;}
B. public void getNum(){ }
C. public void getNum(double d){ }
D. public double getNum(float d){return 4.0d;}
class A {
public float getNum() {
return 3.0f;
}
}
public class B extends A {
【代碼】
} 答案:B
9.對於下列代碼,下列哪一個敘述是正確的?
A. 程序提示編譯錯誤(緣由是A類沒有不帶參數的構造方法)
B. 編譯無錯誤,【代碼】輸出結果是0。
C. 編譯無錯誤,【代碼】輸出結果是1。
D. 編譯無錯誤,【代碼】輸出結果是2。
class A {
public int i=0;
A(int m) {
i = 1;
}
}
public class B extends A {
B(int m) {
i = 2;
}
public static void main(String args[]){
B b = new B(100);
System.out.println(b.i); //【代碼】
}
}
答案:A 3、閱讀程序
1.請說出E類中【代碼1】,【代碼2】的輸出結果。
class A {
double f(double x,double y) {
return x+y;
}
}
class B extends A {
double f(int x,int y) {
return xy;
}
}
public class E {
public static void main(String args[]) {
B b=new B();
System.out.println(b.f(3,5)); //【代碼1】
System.out.println(b.f(3.0,5.0)); //【代碼2】
}
}
答案:一、15.0 二、8.0 2.說出下列B類中【代碼1】,【代碼2】的輸出結果。
class A {
public int getNumber(int a) {
return a+1;
}
}
class B extends A {
public int getNumber (int a) {
return a+100;
}
public static void main (String args[]) {
A a =new A();
System.out.println(a.getNumber(10)); //【代碼1】
a = new B();
System.out.println(a.getNumber(10)); //【代碼2】
}
} 答案:一、11 二、11 3.請說出E類中【代碼1】~【代碼4】的輸出結果。
class A {
double f(double x,double y) {
return x+y;
}
static int g(int n) {
return nn;
}
}
class B extends A {
double f(double x,double y) {
double m = super.f(x,y);
return m+x*y;
}
static int g(int n) {
int m = A.g(n);
return m+n;
}
}
public class E {
public static void main(String args[]) {
B b = new B();
System.out.println(b.f(10.0,8.0)); //【代碼1】
System.out.println(b.g(3)); //【代碼2】
A a = new B();
System.out.println(a.f(10.0,8.0)); //【代碼3】
System.out.println(a.g(3)); //【代碼4】
}
} 答案:一、98.0 二、12 三、98.0 四、9 4.請說出E類中【代碼1】~【代碼3】的輸出結果。
class A {
int m;
int getM() {
return m;
}
int seeM() {
return m;
}
}
class B extends A {
int m ;
int getM() {
return m+100;
}
}
public class E {
public static void main(String args[]) {
B b = new B();
b.m = 20;
System.out.println(b.getM()); //【代碼1】
A a = b;
a.m = -100; // 上轉型對象訪問的是被隱藏的m
System.out.println(a.getM()); //【代碼2】上轉型對象調用的必定是子類重寫的getM()方法
System.out.println(b.seeM()); //【代碼3】子類繼承的seeM()方法操做的m是被子類隱藏的m
}
}
答案:一、120 二、120 三、-100 4、編程題(參考例子13)
設計一個動物聲音「模擬器」,但願模擬器能夠模擬許多動物的叫聲。要求以下:
編寫抽象類Animal
Animal抽象類有2個抽象方法cry()和getAnimaName(),即要求各類具體的動物給出本身的叫聲和種類名稱。
編寫模擬器類Simulator
該類有一個playSound(Animal animal)方法,該方法的參數是Animal類型。即參數animal能夠調用Animal的子類重寫的cry()方法播放具體動物的聲音、調用子類重寫的getAnimalName()方法顯示動物種類的名稱。
編寫Animal類的子類:Dog,Cat類
編寫主類Application(用戶程序) 在主類Application的main方法中至少包含以下代碼: Simulator simulator = new Simulator(); simulator.playSound(new Dog()); simulator.playSound(new Cat()); java
1、問答題 1.接口中能聲明變量嗎?
答案:不能
2.接口中能定義非抽象方法嗎?
答案:不能
3.什麼叫接口的回調?
答案:接口回調是指:能夠把實現某一接口的類建立的對象的引用賦給該接口聲明的接口變量中,那麼該接口變量就能夠調用被類重寫的接口方法。實際上,當接口變量調用被類重寫的接口方法時,就是通知相應的對象調用這個方法。
4.接口中的常量能夠不指定初值嗎? 答案:不能夠
5.能夠在接口中只聲明常量,不聲明抽象方法嗎?
答案:能夠
2、選擇題
1.下列哪一個敘述是正確的
A.一個類最多能夠實現兩個接口。
B.若是一個抽象類實現某個接口,那麼它必需要重寫接口中的所有方法。
C.若是一個非抽象類實現某個接口,那麼它能夠只重寫接口中的部分方法。
D.容許接口中只有一個抽象方法。 答案:A
2.下列接口中標註的(A,B,C,D)中,哪兩個是錯誤的?
interface Takecare {
protected void speakHello(); //A
public abstract static void cry(); //B
int f(); //C
abstract float g(); //D
} 答案:AB
3.將下列(A,B,C,D)哪一個代碼替換下列程序中的【代碼】不會致使編譯錯誤。
A.public int f(){return 100+M;}
B.int f(){return 100;}
C.public double f(){return 2.6;}。
D.public abstract int f();
interface Com {
int M = 200;
int f();
}
class ImpCom implements Com {
【代碼】
}
答案:B編程
3、閱讀程序
1.請說出E類中【代碼1】,【代碼2】的輸出結果。
interface A {
double f(double x,double y);
}
class B implements A {
public double f(double x,double y) {
return x*y;
}
int g(int a,int b) {
return a+b;
}
}
public class E {
public static void main(String args[]) {
A a = new B();
System.out.println(a.f(3,5)); //【代碼1】
B b = (B)a;
System.out.println(b.g(3,5)); //【代碼2】
}
}
答案:一、15.0 二、8
2.請說出E類中【代碼1】,【代碼2】的輸出結果。
interface Com {
int add(int a,int b);
}
abstract class A {
abstract int add(int a,int b);
}
class B extends A implements Com{
public int add(int a,int b) {
return a+b;
}
}
public class E {
public static void main(String args[]) {
B b = new B();
Com com = b;
System.out.println(com.add(12,6)); //【代碼1】
A a = b;
System.out.println(a.add(10,5)); //【代碼2】
}
}
答案:一、18 二、15
4、編程題(參考例子6)
該題目和第5章習題5的編程題相似,只不過這裏要求使用接口而已。
設計一個動物聲音「模擬器」,但願模擬器能夠模擬許多動物的叫聲。要求以下:
編寫接口Animal
Animal接口有2個抽象方法cry()和getAnimaName(),即要求實現該接口的各類具體動物類給出本身的叫聲和種類名稱。
編寫模擬器類Simulator
該類有一個playSound(Animal animal)方法,該方法的參數是Animal類型。即參數animal能夠調用實現Animal接口類重寫的cry()方法播放具體動物的聲音、調用重寫的getAnimalName()方法顯示動物種類的名稱。
編寫實現Animal接口的Dog類和Cat類
圖6.14是Simulator、Animal、Dog、Cat的UML圖。
編寫主類Application(用戶程序)
在主類Application的main方法中至少包含以下代碼:
Simulator simulator = new Simulator();
simulator.playSound(new Dog());
simulator.playSound(new Cat());spa