***JAVA入門到精通-第14講-final-作業評講
這樣,猴子會游泳,會飛; 通過介面,彌補單繼承的一些缺陷;
執行的一瞬間才知道是什麼型別-後期繫結; Car car 後期繫結,編譯的時候不知道是什麼型別; 前期繫結
保證成員變數、成員方法不被子類修改; 如果一個變數 是final的,則必須賦初值,否則,無法編譯;
實現介面VS繼承類
java的繼承是單繼承,也就是一個類最多隻能有一個父類,這種單繼承的機制可保證類的純潔性,比C++中的多繼承機制簡潔。但是不可否認,對子類功能的擴充套件有一定影響。所以:
1、實現介面可以看作是對繼承的一種補充。(繼承是層級式的,不太靈活。修改某個類就會打破繼承的平衡,而介面就沒有這樣的麻煩,因為它只針對實現介面的類才起作用)
2、實現介面可在不打破繼承關係的前提下,對某個類功能擴充套件,非常靈活。
//例項:建立子類並繼承了父類且連線多個介面[Demo126.java]
public class Demo126 {
public static void main(String[] args) {
System.out.println("繼承了Monkey父類");
Monkey mo=new Monkey();
mo.jump();
LittleMonkey li=new LittleMonkey();
li.swimming();
li.fly();
}
}
//介面Fish
interface Fish{
public void swimming();
}
//介面Bird
interface Bird{
public void fly();
}
//建立Monkey類
class Monkey{
int name;
//猴子可以跳
public void jump(){
System.out.println("猴子會跳!");
}
}
//建立LittleMonkey子類並繼承了Monkey父類並連線了Fish和Bird介面
class LittleMonkey extends Monkey implements Fish,Bird{
public void swimming() {
System.out.println("連線了Fish介面!");
}
public void fly() {
System.out.println("連線了Bird介面!");
}
}
-------------------------------------------------------------------------------
用介面實現多型--案例[Demo127.java]
java中多型是個難以理解的概念,但同時又是一個非常重要的概念。java三大特性之一(繼承,封裝,多型),我們可以從字面上簡單理解:就是一種型別的多種狀態,以下通過賣小汽車的例子說明什麼是多型。
//用介面實現多型
public class Demo127 {
public static void main(String []args){
CarShop aShop=new CarShop();
//賣出一輛寶馬
aShop.sellCar(new BMW());
//賣出一輛奇瑞QQ
aShop.sellCar(new CheryQQ());
//賣出一輛桑塔納
aShop.sellCar(new Santana());
System.out.println("總收入:"+aShop.getMoney());
}
}
//汽車介面
interface Car{
//汽車名稱
String getName();
//獲得汽車售價
int getPrice();
}
//寶馬
class BMW implements Car{
public String getName(){
return "BMW";
}
public int getPrice(){
return 300000;
}
}
//奇瑞QQ
class CheryQQ implements Car{
public String getName(){
return "CheryQQ";
}
public int getPrice(){
return 20000;
}
}
//桑塔納汽車
class Santana implements Car{
public String getName(){
return "Santana";
}
public int getPrice(){
return 80000;
}
}
//汽車出售店
class CarShop{
//售車收入
private int money=0;
//賣出一部車
public void sellCar(Car car){
System.out.println("車型:"+car.getName()+"單價:"+car.getPrice
());
//增加賣出車售價的收入
money+=car.getPrice();
}
//售車總收入
public int getMoney(){
return money;
}
}
執行結果:
車型:BMW 單價:300000
車型:CheryQQ 單價:20000
總收入:320000
繼承是多型得以實現的基礎。從字面上理解,多型就是一種型別(都是Car型別)表現出多種狀態(寶馬汽車的名稱是BMW,售價是300000;奇瑞汽車的名稱是CheryQQ,售價是2000)。將一個方法呼叫同這個方法所屬的主體(也就是物件或類)關聯起來叫做繫結,分前期綁這下和後期繫結兩種。下面解釋一下它們的定義:
1、前期繫結:在程式執行之前進行繫結,由編譯器和連線程式實現,又叫做靜態繫結。比如static方法和final方法,注意,這裡也包括private方法,因為它是隱式final的。
2、後期繫結:在執行時根據物件的型別進行繫結,由方法呼叫機制實現,因此又叫做動態繫結,或者執行時繫結。除了前期繫結外的所有方法都屬於後期繫結。
多型就是在後期繫結這種機制上實現的。多型給我們帶來的好處是消除了類之間的偶合關係,使程式更容易擴充套件。比如在上例中,新增加一種型別汽車的銷售。只需要讓新定義的類實現Car類並實現它的所有方法,而無需對原有程式碼做任何修改,CarShop類的sellCar(Car
car)方法就可以處理新的車型了。
新增程式碼如下:
java程式碼
//桑塔納汽車
class Santana implements Car{
public String getName(){
return "Santana";
}
public int getPrice(){
return 80000;
}
}
-------------------------------------------------------------------------------
java面向物件程式設計(3)--final
final概念
final中文意思:最後的,最終的。
final可以修飾變數或者方法。
在某些情況下,程式設計師可能有以下需求:
1、當不希望父類的某個方法被子類覆蓋(override)時,可以用final關鍵字修飾。
2、當不希望類的某個變數的值被修改,可以用final修飾。如果一個變數是final,則必須賦初值,否則編譯出錯。
3、當不希望類被繼承時,可以用final修飾。
//final方法的使用[Demo128.java]
public class Demo128 {
public static void main(String[] args) {
Aaa aaa=new Aaa();
aaa.show();
Bbb bbb=new Bbb();
bbb.show();
}
}
class Aaa{
int a=0;//如果a不賦初值,a是0。定義型別後應賦值
//圓周率不讓修改
//帶有final修飾的變數命名時應有_下劃線來區分表示。這是java程式設計師的標準。
final float reate_1=3.1415926f;//使用final可以保證,需要強制不被修改的資料一定要用final鎖定
//final int b; //使用final定義變數時一定要賦初值否則報錯。
//b=1;
final public void sendMes(){//給成員方法用final來修飾則表示不可以被修改,不可被覆蓋。
System.out.println("傳送訊息");
}
public void show(){
System.out.println("a="+a);
}
}
final class Bbb extends Aaa{//定義類前加final表示該類不允許被繼承
public Bbb(){
a++;
//reate_1=reate+1;
}
/*public void sendMes(){
System.out.println("傳送訊息")
}*/
}
final--注意事項
1、final修飾的變數又叫常量,一般用XX_XX_XX來命名。(帶下劃線)
2、final修飾的變數在定義時,必須賦值,並且以後不能再賦值。
final--什麼時候用
1、因為案例的考慮,類的某個方法不允許修改。
2、類不會被其它的類繼承。
3、某些變數值是固定不變的,比如圓周率3.1415926
作業評講:
手掌遊戲機一臺X元,mp3一臺Y元(X,Y,N,M,Z由使用者輸入)
公司舉行抽獎大會,一等獎遊戲機N臺,二等獎mp3 M臺。公司共有Z人。問總價為多少,公司實際平均給每人花費了多少錢。
//計算總費用和平均費用
import java.util.*;//載入包
public class Work06{
public static int gbGame=0;//靜態變數
public static int gbGameT=0;
public static int mp3=0;
public static int mp3T=0;
public static int people=0;
public static void main(String []args){
Scanner myScanner=new Scanner(System.in);//呼叫鍵盤輸入
System.out.print("請輸入手掌遊戲機價格:");
gbGame=myScanner.nextInt();
System.out.print("請輸入MP3價格:");
mp3=myScanner.nextInt();
System.out.print("請輸入手掌遊戲機數量:");
gbGameT=myScanner.nextInt();
System.out.print("請輸入MP3數量:");
mp3T=myScanner.nextInt();
System.out.print("請輸入員工數:");
people=myScanner.nextInt();
showInfo();//呼叫showInfo方法
}
public static void showInfo(){ // 建立showInfo方法
int total=gbGame*gbGameT+mp3*mp3T;//總價
float average=(float)total/people;//平均價
System.out.printf("總價: %d,平均價是: %f \n",total,average);
}
}
**************************************************************
請大家採用面向物件思想設計超級馬里奧遊戲人物。並能用鍵盤輸入命令,來控制馬里奧的位置[Work13.java]
//超級馬里奧人物建造及控制檯數字操作
import java.util.*;
public class Work13 {
public static void main(String[] args) {
Scanner sr=new Scanner(System.in);//接收鍵盤輸入
System.out.println("輸入1-25的數字,你可以移動馬里奧,輸入其它數字退出");
int i=sr.nextInt();//將鍵盤輸入數字賦值給i
Maria m=new Maria();//建立呼叫Maria構造方法
for(int a=i;a<=25;a--){
if(i<25){
m.move(i);
i=sr.nextInt();
}else{
System.out.println("退出遊戲!");
break;
}
}
}
}
class Maria{
int x,y;
//構造方法,初始化場景;確定地圖,Maria的位置
public Maria(){
System.out.println("I'm Maria \n"+"@");
}
public void move(int i){
for(int k=1;k<=25;k++){
if(k==i){
System.out.printf("@");
}else{
System.out.printf(".");
}
}
}
}
int i=4;
switch(i){
default;
System.out.println("default");//執行此語句
case 0:
System.out.println("zero");//執行此語句
break;
case 1:
System.out.println("one");
case 2:
System.out.println("two");
}
int i=1;
switch(i){
default:
System.out.println("default");
case 0:
System.out.println("zero");
break;
case 1:
System.out.println("one");//執行此語句
case2:
System.out.println("two");//執行此語句
}
來自為知筆記(Wiz)