Java面向物件-封裝與繼承
阿新 • • 發佈:2021-01-20
面向物件的三個特徵:
封裝,繼承和多型
封裝:將類的某些資訊隱藏在類的內部,不允許外部直接訪問,而是通過該類提供的方法對隱藏資訊進行寫入和讀出;
封裝是通過private來隱藏屬性,通過setter來寫入(加入限制條件),通過getter來讀出;
隱藏+寫入的話:
public class Person{
Private String sex;
public void setSex(String sex){
if(sex.equals("男")||sex.equals("女")){
this.sex=sex;
} else{
System.out.println("輸入不合法!");
}
public String getSex(){
return this.sex;
}
}
呼叫的話:
public class Diaoyong{
Person a=new Person();
a.setSex("男");
System.out.println(a.getSex);
}
包:
包的命名:通常使用組織的網路域名的逆序,後面加上部門名、機構名、專案名等;如cn.kgc.kb11
package的申明和匯入其它包中的類的話:
其中包的申明必須位於第一行:
package cn.kgc.kb11;
public class Diaoyong{
Person a=new Person();
a.setSex("男");
System.out.println(a.getSex);
}
import cn.kgc.kb11.Diaoyong;
public class Diaoyong2{
Person a=new Person();
a.setSex("男");
System.out.println(a.getSex);
}
static關鍵字:
靜態方法不能直接呼叫普通方法和普通屬性,需要用物件.方法/屬性來呼叫;
public class Person{
public static String name;
public static void work(String name){
System.out.println(name);
}
}
public class PersonTest{
Person.name="abc";
Person.work(abc);
}
static程式碼塊
靜態程式碼塊,當Java虛擬機器載入類時,就會預設執行一次。而且只有第一次載入時預設執行,後面載入時不預設執行了,不過引用執行還是會執行的
public class StaticTest{
static int num=100;
static{
num+=100;
System.out.println(num);
}
static{
num+=100;
System.out.println(num);
}
}
public class PersonTest{
StaticTest st1=new StaticTest();
StaticTest st2=new StaticTest();
System.out.println(StaticTest.num);
}
繼承:新類可以在不增加程式碼的情況下,通過extends來繼承已有類的屬性和方法,來充實自己的內容。該新類為子類,已有的類為父類。
(不能被繼承的父類成員:private成員,構造方法,子類與父類在不同的包中而使用預設訪問許可權的成員)
子類訪問父類成員:
- 訪問父類構造方法:
super();
super(name); - 訪問父類屬性:
super.name; - 訪問父類方法:
super.print();
super關鍵字代表父類的意思,訪問父類構造方法時需要在構造方法的第一行;不能訪問private成員;
繼承條件下構造方法的呼叫規則:
- 子類構造方法沒有通過super顯示呼叫父類的有殘構造方法,也沒通過this顯示呼叫自身其他構造方法,則系統預設呼叫父類的無參構造方法;
- 子類構造方法通過super顯示呼叫父類的有參構造方法,則執行父類相應構造方法,而不執行父類無參構造方法
- 子類構造方法通過this顯示呼叫自身的其它構造方法,在相應的構造方法中應用以上兩條規則
多型:通過多個子類各自的方法重寫,使得該方法在處理不同物件時,輸出不同的結果;
以下將父類當做返回值型別:
class Host{
public Animal donateAnimal(String type){//該方法donateAnimal的返回值型別為Animal,
返回值animal也可以(當做變數賦值)賦給不同的子型別;
Animal animal;
if(type=="dog"){
animal=new Dog();
}else if(type=="cat"){
animal=new Cat();
}else{
animal=new Duck();
}
return animal;
}
}
public class Test{
public static void main(String[]args){
Host host=new Host();//新建Host物件,用來引用Host的方法;
Animal animal;//新建animal物件,接收Host方法傳出來的animal某個子類物件!好他媽繞
animal=host.donateAnimal("");
animal.cry();
animal=host.donateAnimal("");
animal.cry();
}
}