對Java面向物件程式設計的知識點(封裝、繼承,多型)進行總結
一 封裝
1.面向物件的高階:優化程式設計
封裝:
類中如何定義成員變數?
private int num;
概念
語法
3步驟
繼承:減少冗餘程式碼
繼承:一個類(子類)繼承另一個類(父類)
概念
語法
extends
過載??
final(修飾符)
static(main方法,static)
多型:
一種事物的多種表現形式
概念
語法
Father fa=new Son();//例項化
//Son son=new Son();
介面:代表能力,一種約定。
implement interface
Java語言就是使用面向物件開發出來的。
Date 時間
Calendar 日曆
Math
包裝類 Integer Double Short Float Boolean
集合(不同結構不同使用)
異常 (Exception)
檔案!IO流
記憶體(基本資料型別的變數中,引用資料型別的變數中應用)
int num=9;
String str="admin";
Student stu=new Student();
int[] nums={};
Student[] stus=new Student[10];
寫入
記憶體---------》檔案
《--------
讀取
3.封裝
隱藏成員變數
1.隱藏成員變數
將成員變數前加入修飾符private
結果:其他類在建立狗的物件的時候,在呼叫成員變數時顯示錯誤。
The field Dog.name is not visible
2.建立公有的getter/setter方法
在此類中建立公有方法
建立成員變數的賦值方法
public void setName(String name1){
}
注意:1.方法名稱必須是set+成員變數第一個單詞首字母大寫的成員變數名稱
2.方法的引數必須是成員變數的型別
成員變數的取值方法
public String getName(){
return name;//返回成員變數值
}
注意:1.方法名稱必須是get+成員變數第一個單詞首字母大寫的成員變數名稱
2.方法的返回值必須是成員變數的型別(返回的是成員變數裡面的值)
3.在setter/getter方法中給加入屬性控制
4.setter方法的引數名稱和成員變數名稱保持一致。(防止亂起名字)
this.name=name;
5.在本類中呼叫自己的成員變數和成員方法的時候,使用this
this代表當前物件
6.特殊方法的第一種。
構造方法:例項化--》建立物件+物件賦成員變數值
Constructor
語法
publlic 類名(){
}
public Dog(){
}
1,建立類的時候都會有一個隱藏的無參構造方法。
2,建立物件的時候就會調相應的構造方法。
3,構造方法由於方法名稱相同,因此構造方法的引數定義時注意,
不要兩個構造方法的傳遞引數一致(順序 型別 個數)。
4,當你在類中定義有參構造方法,隱藏的無參構造方法失效。
因此必須在類中顯示定義構造方法
例項化兩種方法
第一種
Dog dog=new Dog();
dog.setName("");
dog.setHealth();
dog.setStrain("");
第二種
Dog dog=new Dog("",,"");
二 繼承
static{
}
1.繼承初始化順序?
2.方法的過載和重寫?
3.abstract final關鍵字
1.繼承概念
super 代表父類
this 代表本類
子類 extends 父類
2.繼承關係初始化順序。
父類屬性--》父類的構造方法--》子類屬性--》子類的構造方法
先父後子
先屬後構
3.方法的過載和重寫?overloading和override區別
過載 overloading
規則:同一個類中
方法名稱相同
引數列表必須不相同(型別 個數 順序)
返回值型別和訪問修飾符無關
構造方法過載
public Student(){}
public Student(String name){}
public Student(String sex){}//錯誤
public Student(String name,int age){}
//方法名稱具體意義
重寫 override
規則:在繼承關係中體現
方法名字相同
引數列表必須相同
返回值的型別相同或者是其子類
訪問修飾符不能嚴於父類(父類是protected 子類是protected public )
方法重寫:相對於繼承而言,子類中對父類已經存在的方法進行區別修改。
4.abstract 抽象類
1.修飾class後變為抽象類,限制例項化
2.Pet類定義方法沒有意義
因此我們可以在Pet類中定義方法為抽象方法,
抽象方法沒有方法體。
1)修飾類 限制例項化
2)修飾方法 限制方法的實現,沒有方法體
抽象方法的實現步驟
1.在父類的方法前新增abstract,去除方法體
2.在子類中重寫此抽象方法
為什麼使用抽象方法?
1.父類只是知道子類應該有哪些方法,但是無法準確完成方法具體實現
2.避免子類設計的隨意性
總結
1.父類中編寫抽象方法,子類必須重寫
2.抽象類中可以有普通方法,也可以有抽象方法
3.抽象方法必須在抽象類中
5.final關鍵字
修飾類
此類就不能被繼承
修飾方法
此方法不能被重寫
注意:final和abstract是兩個相反的單詞,絕對不能同時修飾
修飾變數
常量:所有單詞字母全部大寫
USER_NAME AMDIN_NAME
final String ORACLE_PASSWORD="123456";
int num=9;
num:變數
9:常量
永遠都不會被改變的
成員變數
修飾成員變數必須宣告的時候就賦值或者在構造方法中初始化
6.Object 上帝類 祖宗類
Object類是所有類的父類。
如果一個類沒有使用extends關鍵字標識繼承另一個類,那麼這個類預設繼承Object
因此自定義的類和底層開發人員的類
String str="";
str.equals("");//equals標明並不是在Object類,是String類。因為String子類重寫了Object父類裡的方法
Object類中的主要方法。
1.equals :比較物件的引用是否指向同一塊記憶體地址。(引用:指向一塊記憶體地址)
作業:想使用equals判斷兩個物件的屬性是否相同。--》重寫equlas
2.toString()
StringBuffer--》toString()--->StringBuffer轉換為String型別
返回的是雜湊碼值(物件地址字串)。(Hash)
我們直接使用System.out.println(dog);輸出一個物件
結果就是物件的地址字串也叫雜湊碼值(com.sisp.oop4.object.Dog@659e0bfd)
雜湊碼值:通過雜湊演算法(Hash)生成的一個字串,用來區分我們的物件地址碼。
劉** 210123...
變數名 雜湊碼值
子類可以重寫toString
3.getClass() 可以得到此物件的型別
System.out.println(dog.getClass());
//class com.sisp.oop4.object.Dog
三 多型
1.面向物件的第三大特性
多型
生活中的多型
同一種事物,由於條件不同,則產生不同的結果
事物的多種表現形態
程式中多型
同一個引用型別,使用不同的例項,執行不同的操作
父類的引用 子類的實現
//使用多型進行例項化
Pet pet=new Dog();
Pet pet=new Penguin();
Pet pet=new Cat();
2.多型發生在繼承關係中
3.多型實現的前提
1.類與類之間存在繼承關係
2.類與介面之間存在實現關係(之後章節)
4.多型實現的步驟
1.編寫父類
2.編寫子類,一定要有子類重寫父類的方法
3.使用時,就可以使用父類的引用型別,子類的例項!!
//使用多型進行例項化
Pet pet=new Dog();
Pet pet=new Penguin();
Pet pet=new Cat();
5.多型實現的方式
1.Pet pet=new Dog();
2.使用父類作為方法的形參實現多型,
呼叫具體方法傳入實參作為子類的例項
3.使用父類作為方法的返回值實現多型,
定義方法的返回值為父類,呼叫方法的返回值為子類的例項
6.優點:程式的可擴充套件性
缺點:使用多型進行例項化,例項化的物件只能呼叫子類重寫父類的方法,
子類特有的方法我們無法呼叫
如何解決弊端?
1.向上型別(自動型別轉換)
Pet pet=new Dog();
好處:隱藏子型別,提供程式碼的可擴充套件型
弊端:只能呼叫子類重寫父類的方法,子類特有的方法我們無法呼叫
2.向下型別(強制型別轉換)
int b=(int)9.8;
Pet pet=new Dog();
pet.eat();
Dog dog=(Dog)pet;
dog.catchFlyDisc();
好處:能呼叫子類特有方法
弊端:向下型別有風險
容易發生異常
java.lang.ClassCastException(型別轉換異常)
使用前進行判斷,判斷一個物件是否匹配另一個物件型別
物件 instanceof 型別(類名)
建立父類
package com.sisp.poly1;
public abstract class Pet {
protected String name;
protected int health;
protected int love;
public void setName(String name) {
this.name = name;
}
public void setHealth(int health) {
this.health = health;
}
public String getName() {
return name;
}
public void setLove(int love) {
this.love = love;
}
public int getHealth() {
return health;
}
public int getLove() {
return love;
}
public Pet() {
}
public Pet(String name, int health, int love) {
this.name = name;
this.health = health;
this.love = love;
}
//The abstract method eat in type Pet
//can only be defined by an abstract class
/**
* 吃食
*/
public abstract void eat();
}
建立企鵝類
package com.sisp.poly1;
public class Penguin extends Pet{
private String sex;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Penguin() {
}
public Penguin(String sex) {
this.sex = sex;
}
public Penguin(String name,int health,int love,String sex) {
super(name,health,love);
this.sex = sex;
}
public void show(){
System.out.println("自我介紹:我的名字:"+
super.name+",健康值:"+
super.health+",親密度"+
super.love+",性別 :"+
this.sex);
}
@Override
public void eat() {
if(super.health>200){
System.out.println("吃飽啦");
}else{
System.out.println("企鵝正在吃食");
super.health=super.health+50;
}
}
建立貓類
package com.sisp.poly1;
public class Cat extends Pet{
String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Cat() {
}
public Cat(String name,int health,int love,String color){
super(name,health,love);
this.color=color;
}
public void show(){
System.out.println("自我介紹:我的名字:"+
super.name+",健康值:"+
super.health+",親密度"+
super.love+",顏色:"+
this.color);
}
@Override
public void eat() {
if(super.health>200){
System.out.println("吃飽啦");
}else{
System.out.println("貓正在吃食");
super.health=super.health+10;
}
}
}
建立飼養員類
package com.sisp.poly1;
public class Master {
private String name;
private int money;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public Master() {
}
public Master(String name, int money) {
this.name = name;
this.money = money;
}
public void feed(Pet pet){//Pet pet=new Dog()
pet.eat();
}
/*public void feed(Penguin pg){
pg.eat();
}
public void feed(Cat cat){
cat.eat();
}*/
}
建立執行類
package com.sisp.poly1;
public class Demo {
public static void main(String[] args) {
Master master=new Master("劉小姐",100);
Cat cat=new Cat("歐歐", 100, 80, "卡布拉多");
master.feed(cat);
cat.show();
Penguin pg=new Penguin("貝貝",80,80,"男");
master.feed(pg);
pg.show();
}
}