封裝和繼承作業
一、 選擇題
| 1. |
使用權限修飾符( B )修飾的類的成員變量和成員方法,可以被當前包中所有類訪問,也可以被它的子類(同一個包以及不同包中的子類)訪問。(選擇一項) |
|
|
|
|
|
|
|
A |
public |
|
|
B. |
protected |
|
|
C. |
默認 |
|
|
D. |
private |
| 2. |
給出如下代碼,如何使成員變量m被方法fun()直接訪問( C )。(選擇一項) |
|
|
|
class Test { private int m; public static void fun() { } } |
|
|
|
|
|
|
|
A |
將private int m 改為protected int m |
|
|
B. |
將private int m 改為public int m |
|
|
C. |
將private int m 改為static int m |
|
|
D. |
將private int m 改為int m |
| 3. |
以下關於繼承條件下構造方法執行過程的代碼的執行結果是( A )。(選擇一項) |
|
|
|
class Person { public Person() { System.out.println("execute Person()"); } } class Student extends Person { public Student() { System.out.println("execute Student() "); } } class PostGraduate extends Student { public PostGraduate() { System.out.println("execute PostGraduate()"); } } public class TestInherit { public static void main(String[] args) { new PostGraduate(); } } |
|
|
|
|
|
|
|
A. |
execute Person() execute Student() execute PostGraduate() |
|
|
B. |
execute PostGraduate() |
|
|
C. |
execute PostGraduate() execute Student() execute Person() |
|
|
D. |
沒有結果輸出 |
| 4. |
以下關於this和super關鍵字的說法錯誤的是( BD)。(選擇二項) |
|
|
|
|
|
|
|
A. |
this關鍵字指向當前對象自身,super關鍵字指向當前對象的直接父類 |
|
|
B. |
在main方法中可以存在this或super關鍵字,但不能同時存在。 |
|
|
C. |
this和super關鍵字都可以訪問成員屬性,成員方法和構造方法 |
|
|
D. |
在一個類的構造方法中可以同時使用this和super來調用其他構造方法 |
| 5. |
給出下面的代碼段,在代碼說明//assignment x=a,y=b處寫入如下( D )個代碼是正確的。(選擇一項) |
|
|
|
public class Base { int w, x, y, z; public Base(int a, int b) { x = a; y = b; } public Base(int a, int b, int c, int d) { // assignment x=a,y=b w = d; z = c; } } |
|
|
|
|
|
|
|
A |
Base(a,b); |
|
|
B. |
x=a,y=b; |
|
|
C. |
this(a),this(b); |
|
|
D. |
this(a,b) |
| 6. |
以下Java程序編譯運行后的輸出結果是(A )。(選擇一項) |
|||
|
|
class HelloA { public HelloA( ) { System.out.println("HelloA"); } { System.out.println("I'm A class"); }
static { System.out.println("static A"); } } public class HelloB extends HelloA { public HelloB( ) { System.out.println("HelloB"); } { System.out.println("I'm B class"); } static { System.out.println("static B"); } public static void main(String[] args) { new HelloB( ); } } |
|||
|
|
|
|
||
|
|
A |
static A static B I'm A class HelloA I'm B class HelloB |
C. |
static A I'm A class HelloA static B I'm B class HelloB |
|
|
B. |
static A static B I'm A class I'm B class HelloA HelloB |
D |
static A static B HelloA HelloB I'm A class I'm B class |
| 7. |
下列選項中關於Java中super關鍵字的說法正確的是( AD )。(選擇二項) |
|
|
|
|
|
|
|
A |
super關鍵字是在子類對象內部指代其父類對象的引用 |
|
|
B. |
super關鍵字不僅可以指代子類的直接父類,還可以指代父類的父類 |
|
|
C. |
子類通過super關鍵字只能調用父類的方法,而不能調用父類的屬性 |
|
|
D. |
子類通過super關鍵字可以調用父類的構造方法 |
二、 判斷題
- 使用public修飾的成員屬性和方法可以被當前項目中所有包的所有類訪問。( T )
- 類的方法通常設為public,而類的實例變量一般也設為public。(F )
- 與未加訪問控制符的缺省情況相比,public和protected修飾符擴大了類及其屬性和方法的被訪問范圍,private修飾符則縮小了這種范圍。( T )
- 訪問權限是private的變量,只能在本類和與本類同一個包中的其他類使用。( F )
- 如果定義一個類時沒有使用extends,則它的父類是java.lang.Object。( T )
- 對子類實例化對象需要調用超類的構造函數進行初始化工作,完成對子類中的超類實例變量的初始化,則子類可以繼承超類的構造函數。(F )
- 在Java中任何一個子類的構造方法都必須調用其父類的構造方法(包括隱式調用),並且調用父類的構造方法的語句必須是子類構造方法的第一條語句。( F)
- Java中的類不允許多重繼承,一個類只能有有一個直接父類。(T)
- Object類有一個public方法是toString( ),一個對象通過調用該方法可以獲得該對象的字符串表示。( T )
- 運算符“==”用於比較引用時,如果兩個引用指向內存同一個對象,則返回true。( T )
三、 簡答題
- private、默認、protected、public四個權限修飾符的作用.
訪問修飾符:可以修飾變量,方法,類
修飾變量:四種修飾符都能使用
修飾方法:四種修飾符都能使用
修飾類:2種 public,default
- 方法重載和方法重寫(覆蓋)的區別。.
(1)方法重載:存在一個類中
方法名必須相同
參數列表不同(參數個數,類型,順序不同)
與返回值無關
(2)方法重寫:存在子父類中,子類把父類的方法重寫一遍
返回值,方法名,參數列表必須一致
子類的訪問修飾符要大於等於父類的訪問修飾符
- java.lang.Object類的六個常用方法的聲明並說明其作用。
Object類有一個默認構造方法pubilcObject(),在構造子類實例時,都會先調用這個默認構造方法。
equals()方法:用於測試某個對象是否同另一個對象相等。它在Object類中的實現是判斷兩個對象是否指向同一塊內存區域。
toString():返回該對象的字符串表示。Object類中的toString()方法會打印出類名和對象的內存位置。幾乎每個類都會覆蓋該方法,以便打印對該對象當前狀態的表示。
f inalize
protected void finalize()
throws Throwable
當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。子類重寫 finalize 方法,以配置系統資源或執行其他清除。
wait
public final void wait()
throws InterruptedException
導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法。換句話說,此方法的行為就好像它僅執行 wait(0) 調用一樣。
notify
public final void notify()
喚醒在此對象監視器上等待的單個線程。如果所有線程都在此對象上等待,則會選擇喚醒其中一個線程。選擇是任意性的,並在對實現做出決定時發生。線程通過調用其中一個 wait 方法,在對象的監視器上等待。
- 繼承條件下子類構造方法的執行過程
1、子類的構造過程中必須調用其基類的構造方法。
2、子類可以在自己的構造方法中使用super(argument_list)調用基類的構造方法
2.1、使用this(argument_list)調用本類的另外構造方法。
2.2、如果調用super,必須寫在子類構造方法的第一行。
3、如果子類的構造方法中沒有顯示的調用基類的構造方法,則系統默認調用基類的無參數構造方法。
4、如果子類構造方法中既沒有顯示調用基類構造方法,而基類又沒有無參數的構造方法,則編譯出錯。
- super關鍵字的作用和使用
super子類可以通過它調用父類的方法 寫在構造方法的第一行
- ==和equals()的聯系和區別
1.基本數據類型
也稱原始數據類型。byte,short,char,int,long,float,double,boolean 他們之間的比較,應用雙等號(==),比較的是他們的值。
2.復合數據類型(類)
當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址,所以,除非是同一個new出來的對象,他們的比較后的結果為true,否則比較后結果為false。 JAVA當中所有的類都是繼承於Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行為是比較對象的內存地 址,但在一些類庫當中這個方法被覆蓋掉了,如String,Integer,Date在這些類當中equals有其自身的實現,而不再是比較類在堆內存中的存放地址了。
對於復合數據類型之間進行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是基於他們在內存中的存放位置的地址值的,因為Object的equals方法也是用雙等號(==)進行比較的,所以比較后的結果跟雙等號(==)的結果相同。
四、 編碼題
- 以面向對象的思想,編寫自定義類描述IT從業者。設定屬性包括:姓名,年齡,技術方向,工作年限, 工作單位和職務;方法包括:工作
要求:
1) 設置屬性的私有訪問權限,通過公有的get,set方法實現對屬性的訪問
2) 限定IT從業人員必須年滿15歲,無效信息需提示,並設置默認年齡為15。
3) 限定“技術方向”是只讀屬性
4) 工作方法通過輸入參數,接收工作單位和職務,輸出個人工作信息
5) 編寫測試類,測試IT從業者類的對象及相關方法(測試數據信息自定義)
1 public class IT { 2 private String name; 3 private int age; 4 private String tend; 5 private int workAge; 6 private String workPlace; 7 private String job; 8 9 // 無參構造器 10 public IT() { 11 super(); 12 // TODO Auto-generated constructor stub 13 } 14 15 // 有參構造器 16 public IT(String name, int age, String tend, int workAge, String workPlace, String job) { 17 super(); 18 this.name = name; 19 this.age = age; 20 this.tend = tend; 21 this.workAge = workAge; 22 this.workPlace = workPlace; 23 this.job = job; 24 } 25 26 // get,set方法 27 public String getName() { 28 return name; 29 } 30 31 public void setName(String name) { 32 this.name = name; 33 } 34 35 public int getAge() { 36 return age; 37 } 38 39 public void setAge(int age) { 40 if (age <= 15) { 41 this.age = 15; 42 System.out.println("年齡無效,默認值是15"); 43 } else { 44 this.age = age; 45 } 46 } 47 48 public String getTend() { 49 return tend; 50 } 51 52 public void setTend(String tend) { 53 this.tend = tend; 54 } 55 56 public int getWorkAge() { 57 return workAge; 58 } 59 60 public void setWorkAge(int workAge) { 61 this.workAge = workAge; 62 } 63 64 public String getWorkPlace() { 65 return workPlace; 66 } 67 68 public void setWorkPlace(String workPlace) { 69 this.workPlace = workPlace; 70 } 71 72 public String getJob() { 73 return job; 74 } 75 76 public void setJob(String job) { 77 this.job = job; 78 } 79 80 // 工作方法 81 public void work() { 82 System.out.println("姓名:" +name); 83 System.out.println("年齡:" + age); 84 System.out.println("技術方向: " + tend); 85 System.out.println("工作年限: " + workAge); 86 System.out.println("工作單位: " + workPlace); 87 System.out.println("職務: " + job); 88 } 89 90 } 91 public class test { 92 public static void main(String[] args) { 93 IT t = new IT("馬未龍", 35, "數據庫維護", 10, "騰訊實業", "數據庫維護工程師"); 94 t.work(); 95 System.out.println("--------------------"); 96 IT t1 = new IT(); 97 t1.setName("張凱"); 98 t1.setAge(6); 99 t1.setTend("Java開發"); 100 t1.setWorkAge(1); 101 t1.setWorkPlace("鼎盛科技"); 102 t1.setJob("Java開發工程師"); 103 t1.work(); 104 } 105 }
2.編寫應用程序,創建類的對象,分別設置圓的半徑、圓柱體的高,計算並分別顯示圓半徑、圓面積、圓周長,圓柱體的體積。(7分)
提示:(1)編寫一個圓類Circle,該類擁有:
1) 一個成員變量,radius(私有,浮點型);//存放圓的半徑;
2) 兩個構造方法
Circle() //將半徑設為0
Circle(double r ) //創建Circle對象時將半徑初始化為r
3) 三個成員方法
double getArea() //獲取圓的面積
double getPerimeter() //獲取圓的周長
void show() //將圓的關徑、周長、面積輸出到屏幕
(2) 編寫一個圓柱體類Cylinder,它繼承於上面的Circle類。還擁有:
1) 一個成員變量,double hight (私有,浮點型); //圓柱體的高;
2) 構造方法
//創建Cylinder對象時將半徑初始化為r,高度初始化為h
Cylinder(double r,double h)
3) 成員方法
double getVolume() //獲取圓柱體的體積
void showVolume() //將圓柱體的體積輸出到屏幕
1 public class Circle { 2 double radius; 3 4 // 無參構造器 5 public Circle() { 6 this.radius=0; 7 } 8 9 // 有參構造器 10 public Circle(double r) { 11 this.radius = r; 12 } 13 14 //獲取圓的面積 15 public double getArea(){ 16 double s = Math.PI*this.radius*this.radius; 17 return s; 18 } 19 20 //獲取圓的周長 21 public double getPerimeter(){ 22 double c = 2*Math.PI*this.radius; 23 return c; 24 } 25 26 //將圓的半徑、周長、面積輸出到屏幕 27 public void show(){ 28 System.out.println("圓的半徑是:"+this.radius); 29 System.out.print("圓的周長是:"); 30 System.out.printf("%.2f",getPerimeter()); 31 System.out.print("\n圓的面積是:"); 32 System.out.printf("%.2f",getArea()); 33 } 34 } 35 public class Cylinder extends Circle { 36 double hight;// 圓柱體的高 37 38 public Cylinder(double r, double h) { 39 super(r); 40 this.hight = h; 41 } 42 43 // 獲取圓柱體的體積 44 public double getVolume() { 45 double s = super.getArea(); 46 double v =s*this.hight; 47 return v; 48 } 49 50 //將圓柱體的體積輸出到屏幕 51 public void showVolume(){ 52 System.out.print("\n圓柱的體積是:"); 53 System.out.printf("%.2f",getVolume()); 54 } 55 } 56 public class test { 57 public static void main(String[] args) { 58 Cylinder c = new Cylinder(3, 6); 59 Circle ci = new Circle(5); 60 ci.show(); 61 c.showVolume(); 62 } 63 }
3.某公司要開發新游戲,請用面向對象的思想,設計游戲中的蛇怪和蜈蚣精
設定
1) 蛇怪類:
屬性包括:怪物名字,生命值,攻擊力
方法包括:攻擊,移動(曲線移動),補血(當生命值<10時,可以補加20生命值)
2) 蜈蚣精類:
屬性包括:怪物名字,生命值,攻擊力
方法包括:攻擊,移動(飛行移動)
要求
1) 分析蛇怪和蜈蚣精的公共成員,提取出父類—怪物類
2) 利用繼承機制,實現蛇怪類和蜈蚣精類
3) 攻擊方法,描述攻擊狀態。內容包括怪物名字,生命值,攻擊力
4) 編寫測試類,分別測試蛇怪和蜈蚣精的對象及相關方法
5) 定義名為mon的包存怪物類,蛇怪類,蜈蚣精類和測試類
1 public class Monster { 2 String name; 3 int healthpoint;// 生命值 4 int Attack;// 攻擊力 5 6 public String getName() { 7 return name; 8 } 9 10 public int getHealthpoint() { 11 return healthpoint; 12 } 13 14 public int getAttack() { 15 return Attack; 16 } 17 18 public void setName(String name) { 19 this.name = name; 20 } 21 22 public void setHealthpoint(int healthpoint) { 23 this.healthpoint = healthpoint; 24 } 25 26 public void setAttack(int attack) { 27 this.Attack = attack; 28 } 29 30 //攻擊 31 public void attack(){ 32 System.out.println("怪物"+getName()+"展開攻擊"); 33 System.out.println("當前的生命值是:"+getHealthpoint()); 34 System.out.println("攻擊力是:"+getAttack()); 35 } 36 //移動 37 public void move(){} 38 39 40 } 41 public class Snake extends Monster { 42 //補血(當生命值<10時,可以補加20生命值) 43 public void addHP(){ 44 if(getHealthpoint()<10){//當生命值<10時,可以補加20生命值 45 healthpoint = getHealthpoint()+20; 46 System.out.println("施展大蛇補血術。。。。。當前的生命值是:"+healthpoint); 47 } 48 49 } 50 51 //方法重寫-重寫父類move(); 52 public void move(){ 53 System.out.println("我是蛇怪,我走S行線路!"); 54 } 55 56 57 } 58 public class Centipede extends Monster { 59 // 方法重寫-重寫父類move(); 60 public void move() { 61 System.out.println("我是蜈蚣精,我御風飛行!"); 62 } 63 } 64 public class test { 65 public static void main(String[] args) 66 // 創建蛇對象 67 Snake s = new Snake(); 68 s.setName("金蛇怪"); 69 s.setHealthpoint(1); 70 s.addHP(); 71 s.setAttack(100); 72 s.attack(); 73 s.move(); 74 // 創建蜈蚣對象 75 System.out.println(); 76 Centipede ce = new Centipede(); 77 ce.setName("紫衣蜈蚣"); 78 ce.setHealthpoint(30); 79 ce.setAttack(70); 80 ce.attack(); 81 ce.move(); 82 } 83 }
五、 可選題
- 以面向對象的思想,編寫自定義類描述圖書信息。設定屬性包括:書名,作者,出版社名,價格;方法包括:信息介紹
要求:
1) 設置屬性的私有訪問權限,通過公有的get,set方法實現對屬性的訪問
2) 限定介格必須大於10,如果無效進行提示
3) 設計構造方法實現對屬性賦值
4) 信息介紹方法描述圖書所有信息
5) 編寫測試類,測試圖書類的對象及相關方法(測試數據信息自定)
ublic class BookInformation { private String name; private String author; private String publish; private double price; public String getName() { return name; } public String getAuthor() { return author; } public String getPublish() { return publish; } public double getPrice() { return price; } public void setName(String name) { this.name = name; } public void setAuthor(String author) { this.author = author; } public void setPublish(String publish) { this.publish = publish; } public void setPrice(double price) { this.price = price; } //書信息介紹 public void introduce() { System.out.println("書名:"+getName()); System.out.println("作者:"+getAuthor()); System.out.println("出版社:"+getPublish()); System.out.println("價格:"+getPrice()+"元"); } public static void main(String[] args) { BookInformation b1 = new BookInformation(); b1.setName("鹿鼎記"); b1.setAuthor("金庸"); b1.setPublish("人民出版社"); b1.setPrice(120); b1.introduce(); System.out.println("======================"); BookInformation b2 = new BookInformation(); b2.setName("絕代雙驕"); b2.setAuthor("古龍"); b2.setPublish("中國長安出版社"); b2.setPrice(55); b2.introduce(); } }
2.請用面向對象的思想,設計自定義類描述演員和運動員的信息
設定
1) 演員類:
屬性包括:姓名,年齡,性別,畢業院校,代表作
方法包括:自我介紹
2) 運動員類:
屬性包括:姓名,年齡,性別,運動項目,歷史最好成績
方法包括:自我介始
要求
3) 分析演員和運動員的公共成員,提取出父類—人類
4) 利用繼承機制,實現演員類和運動員類
5) 編寫測試類,分別測試人類,演員類和運動員類對象及相關方法
6) 定義名為act的包存人類,演員類,運動員類和測試類
1 public class People { 2 private String name; 3 private int age; 4 private String sex; 5 6 public String getName() { 7 return name; 8 } 9 10 public int getAge() { 11 return age; 12 } 13 14 public String getSex() { 15 return sex; 16 } 17 18 public void setName(String name) { 19 this.name = name; 20 } 21 22 public void setAge(int age) { 23 this.age = age; 24 } 25 26 public void setSex(String sex) { 27 this.sex = sex; 28 } 29 30 //公共方法-自我介紹 31 public void introduce(){ 32 System.out.println("大家好!我是:"+getName()); 33 System.out.println("今年"+getAge() +"歲"); 34 System.out.println("我是一個"+getSex()+"生"); 35 } 36 } 37 38 public class Sportsman extends People { 39 private String project; 40 private String grade; 41 42 public String getProject() { 43 return project; 44 } 45 46 public String getGrade() { 47 return grade; 48 } 49 50 public void setProject(String project) { 51 this.project = project; 52 } 53 54 public void setGrade(String grade) { 55 this.grade = grade; 56 } 57 58 public void title(){ 59 System.out.println("我是一個普通的小老百姓"); 60 System.out.println("====================="); 61 } 62 //運動員介紹-運動項目,歷史最好成績 63 public void infor(){ 64 System.out.println("我最擅長的運動項目是:"+getProject()+"短跑"); 65 System.out.println("歷史最好的成績是:"+getGrade()); 66 } 67 68 } 69 public class Actor extends People{ 70 private String graduate; 71 private String representative; 72 73 public String getGraduate() { 74 return graduate; 75 } 76 77 public String getRepresentative() { 78 return representative; 79 } 80 81 public void setGraduate(String graduate) { 82 this.graduate = graduate; 83 } 84 85 public void setRepresentative(String representative) { 86 this.representative = representative; 87 } 88 89 //演員介紹-畢業院校,代表作 90 public void info() { 91 System.out.println("畢業院校:"+getGraduate()); 92 System.out.println("代表作:"+getRepresentative()); 93 } 94 95 public void title1(){ 96 System.out.println("====================="); 97 } 98 } 99 100 public class test { 101 public static void main(String[] args) { 102 //運動員對象 103 Sportsman s = new Sportsman(); 104 s.setName("劉小翔"); 105 s.setAge(23); 106 s.setSex("男"); 107 s.setProject("200"); 108 s.setGrade("22秒30"); 109 s.title(); 110 s.introduce(); 111 s.infor(); 112 113 //演員對象 114 Actor a = new Actor(); 115 a.setName("章衣"); 116 a.setAge(27); 117 a.setSex("女"); 118 a.setGraduate("北京電影學院"); 119 a.setRepresentative("《寄往天國的家書》"); 120 a.title1(); 121 a.introduce(); 122 a.info(); 123 } 124 125 126 }
