1.1.1 類與對象
一個(gè)問題器罐?[Demo107.java]
張老太養(yǎng)了兩只貓貓:一只名字叫小白,今年3歲渐行,白色轰坊。還有一只叫小花,今年100歲祟印,花色肴沫。請編寫一個(gè)程序,當(dāng)用戶輸入小貓的名字時(shí)蕴忆,就顯示該貓的名字颤芬,年齡,顏色套鹅。如果用戶輸入的小貓名錯(cuò)誤站蝠,則顯示張老太沒有這只貓貓。
//用前面學(xué)習(xí)過的知識寫出代碼
public class Demo107{
public static void main(String []args){
int a=49;//輸入的名字49卓鹿,50
int cat1age=3; //第一只貓
String cat1name="小白";
String cat1color="白色";
int cat2age=100; //第二只貓
String cat2name="小花";
String cat2color="花色";
switch(a){
case '1':
System.out.println(cat1age+cat1color);
break;
case '2':
System.out.println(cat2age+cat2color);
break;
default:
System.out.println("張老太沒有這只貓!");
}
}
}
java語言是面向?qū)ο蟮?/p>
計(jì)算機(jī)語言的發(fā)展向接近人的思維方式演變
匯編語言 [面向機(jī)器]
c語言 [面向過程]
java語言 [面向?qū)ο骫
類和對象的關(guān)系
把貓的特性提取出來-->貓類-->對象(實(shí)例)-->對象(實(shí)例)-->...
注意:從貓類到對象菱魔,目前有幾種說法:
1、創(chuàng)建一個(gè)對象减牺;
2豌习、實(shí)例化一個(gè)對象存谎;
3拔疚、對類實(shí)例化...以后大家聽到這些說法,不要模糊既荚。( 對象就是實(shí)例稚失,實(shí)例就是對象)java最大的特點(diǎn)就是面向?qū)ο蟆?/strong>
//定義貓類
public class Demo105{
public static void main(String []args){
//創(chuàng)建一個(gè)貓對象
Cat cat1=new Cat();//Cat是定義的一個(gè)數(shù)據(jù)類型
//Cat cat1;
//cat1=new Cat();// 等同于 Cat cat1=new Cat();
//訪問屬性的 對象名.屬性名字
cat1.age=3;
cat1.name="小白";
cat1.color="白色";
//創(chuàng)建第二只貓
Cat cat2=new Cat();
cat2.age=100;
cat2.name="小花";
cat2.color="花色";
}
}
//java中如何定義一個(gè)類?[類名的首寫字母大寫]可根據(jù)程序的需要定義類
class Cat{
//下面的就是類的成員變量/屬性
int agr;
String name;
String color;
Master myMaster;
}
//引用類型恰聘,比如建個(gè)主人類
class Master{
int age;
String name;
String address;
}
類和對象的區(qū)別和聯(lián)系
1句各、類是抽象的吸占,概念的,代表一類事物凿宾,比如人類矾屯,貓類..
2、對象是具體的初厚,實(shí)際的件蚕,代表一個(gè)具體事物
3、類對象的模板产禾,對象是類的一個(gè)個(gè)體排作,實(shí)例
類 -- 如何定義類
一個(gè)全面的類定義比較復(fù)雜,如:
package 包名;
class 類名 extends 父類 implements
接口名{
成員變量;
構(gòu)造方法;
成員方法;
}
要透徹的掌握類亚情,必須要了解類的構(gòu)成
class 類名{ ----> 待定...
成員變量;
}
1. 類 -- 類的成員變量 :
成員變量是類的一個(gè)組成部分妄痪,一般是基本數(shù)據(jù)類型,也可是引用類型楞件。比如我們前面定義貓類的int age 就是成員變量衫生。
2. 對象 -- 如何創(chuàng)建對象 :
創(chuàng)建一個(gè)對象有兩種方法
1、先聲明再創(chuàng)建
1 履因、對象聲明:類名 對象名
2 障簿、對象創(chuàng)建:對象名=new 類名()
2、一步到位法
類名 對象名=new 類名()
對象--如何訪問(使用)對象的成員變量
對象名 . 變量名; // 簡單先這樣理解栅迄,以后加下控制符此表達(dá)就不準(zhǔn)確了站故。
- 對象總是存在內(nèi)存中的
一個(gè)小思考題[Demo.105.java]
為了讓大家加深印象,我們定義一個(gè)人類(Person)(包括名字毅舆、年齡)西篓。用一步到位法去創(chuàng)建一個(gè)對象
↓
我們看看下面一段代碼:
System.out.printlin(b.age);
Person a=new Person(); → 請問:b.age究竟是多少?
a.age=10;
a.name="小明";
Person b;
b=a;
- 對象總是存在內(nèi)存中的
一個(gè)小思考題[Demo106.java]
在明白對象是如何在內(nèi)存中存在后憋活,請大家再看看下面的思考題岂津,請問會(huì)輸出什么信息吮成?
Person1 a=new Person1();
a.age=10;
a.name="小明";
Person1 b;
b=a;
System.out.println(b.name);//輸出“小明”
b.age=200;
System.out.println(a.age);//輸出a.age為200
- 重點(diǎn)也是難點(diǎn)
類--成員方法的初步介紹
在某些情況下辜梳,我們要需要定義成員方法粱甫。比如人類:除了有一些屬性外(成員變量表示的年齡、姓名...)作瞄,我們?nèi)祟愡€有一些行為比如:可以說話茶宵、跑步..宗挥,通過學(xué)習(xí),我們?nèi)祟愡€可以做算術(shù)題螃征。這時(shí)就要用成員方法才能完成。現(xiàn)在要求對Person類完善:
1透敌、添加speak成員方法会傲,輸入出:我是一個(gè)好人
2、添加jisuan成員方法退渗,可以計(jì)算從1+..+1000的結(jié)果
3沟涨、修改jisuan成員方法,該方法可以接收一個(gè)數(shù)n,計(jì)算從1+..+n的結(jié)果
4从铲、添加add成員方法瘪校,可以計(jì)算兩個(gè)數(shù)的和
3. 類 -- 類的成員方法 ( 成員函數(shù) ) 定義 :
成員方法也叫成員函數(shù)澄暮,這里希望大家不要被兩個(gè)名詞搞暈了名段。
public 返回?cái)?shù)據(jù)類型 方法名(參數(shù)列表)
{
語句;//方法(函數(shù))主體
}
1阱扬、參數(shù)列表:表示成員函數(shù)輸入
2、數(shù)據(jù)類型(返回類型):表示成員函數(shù)輸出
3伸辟、函數(shù)主體:表示為了實(shí)現(xiàn)某一功能代碼塊
//類的調(diào)用及方法調(diào)用[Demo108.java]
public class Demo108{
public static void main(String []args){
Person p1=new Person();
p1.speak();//調(diào)用speak方法
p1.jiSuan();//調(diào)用計(jì)算方法
p1.jiSuan(200);//調(diào)用可以傳入?yún)?shù)的計(jì)算方法
p1.add(12,10);//調(diào)用兩個(gè)數(shù)的和
int res=p1.add2(23,34);//調(diào)用兩個(gè)數(shù)的和并返回值到res中
System.out.println("res返回值是:"+res);
System.out.println("num1+num2+num3="+p1.add3(2,2.3f,4.5f));//返回類型一定要一致否則報(bào)錯(cuò)麻惶。
}
}
//定義名字的幾個(gè)方法:
//1、駝峰法 如myCry信夫;2窃蹋、下劃線法my_cry
//方法名在有不同參數(shù)的情況下可以使用同一個(gè)方法名,即有參數(shù)和沒參數(shù)的方法可以同名
class Person{ //請注意類名首寫字母應(yīng)為大寫如Person為類名
int age;
String name;
//1静稻、可以輸出我是好人方法
public void speak(){ //請注意方法名的首寫字母應(yīng)為小寫如speak為方法名
System.out.println("我是一個(gè)好人");
}
//2警没、可以計(jì)算1+..+1000的方法
public void jiSuan(){
int result=0;
for(int i=1;i<=1000;i++){
result=result+i;
}
System.out.println("1+..+1000結(jié)果是"+result);
}
//3、帶參數(shù)的成員方法,可以輸入n值并計(jì)算1+..+n
public void jiSuan(int n){
int result=0;
for(int i=1;i<=n;i++){
result+=i;
}
System.out.println("1+..+n結(jié)果是"+result);
}
//4振湾、計(jì)算兩個(gè)數(shù)的和
public void add(int num1,int num2){
int result=0; //與下面一句等同于return num1+num2;
result=num1+num2;
System.out.println("num1+num2="+result);
}
//5杀迹、計(jì)算兩個(gè)數(shù)的和,并將結(jié)果返回給主調(diào)(調(diào)用它的)函數(shù)
//注意:返回類型和返回結(jié)果的類型要一致
//注意:在調(diào)用某個(gè)成員方法的時(shí)候押搪,給出的具體數(shù)值的個(gè)數(shù)
//和類型要相匹配树酪。
public int add2(int num1,int num2){
return num1+num2;
}
//6、計(jì)算兩個(gè)float數(shù)的和大州,并將結(jié)果返給主調(diào)函數(shù)
public float add3(int num1,float num2,float num3){
return num1+num2+num3;
}
}
類 -- 類的成員方法(函數(shù))--如何理解
如何理解方法這個(gè)概念续语,給大家舉個(gè)通俗的示例:
程序員調(diào)用方法:給方法必要的輸入,方法返回結(jié)果厦画。
類的成員方法-- 聲明 :
public int test(int a);/*方法聲明*/
這句話的作用是聲明該方法疮茄,聲明的格式為:
訪問修飾符 數(shù)據(jù)類型 函數(shù)名(參數(shù)列表);
在給Person類添加add方法的例題中,我們看到的關(guān)鍵字return 根暑,它的功能是把表達(dá)式的值返回的值返回給主調(diào)函數(shù)的方法娃豹。
return 表達(dá)式;
類的成員方法(函數(shù))--特別說明
1、方法的參數(shù)列表可以是多個(gè)
案例:在Person類中編寫一個(gè)成員方法购裙,從鍵盤輸入三個(gè)數(shù)懂版,返回最大的那個(gè)數(shù)。
參數(shù)列表可以是多個(gè)躏率,并且數(shù)據(jù)類型可以是任意的類型int float double char..
訪問修飾符 返回?cái)?shù)據(jù)類型 函數(shù)名(參數(shù)列表){
語句; //函數(shù)主體
}
2躯畴、方法可以沒有返回值
案例:編寫一個(gè)函數(shù),從控制臺輸入一個(gè)整數(shù)打印出對應(yīng)的金字塔薇芝。
返回類型可以是任意的數(shù)據(jù)類型(int,float,double,char..)也可以沒有返回值void表示沒有返回值
訪問修飾符 返回?cái)?shù)據(jù)類型 函數(shù)名(形參列表){
語句; //函數(shù)主體
}
類的成員方法(函數(shù))--小練習(xí)
案例:編寫一個(gè)成員函數(shù)蓬抄,從鍵盤輸入一個(gè)整數(shù)(1-9),打印出對應(yīng)的乘法表[Demo110.java]
//實(shí)例鍵盤輸入打印乘法表[Demo110.java]
import java.io.*;
public class Demo110{
public static void main(String []args){
Cfb jiu=new Cfb();
jiu.cf();
}
}
class Cfb{
public void cf(){
try{
//輸入流夯到,從鍵盤接收數(shù)
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
//給出提示
System.out.println("請輸入1-9嚷缭,按0退出:");
//從控制臺讀取一行數(shù)據(jù)
String a1=br.readLine();
//把String轉(zhuǎn)為int
int num1=Integer.decode(a1);
for(int i=1;i<=num1;i++){
for(int j=1;j<=i;j++){
System.out.print(i+"×"+j+"="+(i*j)+"\t");
}
System.out.println();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
案例:編寫函數(shù),使給定的一個(gè)二維數(shù)組(3×3)轉(zhuǎn)置
類定義的完善
在介紹了成員方法后,我們類的定義就可以完善一步:
class 類名{ class 類名{ 待定
成員變量; → 成員變量; →
} 成員方法;
}
小結(jié):1.先設(shè)計(jì)類阅爽;2.然后根據(jù)類創(chuàng)建對象路幸。
小練習(xí):
1、設(shè)計(jì)計(jì)算機(jī)類付翁,要求如下:[Demo109.java]
屬性:品牌(Brand)简肴、顏色(Color)、cpu型號(CPU)百侧、內(nèi)存容量(Memory)砰识、硬盤大小(Harddisk)、價(jià)格(Price)佣渴、工作狀態(tài)(Work)
方法:打開(Open)辫狼、關(guān)閉(Close)、休眠(Sleep)
創(chuàng)建一個(gè)計(jì)算機(jī)對象辛润,調(diào)用打開予借,關(guān)閉方法
//計(jì)算機(jī)類與對象的代碼
import java.io.*;//加載IO流包
public class Demo109{
public static void main(String []args){
Computer Pc=new Computer();
Pc.Brand="品牌";
Pc.Color="顏色";
Pc.Cpu="Cpu型號";
Pc.Memory="內(nèi)存容量";
Pc.Hd="硬盤容量";
Pc.Price="價(jià)格";
Pc.Work="工作狀態(tài)";
try{
//輸入流,從鍵盤接收數(shù)
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
//給出提示
System.out.println("請輸入0-9控制機(jī)器");
//從控制臺讀取一行數(shù)據(jù)
String a1=br.readLine();
//把String轉(zhuǎn)為float
float num1=Float.parseFloat(a1);
if(num1==0){Pc.open();}
else if(num1==1){Pc.close();}
else if(num1==2){Pc.sleep();}
else if(num1==3){System.out.println(Pc.Brand);}
else if(num1==4){System.out.println(Pc.Color);}
else if(num1==5){System.out.println(Pc.Cpu);}
else if(num1==6){System.out.println(Pc.Memory);}
else if(num1==7){System.out.println(Pc.Hd);}
else if(num1==8){System.out.println(Pc.Price);}
else if(num1==9){System.out.println(Pc.Work);}
else {System.out.println("輸入錯(cuò)誤!");}
}catch(Exception e){
e.printStackTrace();
}
}
}
class Computer{
String Brand;
String Color;
String Cpu;
String Memory;
String Hd;
String Price;
String Work;
public void open(){
System.out.println("開機(jī)");
}
public void close(){
System.out.println("關(guān)機(jī)");
}
public void sleep(){
System.out.println("休眠");
}
}
1频蛔、 采用面向?qū)ο笏枷朐O(shè)計(jì)超級馬里奧游戲人物
1.1.2 構(gòu)造方法(函數(shù))
類的構(gòu)造方法介紹
什么是構(gòu)造方法呢灵迫?在回答這個(gè)問題之前,我們來看一個(gè)需求:前面我們在創(chuàng)建人類的對象時(shí)晦溪,是先把一個(gè)對象創(chuàng)建好后瀑粥,再給他的年齡和姓名屬性賦值,如果現(xiàn)在我要求三圆,在創(chuàng)建人類的對象時(shí)狞换,就直接指定這個(gè)對象的年齡和姓名,該怎么做舟肉?
↓
你可以在定義類的時(shí)候修噪,定義一個(gè)構(gòu)造方法即可。
構(gòu)造方法是類的一種特殊的方法路媚,它的主要作用是完成對新對象的初始化黄琼。它有幾個(gè)特點(diǎn):
1、方法名和類名相同
2整慎、沒有返回值
3脏款、在創(chuàng)建一個(gè)類的新對象時(shí),系統(tǒng)會(huì)自動(dòng)的調(diào)用該類的構(gòu)造方法完成對新對象的初始化裤园。
特別說明:
一個(gè)類可以定義多個(gè)不同的構(gòu)造方法撤师。
//例人類構(gòu)造方法[Demo111.java]
public class Demo111{
public static void main(String []args){
Person p1=new Person(12,"順平");//給予不同的初始值,調(diào)用的構(gòu)造方法不同拧揽,構(gòu)造方法雖同名剃盾,但系統(tǒng)會(huì)根據(jù)初始值來選定構(gòu)造方法腺占。
}
}
//定義一個(gè)人類
class Person{
int age;
String name;
//默認(rèn)構(gòu)造方法
public Person(){
}
//構(gòu)造方法的主要用處是:初始化你的成員屬性(變量)
//構(gòu)造方法
public Person(int age,String name){
System.out.println("我是構(gòu)造1");
age=age;
name=name;
}
//構(gòu)造方法2
public Person(String name){
System.out.println("我是構(gòu)造2");
name=name;
}
}
類的默認(rèn)構(gòu)造方法
有些同志可能會(huì)問?親愛的老師痒谴,我們在沒有學(xué)習(xí)構(gòu)造函數(shù)前不是也可以創(chuàng)建對象嗎衰伯?
是這樣的,如果程序員沒有定義構(gòu)造方法闰歪,系統(tǒng)會(huì)自動(dòng)生成一個(gè)默認(rèn)構(gòu)造方法。比如Person類Person (){};
當(dāng)創(chuàng)建一個(gè)Person對象時(shí)Person per1=new Person();默認(rèn)的構(gòu)造函數(shù)就會(huì)被自動(dòng)調(diào)用蓖墅。
類的構(gòu)造方法小結(jié):
1 库倘、構(gòu)造方法名和類名相同;
2 论矾、構(gòu)造方法沒有返回值教翩;
3 、主要作用是完成對新對象的初始化贪壳;
4 饱亿、在創(chuàng)建新對象時(shí),系統(tǒng)自動(dòng)的調(diào)用該類的構(gòu)造方法闰靴;
5 彪笼、一個(gè)類可以有多個(gè)構(gòu)造方法;
6 蚂且、每個(gè)類都有一個(gè)默認(rèn)的構(gòu)造方法配猫。
類定義的改進(jìn)
在提出構(gòu)造方法后,我們類的定義就應(yīng)該更加完善了:
class 類名{ class 類名{ class 類名{
成員變量; 成員變量; 成員變量;
} → 成員方法; → 構(gòu)造方法; → 待定..
} 成員方法
}
1.1.3 this
一個(gè)問題杏死?
請大家看一段代碼:(Demo112.java)
重點(diǎn):this是屬于一個(gè)對象泵肄,不屬于類的。
java虛擬機(jī)會(huì)給每個(gè)對象分配this,代表當(dāng)前對象淑翼。坦白的講腐巢,要明白this不是件容易的事
注意事項(xiàng):this不能在類定義的外部使用,只能在類定義的方法中使用
/*
this的必要性
*/
public class Demo112{
public static void main(String []args){
Dog dog1=new Dog(2,"大黃");
Person p1=new Person(dog1,23,"郭德綱");
Person p2=new Person(dog1,24,"劉謙");
p1.showInfo();
p1.dog.showInfo();
}
}
//定義一個(gè)人類
class Person{
//成員變量
int age;
String name;
Dog dog;//引用類型
public Person(Dog dog,int age,String name){
//可讀性不好
//age=age;
//name=name;
this.age=age; //this.age指this代詞指定是成員變量age
this.name=name; //this.name指this代詞指定是成員變量name
this.dog=dog;
}
//顯示人名字
public void showInfo(){
System.out.println("人名是:"+this.name);
}
}
class Dog{
int age;
String name;
public Dog(int age,String name){
this.age=age;
this.name=name;
}
//顯示狗名
public void showInfo(){
System.out.println("狗名叫"+this.name);
}
}
類變量--提出問題玄括?
提出問題的主要目的就是讓大家思考解決之道冯丙。
public class Demo113{
public static void main(String []args){
/* int total=0;
Child ch1=new Child(3,"妞妞");
ch1.joinGame();
total++;
Child ch2=new Child(4,"小小");
ch2.joinGame();
total++;
*/
Child ch1=new Child(3,"妞妞");
ch1.joinGame();
Child ch2=new Child(4,"小小");
ch2.joinGame();
Child ch3=new Child(5,"大大");
ch3.joinGame();
System.out.println("共有="+Child.total);
}
}
//定義小孩類
class Child{
int age;
String name;
//static公共函數(shù),total是靜態(tài)變量,因此它可以被任何一個(gè)對象訪問
static int total=0;
public Child(int age,String name){
this.age=age;
this.name=name;
}
public void joinGame(){
total++;
System.out.println("有一個(gè)小孩加入了");
}
}
1.1.4 類變量遭京、類方法
什么是類變量银还?
類變量是該類的所有對象共享的變量,任何一個(gè)該類的對象去訪問它時(shí)洁墙,取到的都是相同的值蛹疯,同樣任何一個(gè)該類的對象去修改它時(shí),修改的也是同一個(gè)變量热监。
如何定義類變量捺弦?
定義語法:
訪問修飾符 static 數(shù)據(jù)類型 變量名;
如何訪問類變量?
類名 . 類變量名 或者 對象名 . 類變量名
//類變量的程序演示[Demo114.java]
public class Demo114{
static int i=1;
static{
//該靜態(tài)區(qū)域塊只被執(zhí)行一次
i++;
System.out.println("執(zhí)行一次");
}
public Demo114(){ //建立Demo114()構(gòu)造函數(shù)
System.out.println("執(zhí)行二次");
i++;
}
public static void main(String []args){
Demo114 t1=new Demo114(); //創(chuàng)建t1對象實(shí)例并調(diào)用Demo114函數(shù)
System.out.println(t1.i);
Demo114 t2=new Demo114();
System.out.println(t2.i);
}
}
什么是類方法,為什么有類方法列吼?
類方法是屬于所有對象實(shí)例的幽崩,其形式如下:
訪問修飾符 static 數(shù)據(jù)返回類型 方法名(){}
注意:類方法中不能訪問非靜態(tài)變量(類變量)。
使用:類名 . 類方法名 或者 對象名 . 類方法名
重點(diǎn)static靜態(tài)的方法可以訪問static靜態(tài)變量寞钥,不能訪問非靜態(tài)變量(類變量)
非靜態(tài)方法可以訪問非靜態(tài)變量(類變量)同時(shí)也可以訪問static靜態(tài)變量慌申。
//統(tǒng)計(jì)總學(xué)費(fèi)的程序代碼,加深static靜態(tài)的方法由靜態(tài)變量的訪問[Demo115.java]
public class Demo115{
public static void main(String []args){
//創(chuàng)建一個(gè)學(xué)生
Stu stu1=new Stu(29,"aa",340);
Stu stu2=new Stu(29,"aa",240);
System.out.println(Stu.getTotalFee());
}
}
//學(xué)生類
class Stu{
int age;
String name;
int fee;
static int totalFee;
public Stu(int age,String name,int fee){
this.age=age;
this.name=name;
totalFee+=fee;
}
//返回總學(xué)費(fèi)[這是一個(gè)類方法(靜態(tài)方法)]
//java中規(guī)則:類變量原則上用類方法去訪問或操作
public static int getTotalFee(){
return totalFee;
}
}
類變量小結(jié)
1理郑、什么時(shí)候需要用類變量
案例[Demo115.java]:定義學(xué)生類蹄溉,統(tǒng)計(jì)學(xué)生共交多少錢?
用類變量您炉,屬于公共的屬性
2柒爵、類變量與實(shí)例變量區(qū)別:
加上static稱為類變量或靜態(tài)變量,否則稱為實(shí)例變量
類變量是與類相關(guān)的赚爵,公共的屬性
實(shí)例變量屬于每個(gè)對象個(gè)體的屬性
類變量可以通過 [類名 . 類變量名] 直接訪問
類方法小結(jié)
1棉胀、什么時(shí)候需要用類方法
案例[Demo115.java]:定義學(xué)生類,統(tǒng)計(jì)學(xué)生共交多少錢冀膝?
類方法屬于與類相關(guān)的唁奢,公共的方法
實(shí)例方法屬于每個(gè)對象個(gè)體的方法
類方法可以通過 [類名 . 類方法名] 直接訪問
java 面向?qū)ο缶幊痰乃拇筇卣?/strong>
抽象/封裝/繼承/多態(tài)
1 抽象 :
1、簡單理解
我們在前面去定義一個(gè)類時(shí)候窝剖,實(shí)際上就是把一類事物的共有的屬性和行為提取出來驮瞧,形成一個(gè)物理模型(模版)。這種研究問題的方法稱為抽象枯芬。
封裝--什么是封裝
封裝就是把抽象出來的數(shù)據(jù)和對數(shù)據(jù)的操作封裝在一起论笔,數(shù)據(jù)被保護(hù)在內(nèi)部,程序的其它部分只有通過被授權(quán)的操作(成員方法)千所,才能對數(shù)據(jù)進(jìn)行操作狂魔。
封裝--訪問控制修飾符
電視機(jī)的開關(guān),對音量淫痰,顏色最楷,頻道的控制是公開的,誰都可以操作待错,但是對機(jī)箱后蓋籽孙,主機(jī)板的操作卻不是公開的,一般是由專業(yè)維修人員來玩火俄。那么java中如何實(shí)現(xiàn)這種類似的控制呢犯建?不能隨便查看人的年齡,工資等隱私[Demo116.java]
//封裝案例[Demo116.java]
public class Demo116{
public static void main(String []args){
//創(chuàng)建一個(gè)職員
Clerk clerk1=new Clerk("小花",24,4567.6f);
System.out.println("名字是"+clerk1.name+"薪水"+clerk1.getSal());
}
}
//職員
class Clerk{
public String name;
//private私有的瓜客,public公有的
private int age;
private float salary;
public Clerk(String name,int age,float sal){
this.name=name;
this.age=age;
this.salary=sal;
}
//通過一個(gè)成員方法去控制和訪問私有的屬性
public float getSal(){
return this.salary;
}
}
2. 封裝 -- 訪問控制修飾符 :
java提供四種訪問控制修飾符號控制方法和變量的訪問權(quán)限:
1 适瓦、公開級別:用public修飾竿开,對外公開
2 、受保護(hù)級別:用protected修飾玻熙,對子類和同一個(gè)包中的類公開
3 否彩、默認(rèn)級別:沒有修飾符號,向同一個(gè)包的類公開
4 嗦随、私有級別:用private修飾列荔,只有類本身可以訪問,不對外公開
包--必要性
問題的提出枚尼,請看下面的一個(gè)場景[eclipse]
現(xiàn)在有兩個(gè)程序員共同開發(fā)一個(gè)java項(xiàng)目贴浙,程序員xiaoming希望定義一個(gè)類取名Dog,程序員xiaoqiang也想定義一個(gè)類也叫Dog姑原。兩個(gè)程序員為此還吵了起來悬而,怎么辦呜舒?
包 -- 三大作用
1锭汛、區(qū)分相同名字的類
2、當(dāng)類很多時(shí)袭蝗,可以很好的管理類
3唤殴、控制訪問范圍
包 -- 換包命令
package com. 自定義名字;
注意:打包命令一般放在文件開始處。
包--命名規(guī)范
小寫字母 比如 com.sina.shunping
包--常用的包
一個(gè)包下到腥,包含很多的類朵逝,java中常用的包有:
java.lang.* 包 自動(dòng)引入 java.util.* 工具包
java.net.* 包 網(wǎng)絡(luò)開發(fā)包 java.awt.* 包 窗口工具包
包--如何引入包
語法:import 包;
比如import java.awt.*;
我們引入一個(gè)包的主要目的要使用該包下的類
定義類的改進(jìn)
在提出包后,我們類的定義就更加完善了:
class 類名{ class 類名{ class類名{ package包名; 待定..
成員變量; → 成員變量; → 成員變量; → class 類名{ →
} 成員方法; 構(gòu)造方法; 成員變量;
} 成員方法; 構(gòu)造方法;
} 成員方法;
}
3繼承--為什么有乡范?
//功能:說明繼承的重要性
package com.abc;//包名
public class Demo117 {
public static void main(String[] args) {
Pupil p1=new Pupil();
p1.printName();
}
}
//將學(xué)生的共有屬性提取配名,做一個(gè)父類
class Stu{
//定義成員屬性
protected int age;
public String name;
public float fee;
private String job;//私有將不被繼承
//編程中,如果你不希望子類繼承某個(gè)屬性或方法
//則將其聲明為private即可
public void printName(){
System.out.println("名字"+this.name);
}
}
//小學(xué)生類
class Pupil extends Stu{
//交學(xué)費(fèi)
public void pay(float fee){
this.fee=fee;
}
}
//幼兒
class Pre extends Pupil{
//交學(xué)費(fèi)
public void pay(float fee){
this.fee=fee*1.5f;
}
}
//中學(xué)生類
class MiddleStu extends Stu{
//交學(xué)費(fèi)
public void pay(float fee){
this.fee=fee*0.8f;
}
}
//大學(xué)生類
class ColStu extends Stu{
//交學(xué)費(fèi)
public void pay(float fee){
this.fee=fee*0.1f;
}
}
繼承 -- 解決之道
繼承可以解決代碼復(fù)用晋辆,讓我們的編程更加靠近人類思維渠脉。當(dāng)多個(gè)類存在相同的屬性(變量)和方法時(shí),可以從這些類中抽象出父類(比如剛才的Student)瓶佳,在父類中定義這些相同的屬性和方法芋膘,所有的子類不需要重新定義這些屬性和方法,只需要通過extends語句來聲明繼承父類:
語法:class 子類 extends 父類
這樣霸饲,子類就會(huì)自動(dòng)擁有父類定義的某些屬性和方法为朋。
繼承--深入討論
1、父類的哪些屬性(變量)厚脉、方法被子類繼承了习寸?并不是父類的所有屬性、方法都可以被子類繼承
父類 子類
public 屬性; public 屬性;
protected 屬性; 繼承 protected 屬性;
private 屬性; → 屬性;
屬性;
public 方法; public 方法;
protected 方法; protected 方法;
private 方法; 方法;
方法;
2傻工、結(jié)論
從圖可以看出融涣,父類的public修飾符的屬性和方法童番;protected修飾符的屬性和方法;默認(rèn)修飾符屬性和方法被子類繼承了威鹿,父類的private修飾符的屬性和方法不能被子類繼承剃斧。
繼承--注意事項(xiàng)
1、子類最多只能繼承一個(gè)父類(指直接繼承)
2忽你、java所有類都是Object類的子類 (所有的子類都可以逐級繼承幼东,例:爺->父->子->孫)
3、JDK6中有202個(gè)包3777個(gè)類科雳、接口根蟹、異常、枚舉糟秘、注釋和錯(cuò)誤
4简逮、在做開發(fā)的時(shí)候,強(qiáng)烈建議大家多查jdk幫助文檔
5尿赚、在使用類時(shí)散庶,實(shí)在不知道怎么辦,多使用搜索引擎
4. 定義類的改進(jìn) :
在提出包后凌净,我們類的定義就更加完善了:
class 類名{ class 類名{ class類名{ package包名;
成員變量; → 成員變量; → 成員變量; → class 類名{
} 成員方法; 構(gòu)造方法; 成員變量;
} 成員方法; 構(gòu)造方法;
} 成員方法;
} ↓
↓←←←←←←←←←←←←←←←←←←←←←←←←←
package 包名;
class 類名 extends 父類{ 待定
成員變量; → ....
構(gòu)造方法;
成員方法;
}
1.1.5 方法重載(overload)和方法覆蓋(override)
1 方法重載 (overload)
按順序悲龟,我們應(yīng)該講解多態(tài),但是在講解多態(tài)前冰寻,我們必須講解方法重載和方法覆蓋(override)须教。
請編寫一個(gè)類(Abc),編寫方法可以接收兩個(gè)整數(shù)斩芭,返回兩個(gè)數(shù)中較大的數(shù)[Demo119.java]
//方法重載(overload)getMax
public class Demo119{
public static void main(String []args){
Abc2 abc1=new Abc2();
System.out.println(abc1.getMax(12,14));
System.out.println(abc1.getMax(24f,20f));
}
}
class Abc2{
//返回較大的整數(shù)
public int getMax(int i,int j){
if(i>j){
return i;
}else{
return j;
}
}
public float getMax(float a,float b){
if(a>b){
return a;
}else{
return b;
}
}
//如果只是返回類型不一樣轻腺,能否構(gòu)成重載?不能夠構(gòu)成重載
/* public double getMax(float d,double c){
if(c>d){
return c;
}else{
return d;
}
}
//如果只是控制訪問修飾符不同划乖,能否構(gòu)成重載贬养?不能夠構(gòu)成重載
protected float getMax(float c,float d){
if(c>d){
return c;
}else{
return d;
}
}*/
}
方法重載(overload) 概念
簡單的說:方法重載就是在類的同一種功能的多種實(shí)現(xiàn)方式,到底采用哪種方式迁筛,取決于調(diào)用者給出的參數(shù)煤蚌。
注意事項(xiàng):
1、方法名相同
2细卧、方法的參數(shù)類型尉桩,個(gè)數(shù),順序至少有一項(xiàng)不同
3贪庙、方法返回類型可以不同(只是返回類型不一樣蜘犁,不能構(gòu)成重載)
4、方法的修飾符可以不同(只是控制訪問修飾符不同止邮,不能構(gòu)成重載)
2 方法覆蓋 (override)
既然子類可以繼承父類的屬性和方法这橙,這樣可以提高代碼的復(fù)用性奏窑,這個(gè)很好,可是問題來了屈扎,假設(shè)現(xiàn)在我要求大家寫三個(gè)類貓貓埃唯,狗狗,豬豬鹰晨。我們知道這三個(gè)東東都是動(dòng)物墨叛,動(dòng)物必然存在相同的特點(diǎn)。根據(jù)類的抽象特征模蜡,我們可以把它們的相同點(diǎn)提取出來漠趁,形成一個(gè)父類,然后繼承忍疾。
//子類方法覆蓋父類方法[Demo120.java]
public class Demo120{
public static void main(String []args){
//創(chuàng)建一只貓
Cat cat1=new Cat();
cat1.cry();
Dog dog1=new Dog();
dog1.cry();
}
}
//動(dòng)物類
class Animal{
int age;
String name;
//都會(huì)叫
public void cry(){
System.out.println("我是動(dòng)物闯传,不知道怎么叫");
}
}
//貓貓類
class Cat extends Animal{
//覆蓋父類方法
public void cry(){
System.out.println("貓貓叫!");
}
}
//狗狗類
class Dog extends Animal{
//覆蓋父類方法
public void cry(){
System.out.println("汪汪叫!");
}
}
方法覆蓋(override)概念
簡單的說:方法覆蓋就是子類有一個(gè)方法,和父類的某個(gè)方法的名稱卤妒、返回類型甥绿、參數(shù)一樣,那么我們就說子類的這個(gè)方法覆蓋了父類的那個(gè)方法荚孵。比如上個(gè)案例的Cat類中的cry方法就覆蓋了Animal類的cry方法妹窖。
注意事項(xiàng):
方法覆蓋有很多條件纬朝,有些書上說的比較細(xì)收叶,總的講有兩點(diǎn)一定注意:
1、子類的方法的返回類型共苛,參數(shù)判没,方法名稱,要和父類的返回類型隅茎,參數(shù)澄峰,方法名稱完全一樣,否則編譯出錯(cuò)辟犀。
2俏竞、子類方法不能縮小父類方法的訪問權(quán)限。
===============================================================================
作業(yè):上機(jī)實(shí)習(xí)題目
1堂竟、Josephu問題(丟手帕問題)
Josephu問題為:設(shè)編號為1,2,...n的n個(gè)人圍坐一圈魂毁,約定編號為k(1<=k<=n)的人從1開始報(bào)數(shù),數(shù)到m的那個(gè)人出列出嘹,它的下一位又從1開始報(bào)數(shù)席楚,數(shù)到m的那個(gè)人又出列,依次類推税稼,直到所有人出列為止烦秩,由此產(chǎn)生一個(gè)出隊(duì)編號的序列垮斯。
提示:用一個(gè)不帶頭結(jié)點(diǎn)的循環(huán)鏈表來處理Josephu問題:先構(gòu)成一個(gè)有n個(gè)結(jié)點(diǎn)的單循環(huán)鏈表,然后由k結(jié)點(diǎn)起從1開始計(jì)數(shù)只祠,計(jì)到m時(shí)兜蠕,對應(yīng)結(jié)點(diǎn)的人從鏈表中刪除,然后再從被刪除結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)又從1開始計(jì)數(shù)抛寝,直到最后一個(gè)結(jié)點(diǎn)從鏈表中刪除算法結(jié)束牺氨。
//Josephu問題(丟手帕問題)
//使用單向鏈表
public class Demo121 {
public static void main(String[] args) {
CycLink cyclink=new CycLink();
cyclink.setLen(5);//鏈表長度
cyclink.createLink();
cyclink.setK(2);//從第幾個(gè)人開始數(shù)
cyclink.setM(2);//數(shù)幾下
cyclink.show();
cyclink.play();
}
}
class Child{
int no;
Child nextChild=null;
public Child(int no){
//給一個(gè)編號
this.no=no;
}
}
//單向環(huán)形鏈表
class CycLink{
//先定義一個(gè)指向鏈表第一個(gè)小孩的引用
//指向第一個(gè)小孩的引用,不能動(dòng)
Child firstChild=null;
Child temp=null;
int len=0;//表示共有多少個(gè)小孩
int k=0;
int m=0;
//設(shè)置m數(shù)幾下
public void setM(int m){
this.m=m;
}
//設(shè)置環(huán)形鏈表大小
public void setLen(int len){
this.len=len;
}
//設(shè)置從第幾個(gè)人開始數(shù)數(shù)
public void setK(int k){
this.k=k;
}
//開始play
public void play(){
Child temp=this.firstChild;
//1.先找到開始數(shù)數(shù)的人
for(int i=1;i<k;i++){
temp=temp.nextChild;
}
while(this.len!=1){
//2.數(shù)m下
for(int j=1;j<m;j++){
temp=temp.nextChild;
}
//找到要出圈的前一個(gè)小孩
Child temp2=temp;
while(temp2.nextChild!=temp){
temp2=temp2.nextChild;
}
//3.將數(shù)到m的小孩墩剖,退出圈
temp2.nextChild=temp.nextChild;
//讓temp指向下一個(gè)數(shù)數(shù)的小孩
temp=temp.nextChild;
this.len--;
}
//最后一個(gè)小孩
System.out.println("最后出圈的小孩:"+temp.no);
}
//初始化單向環(huán)形鏈表
public void createLink(){
for(int i=1;i<=len;i++){
if(i==1){
//創(chuàng)建第一個(gè)小孩
Child ch=new Child(i);
this.firstChild=ch;
this.temp=ch;
}else{
//創(chuàng)建最后一個(gè)小孩
if(i==len){
Child ch=new Child(i);
temp.nextChild=ch;
temp=ch;
temp.nextChild=this.firstChild;
}else{
//繼續(xù)創(chuàng)建小孩
Child ch=new Child(i);
temp.nextChild=ch;
temp=ch;
}
}
}
}
//打印該環(huán)形鏈表
public void show(){
//定義一個(gè)跑龍?zhí)? Child temp=this.firstChild;
do{
System.out.print(temp.no+" ");
temp=temp.nextChild;
}while(temp!=this.firstChild);
}
}
1.1.6 四大特征
1多態(tài)-- 概念
所謂多態(tài)猴凹,就是指一個(gè)引用(類型)在不同情況下的多種狀態(tài)。也可以理解成:多態(tài)是指通過指向父類的指針岭皂,來調(diào)用在不同子類中實(shí)現(xiàn)的方法郊霎。
實(shí)現(xiàn)多態(tài)有兩種方式:1、繼承爷绘;2书劝、接口
多態(tài)演示[Dome122.java]
//演示繼承、方法覆蓋土至、多態(tài)
public class Demo122 {
public static void main(String[] args) {
//非多態(tài)演示
Cat cat=new Cat();
cat.cry();
Dog dog=new Dog();
dog.cry();
//多態(tài)演示
Animal an=new Cat();
an.cry();
an=new Dog();
an.cry();
}
}
//動(dòng)物類
class Animal{
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//動(dòng)物會(huì)叫
public void cry(){
System.out.println("不知道怎么叫");
}
}
//創(chuàng)建Dog子類并繼承Animal父類及覆蓋cry方法
class Dog extends Animal{
//狗叫
public void cry(){
System.out.println("汪汪叫");
}
}
class Cat extends Animal{
//貓自己叫
public void cry(){
System.out.println("貓貓叫");
}
}
2 多重多態(tài)演示[Dome123.java]
//演示子類繼承父類购对、方法覆蓋、多態(tài)方法
public class Demo123 {
public static void main(String[] args) {
//非多態(tài)演示
System.out.println("非多態(tài)演示:");
Cat cat=new Cat();
cat.cry();
Dog dog=new Dog();
dog.cry();
System.out.println();
//多態(tài)演示
System.out.println("多態(tài)演示:");
Animal an=new Cat();
an.cry();
an=new Dog();
an.cry();
System.out.println();
//多重多態(tài)演示
System.out.println("多重多態(tài)演示:");
Master master=new Master();
master.feed(new Dog(),new Bone());
master.feed(new Cat(),new Fish());
}
}
//主人類
class Master{
//給動(dòng)物喂食物陶因,使用多態(tài)骡苞,只要寫一個(gè)方法
public void feed(Animal an,Food f){
an.eat();
f.showName();
}
}
//食物父類
class Food{
String name;
public void showName(){
System.out.println("食物");
}
}
//食物魚子類
class Fish extends Food{
public void showName(){
System.out.println("魚");
}
}
//食物骨頭子類
class Bone extends Food{
public void showName(){
System.out.println("骨頭");
}
}
//動(dòng)物類Animal父類
class Animal{
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//動(dòng)物會(huì)叫
public void cry(){
System.out.println("不知道怎么叫");
}
//動(dòng)物吃東西
public void eat(){
System.out.println("不知道吃什么");
}
}
//創(chuàng)建Dog子類并extends繼承Animal父類及覆蓋cry方法
class Dog extends Animal{
//狗叫
public void cry(){
System.out.println("汪汪叫");
}
//狗吃東西
public void eat(){
System.out.println("狗愛吃骨頭");
}
}
class Cat extends Animal{
//貓自己叫
public void cry(){
System.out.println("貓貓叫");
}
//貓吃東西
public void eat(){
System.out.println("貓愛吃魚");
}
}
3 多態(tài) -- 注意事項(xiàng):
1、java允許父類的引用變量引用它的子類的實(shí)例(對象)
Animal an=new Cat();//這種轉(zhuǎn)換時(shí)自動(dòng)完成的
2楷扬、關(guān)于類型轉(zhuǎn)換還有一些具體的細(xì)節(jié)要求解幽,我們在后面還要提,比如子類能不能轉(zhuǎn)換成父類烘苹,有什么要求等等...
1.1.7 抽象類
1 抽象類 -- 解決之道
當(dāng)父類的一些方法不能確定時(shí)躲株,可以用abstract關(guān)鍵字來修飾該方法[抽象方法],用abstract來修飾該類[抽象類]镣衡。
//抽象類的必要性[Demo124.java]
public class Demo124 {
public static void main(String[] args) {
//Animal an=new Animal();抽象類不允許實(shí)例化
Animal an=new Cat();
an.cry();
an=new Dog();
an.cry();
}
}
//抽象類abstract關(guān)鍵詞
abstract class Animal{
String name;
int age;
//動(dòng)物會(huì)叫霜定,使用了abstract抽象方法
abstract public void cry();//抽象類中可以沒有abstract抽象方法
//抽象類內(nèi)可以有實(shí)現(xiàn)方法
public void sx(){
System.out.println("實(shí)現(xiàn)方法");
}
}
//當(dāng)一個(gè)子類繼承的父類是abstract抽象類的話,需要程序員把抽象類的抽象方法全部實(shí)現(xiàn)廊鸥。
class Cat extends Animal{
//實(shí)現(xiàn)父類的cry望浩,其實(shí)類似上節(jié)學(xué)習(xí)中的子類覆蓋父類
public void cry(){
System.out.println("貓貓叫");
}
}
class Dog extends Animal{
//實(shí)現(xiàn)父類的cry,其實(shí)類似上節(jié)學(xué)習(xí)中的子類覆蓋父類
public void cry(){
System.out.println("汪汪叫");
}
}
2 抽象類 -- 深入討論
抽象類是java中一個(gè)比較重要的類黍图。
1 曾雕、用abstract關(guān)鍵字來修飾一個(gè)類時(shí),這個(gè)類就是抽象類助被。
2 剖张、用abstract關(guān)鍵字來修飾一個(gè)方法時(shí)切诀,這個(gè)方法就是抽象方法。
3 搔弄、abstract抽象類中的abstract抽象方法是不允許在抽象類中實(shí)現(xiàn)的幅虑,一旦實(shí)現(xiàn)就不是抽象方法和抽象類了。abstract抽象方法只能在子類中實(shí)現(xiàn)顾犹。
4 倒庵、抽象類中可以擁有實(shí)現(xiàn)方法。
5炫刷、抽象方法在編程中用的不是很多擎宝,但是在公司筆試時(shí),卻是考官比較愛問的知識點(diǎn)浑玛。
3 抽象類****--****注意事項(xiàng)
1 绍申、抽象類不能被實(shí)例化
2 、抽象類不一定要包含abstract方法顾彰。也就是說极阅,抽象類可以沒有abstract抽象方法。
3 涨享、一旦類包含了abstract抽象方法筋搏,則這個(gè)類必須聲明為abstract抽象類。
4 厕隧、抽象方法不能有主體奔脐。
正確的抽象方法例:abstract void abc();
錯(cuò)語的抽象方法例:abstract void abc(){}
1.1.8 接口
1 接口 -- 為什么有?
USB插槽就是現(xiàn)實(shí)中的接口栏账。
什么是接口帖族?
接口就是給出一些沒有內(nèi)容的方法栈源,封裝到一起挡爵,到某個(gè)類要使用的時(shí)候,在根據(jù)具體情況把這些方法寫出來甚垦。
接口的建立語法:interface 接口名 { 方法;}
語法:class 類名 implements 接口 {
方法;
變量;
}
小結(jié):接口是更加抽象的抽象的類茶鹃,抽象類里的方法可以有方法體,接口里的所有方法都沒有方法體艰亮。接口體現(xiàn)了程序設(shè)計(jì)的多態(tài)和高內(nèi)聚低偶合的設(shè)計(jì)思想闭翩。
2 接口 -- 注意事項(xiàng)
1、接口不能被實(shí)例化
2迄埃、接口中所有的方法都不能有主體疗韵。錯(cuò)誤語法例:void aaa(){}←(注意不能有花括號)
接口可以看作更加抽象的抽象類。
3侄非、一個(gè)類可以實(shí)現(xiàn)多個(gè)接口
4蕉汪、接口中可以有變量[但變量不能用private和protected修飾]
a流译、接口中的變量,本質(zhì)上都是static的而且是final類型的者疤,不管你加不加static修飾
b福澡、在java開發(fā)中,我們經(jīng)常把常用的變量驹马,定義在接口中革砸,作為全局變量使用
訪問形式:接口名 . 變量名
5、一個(gè)接口不能繼承其它的類糯累,但是可以繼承別的接口
//接口的實(shí)現(xiàn)[Demo125.java]
//電腦算利,相機(jī),u盤泳姐,手機(jī)
//usb接口
interface Usb{
int a=1;//加不加static都是靜態(tài)的笔时,不能用private和protected修飾
//聲明了兩個(gè)方法
public void start();//接口開始工作
public void stop();//接口停止工作
}
//編寫了一個(gè)相機(jī)類,并實(shí)現(xiàn)了usb接口
//一個(gè)重要的原則:當(dāng)一個(gè)類實(shí)現(xiàn)了一個(gè)接口仗岸,要求該類把這個(gè)接口的所有方法全部實(shí)現(xiàn)
class Camera implements Usb{
public void start(){
System.out.println("我是相機(jī)允耿,開始工作了..");
}
public void stop(){
System.out.println("我是相機(jī),停止工作了..");
}
}
//接口繼承別的接口
class Base{
}
interface Tt{
}
interface Son extends Tt{
}
//編寫了一個(gè)手機(jī)扒怖,并實(shí)現(xiàn)了usb接口
class Phone implements Usb{
public void start(){
System.out.println("我是手機(jī)较锡,開始工作了..");
}
public void stop(){
System.out.println("我是手機(jī),停止工作了..");
}
}
//計(jì)算機(jī)
class Computer{
//開始使用usb接口
public void useUsb(Usb usb){
usb.start();
usb.stop();
}
}
public class Demo125 {
public static void main(String[] args) {
System.out.println(Usb.a);
//創(chuàng)建 Computer
Computer computer=new Computer();
//創(chuàng)建Camera
Camera camera1=new Camera();
//創(chuàng)建Phone
Phone phone1=new Phone();
computer.useUsb(camera1);
computer.useUsb(phone1);
}
}
3 定義類的改進(jìn)
有了接口盗痒,我們類的定義就更加完善了:
class 類名{ class 類名{ class類名{ package包名;
成員變量; → 成員變量; → 成員變量; → class 類名{
} 成員方法; 構(gòu)造方法; 成員變量;
} 成員方法; 構(gòu)造方法;
} 成員方法;
} ↓
↓←←←←←←←←←←←←←←←←←←←←←←←←←
package 包名; package 包名;
class 類名 extends 父類{ class 類名 extends 父類 implements 接口名{
成員變量; → 成員變量;
構(gòu)造方法; 構(gòu)造方法;
成員方法; 成員方法;
} }
4 實(shí)現(xiàn)接口VS繼承類
java的繼承是單繼承蚂蕴,也就是一個(gè)類最多只能有一個(gè)父類,這種單繼承的機(jī)制可保證類的純潔性俯邓,比C++中的多繼承機(jī)制簡潔骡楼。但是不可否認(rèn),對子類功能的擴(kuò)展有一定影響稽鞭。所以:
1鸟整、實(shí)現(xiàn)接口可以看作是對繼承的一種補(bǔ)充。(繼承是層級式的朦蕴,不太靈活篮条。修改某個(gè)類就會(huì)打破繼承的平衡,而接口就沒有這樣的麻煩吩抓,因?yàn)樗会槍?shí)現(xiàn)接口的類才起作用)
2掉分、實(shí)現(xiàn)接口可在不打破繼承關(guān)系的前提下传趾,對某個(gè)類功能擴(kuò)展狂打,非常靈活牡借。
//實(shí)例:建立子類并繼承了父類且連接多個(gè)接口[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("猴子會(huì)跳!");
}
}
//建立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接口!");
}
}
5 用接口實(shí)現(xiàn)多態(tài)--案例[Demo127.java]
java中多態(tài)是個(gè)難以理解的概念,但同時(shí)又是一個(gè)非常重要的概念。java三大特性之一(繼承钳垮,封裝除师,多態(tài)),我們可以從字面上簡單理解:就是一種類型的多種狀態(tài)扔枫,以下通過賣小汽車的例子說明什么是多態(tài)汛聚。
//用接口實(shí)現(xiàn)多態(tài)
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();
//獲得汽車售價(jià)
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()+"單價(jià):"+car.getPrice
());
//增加賣出車售價(jià)的收入
money+=car.getPrice();
}
//售車總收入
public int getMoney(){
return money;
}
}
運(yùn)行結(jié)果:
車型:BMW 單價(jià):300000
車型:CheryQQ 單價(jià):20000
總收入:320000
繼承是多態(tài)得以實(shí)現(xiàn)的基礎(chǔ)。從字面上理解短荐,多態(tài)就是一種類型(都是Car類型)表現(xiàn)出多種狀態(tài)(寶馬汽車的名稱是BMW倚舀,售價(jià)是300000;奇瑞汽車的名稱是CheryQQ忍宋,售價(jià)是2000)痕貌。將一個(gè)方法調(diào)用同這個(gè)方法所屬的主體(也就是對象或類)關(guān)聯(lián)起來叫做綁定,分前期綁這下和后期綁定兩種糠排。下面解釋一下它們的定義:
1 舵稠、前期綁定:在程序運(yùn)行之前進(jìn)行綁定,由編譯器和連接程序?qū)崿F(xiàn)入宦,又叫做靜態(tài)綁定哺徊。比如static方法和final方法,注意乾闰,這里也包括private方法落追,因?yàn)樗请[式final的。
2 涯肩、后期綁定:在運(yùn)行時(shí)根據(jù)對象的類型進(jìn)行綁定轿钠,由方法調(diào)用機(jī)制實(shí)現(xiàn),因此又叫做動(dòng)態(tài)綁定病苗,或者運(yùn)行時(shí)綁定疗垛。除了前期綁定外的所有方法都屬于后期綁定。
多態(tài)就是在后期綁定這種機(jī)制上實(shí)現(xiàn)的硫朦。多態(tài)給我們帶來的好處是消除了類之間的偶合關(guān)系贷腕,使程序更容易擴(kuò)展。比如在上例中阵幸,新增加一種類型汽車的銷售花履。只需要讓新定義的類實(shí)現(xiàn)Car類并實(shí)現(xiàn)它的所有方法,而無需對原有代碼做任何修改挚赊,CarShop類的sellCar(Car
car)方法就可以處理新的車型了。
新增代碼如下:
java代碼
//桑塔納汽車
class Santana implements Car{
public String getName(){
return "Santana";
}
public int getPrice(){
return 80000;
}
}
1.1.9 final
final概念
final中文意思:最后的济瓢,最終的荠割。
final可以修飾變量或者方法。
在某些情況下,程序員可能有以下需求:
1 蔑鹦、當(dāng)不希望父類的某個(gè)方法被子類覆蓋(override)時(shí)夺克,可以用final關(guān)鍵字修飾。
2 嚎朽、當(dāng)不希望類的某個(gè)變量的值被修改铺纽,可以用final修飾。如果一個(gè)變量是final哟忍,則必須賦初值狡门,否則編譯出錯(cuò)。
3 锅很、當(dāng)不希望類被繼承時(shí)其馏,可以用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爆安。定義類型后應(yīng)賦值
//圓周率不讓修改
//帶有final修飾的變量命名時(shí)應(yīng)有_下劃線來區(qū)分表示叛复。這是java程序員的標(biāo)準(zhǔn)。
final float reate_1=3.1415926f;//使用final可以保證扔仓,需要強(qiáng)制不被修改的數(shù)據(jù)一定要用final鎖定
//final int b; //使用final定義變量時(shí)一定要賦初值否則報(bào)錯(cuò)褐奥。
//b=1;
final public void sendMes(){//給成員方法用final來修飾則表示不可以被修改,不可被覆蓋翘簇。
System.out.println("發(fā)送消息");
}
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("發(fā)送消息")
}*/
}
final-- 注意事項(xiàng)
1抖僵、final修飾的變量又叫常量,一般用XX_XX_XX來命名缘揪。(帶下劃線)
2耍群、final修飾的變量在定義時(shí),必須賦值找筝,并且以后不能再賦值蹈垢。
final-- 什么時(shí)候用
1、因?yàn)榘咐目紤]袖裕,類的某個(gè)方法不允許修改曹抬。
2、類不會(huì)被其它的類繼承急鳄。
3谤民、某些變量值是固定不變的,比如圓周率3.1415926