封裝
把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對(duì)象操作,對(duì)不可信的進(jìn)行信息隱藏。封裝是面向?qū)ο蟮奶卣髦唬菍?duì)象和類概念的主要特性。
通俗地說(shuō),一個(gè)類就是一個(gè)封裝了數(shù)據(jù)以及操作這些數(shù)據(jù)的代碼的邏輯實(shí)體。在一個(gè)對(duì)象內(nèi)部,某些代碼或某些數(shù)據(jù)可以是私有的,不能被外界訪問(wèn)。
通過(guò)這種方式,對(duì)象對(duì)內(nèi)部數(shù)據(jù)提供了不同級(jí)別的保護(hù),以防止程序中無(wú)關(guān)的部分意外的改變或錯(cuò)誤地使用了對(duì)象的私有部分。但是如果?個(gè)類沒(méi)有提供給外界訪問(wèn)的?法,那么這個(gè)類也沒(méi)有什么意義了。
我們來(lái)看一個(gè)常見的 類,比如:Student
public class Student implements Serializable {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
將對(duì)象中的成員變量進(jìn)行私有化,外部程序是無(wú)法訪問(wèn)的。對(duì)外提供了訪問(wèn)的方式,就是set和get方法。
而對(duì)于這樣一個(gè)實(shí)體對(duì)象,外部程序只有賦值和獲取值的權(quán)限,是無(wú)法對(duì)內(nèi)部進(jìn)行修改
繼承
繼承 就是子類繼承父類的特征和行為,使得子類對(duì)象(實(shí)例)具有父類的實(shí)例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。
在 Java 中通過(guò) extends 關(guān)鍵字可以申明一個(gè)類是從另外一個(gè)類繼承而來(lái)的,一般形式如下:
class 父類 {
}
class 子類 extends 父類 {
}
繼承概念的實(shí)現(xiàn)方式有二類:實(shí)現(xiàn)繼承
與接口繼承
。
實(shí)現(xiàn)繼承是指直接使用基類的屬性和方法而無(wú)需額外編碼的能力
接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實(shí)現(xiàn)的能力
一般我們繼承基本類和抽象類用 extends 關(guān)鍵字,實(shí)現(xiàn)接口類的繼承用 implements 關(guān)鍵字。
注意點(diǎn):
通過(guò)繼承創(chuàng)建的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”。
繼承的過(guò)程,就是從一般到特殊的過(guò)程。要實(shí)現(xiàn)繼承,可以通過(guò)“繼承”(Inheritance)和“組合”(Composition)來(lái)實(shí)現(xiàn)。
子類可以擁有父類的屬性和方法。
子類可以擁有自己的屬性和方法, 即?類可以對(duì)?類進(jìn)?擴(kuò)展。
子類可以重寫覆蓋父類的方法。
JAVA 只支持單繼承 ,即一個(gè)子類只允許有一個(gè)父類,但是可以實(shí)現(xiàn)多級(jí)繼承,及子類擁有唯一的父類,而父類還可以再繼承。
使用 implements
關(guān)鍵字可以變相的使java具有多繼承
的特性,使用范圍為類繼承接口的情況,可以同時(shí)繼承多個(gè)接口(接口跟接口之間采用逗號(hào)分隔)。
# implements 關(guān)鍵字
public interface A {
public void eat();
public void sleep();
}
public interface B {
public void show();
}
public class C implements A,B {
}
值得留意的是:關(guān)于父類私有屬性和私有方法的繼承 的討論
這個(gè)網(wǎng)上 有大量的爭(zhēng)論,我這邊以Java官方文檔為準(zhǔn):
With the use of the extends keyword, the subclasses will be able to inherit all the properties of the superclass except for the private properties of the superclass.
子類不能繼承父類的 私有屬性 (事實(shí)
),但是如果子類中公有的方法影響到了父類私有屬性,那么私有屬性是能夠被子類使用的。
官方文檔 明確說(shuō)明:private和final不被繼承,但從內(nèi)存的角度看的話:父類private屬性是會(huì)存在于子類對(duì)象中的。
通過(guò)繼承的方法(比如,public方法)可以訪問(wèn)到父類的private屬性
如果子類中存在與父類private方法簽名相同的方法,其實(shí)相當(dāng)于覆蓋
個(gè)人覺(jué)得文章里的一句話很贊,我們不可能完全繼承父母的一切(如性格等),但是父母的一些無(wú)法繼承的東西卻仍會(huì)深刻的影響著我們。
多態(tài)
同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力就是 多態(tài) 。網(wǎng)上的爭(zhēng)論很多,筆者個(gè)人認(rèn)同網(wǎng)上的這個(gè)觀點(diǎn):重載也是多態(tài)的一種表現(xiàn),不過(guò)多態(tài)主要指運(yùn)行時(shí)多態(tài)
Java 多態(tài)可以分為 重載式多態(tài)
和重寫式多態(tài)
-
重載式多態(tài)
,也叫編譯時(shí)多態(tài)
。編譯時(shí)多態(tài)是靜態(tài)的,主要是指方法的重載
,它是根據(jù)參數(shù)列表的不同來(lái)區(qū)分不同的方法。通過(guò)編譯之后會(huì)變成兩個(gè)不同的方法,在運(yùn)行時(shí)談不上多態(tài)。也就是說(shuō)這種多態(tài)再編譯時(shí)已經(jīng)確定好了。-
重寫式多態(tài)
,也叫運(yùn)行時(shí)多態(tài)
。運(yùn)行時(shí)多態(tài)是動(dòng)態(tài)的,主要指繼承父類和實(shí)現(xiàn)接口時(shí),可使用父類引用指向子類對(duì)象
實(shí)現(xiàn)。 這個(gè)就是大家通常所說(shuō)的多態(tài)性 。這種多態(tài)通過(guò)
動(dòng)態(tài)綁定(dynamic binding)
技術(shù)來(lái)實(shí)現(xiàn),是指在執(zhí)行期間判斷所引用對(duì)象的實(shí)際類型,根據(jù)其實(shí)際的類型調(diào)用其相應(yīng)的方法。也就是說(shuō),只有程序運(yùn)行起來(lái),你才知道調(diào)用的是哪個(gè)子類的方法。這種多態(tài)可通過(guò)函數(shù)的重寫以及向上轉(zhuǎn)型
來(lái)實(shí)現(xiàn)。
多態(tài)存在的三個(gè)必要條件:
繼承
重寫
父類引用指向子類對(duì)象:Parent p = new Child();
我們一起來(lái)看個(gè)例子,仔細(xì)品讀代碼,就明白了:
@SpringBootTest
class Demo2021ApplicationTests {
class Animal {
public void eat(){
System.out.println("動(dòng)物吃飯!");
}
public void work(){
System.out.println("動(dòng)物可以幫助人類干活!");
}
}
class Cat extends Animal {
public void eat() {
System.out.println("吃魚");
}
public void sleep() {
System.out.println("貓會(huì)睡懶覺(jué)");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨頭");
}
}
@Test
void contextLoads() {
//part1
Cat cat_ = new Cat();
cat_.eat();
cat_.sleep();
cat_.work();
//part2
Animal cat=new Cat();
cat.eat();
cat.work();
cat.sleep();//此處編譯會(huì)報(bào)錯(cuò)。
Animal dog=new Dog();
dog.eat();//結(jié)果為:吃骨頭。此處調(diào)用子類的同名方法。
//part3
//如果想要調(diào)用父類中沒(méi)有的方法,則要向下轉(zhuǎn)型,這個(gè)非常像"強(qiáng)轉(zhuǎn)"
Cat cat222 = (Cat)cat; // 向下轉(zhuǎn)型(注意,如果是(Cat)dog 則會(huì)報(bào)錯(cuò))
cat222.sleep(); //結(jié)果為:貓會(huì)睡懶覺(jué)。 可以調(diào)用 Cat 的 sleep()
}
}
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7254瀏覽量
91773 -
封裝
+關(guān)注
關(guān)注
128文章
8651瀏覽量
145362 -
代碼
+關(guān)注
關(guān)注
30文章
4899瀏覽量
70620
發(fā)布評(píng)論請(qǐng)先 登錄
嵌入式C語(yǔ)言面向對(duì)象編程---多態(tài)
Python的面向對(duì)象編程詳解

每日一教labview視頻教程【12.15】labview面向對(duì)象編程(上)
【原創(chuàng)視頻】小草手把手LABVIEW之OOP面向對(duì)象編程基礎(chǔ)(1)
編程魔法師大思想視頻宣傳片
LabVIEW面向對(duì)象的ActorFramework(1)
面向對(duì)象編程及其三大特性 精選資料分享
C++面向對(duì)象多線程編程 (pdf電子版)
對(duì)象特性的測(cè)定
面向對(duì)象編程練習(xí)
Labview面向對(duì)象編程快速入門教程

全面講解?向對(duì)象編程三?特性 2

西門子PLC面向對(duì)象編程

評(píng)論