Java中抽象類(lèi)和接口介紹
1、抽象類(lèi)
1.1 什么是抽象類(lèi)?
1.1.1 對(duì)抽象類(lèi)的理解

1.1.2 關(guān)于抽象類(lèi)
類(lèi)與類(lèi)之間具有共同特征,將這些共同特征提取出來(lái),形成的就是抽象類(lèi);
類(lèi)本身是不存在的,屬于抽象類(lèi)無(wú)法創(chuàng)建對(duì)象【無(wú)法實(shí)例化】;
抽象類(lèi)是用來(lái)被子類(lèi)繼承的;
finial關(guān)鍵字和abstract關(guān)鍵字不能同時(shí)出現(xiàn);
抽象類(lèi)的子類(lèi)可以是抽象類(lèi);
抽象類(lèi)雖然無(wú)法實(shí)例化,但有構(gòu)造方法,這個(gè)構(gòu)造方法是供子類(lèi)使用的;
接口一般描述的是行為動(dòng)作信息
一個(gè)非抽象的類(lèi)繼承抽象類(lèi),必須把抽象類(lèi)中的抽象方法給實(shí)現(xiàn)(覆蓋、重寫(xiě))了
public class HelloWorld{
public static void main(String[] args){
//如何實(shí)現(xiàn)多態(tài)呢???
Animal a = new Bird();//向上轉(zhuǎn)型(自動(dòng)類(lèi)型轉(zhuǎn)換)
//面對(duì)抽象對(duì)象編程,降低程序的耦合度,提供程序的擴(kuò)展力,符合OCP原則
}
}
abstract class Animal{
public abstract void move();
}
class Bird extends Animal{
public void move(){
}//Bird不是抽象類(lèi),必須實(shí)現(xiàn)父類(lèi)的抽象方法
}//如果Bird是抽象類(lèi)的話(huà),那么繼承過(guò)來(lái)的抽象方法可以不去重寫(xiě)、覆蓋、實(shí)現(xiàn)1.2 抽象類(lèi)屬于什么類(lèi)型?
抽象類(lèi)也屬于引用數(shù)據(jù)類(lèi)型;
1.3 抽象類(lèi)怎么定義?
[修飾符列表] abstract class 類(lèi)名{
類(lèi)體;
}
1.4 抽象方法
1)抽象方法表示沒(méi)有實(shí)現(xiàn)的方法,沒(méi)有方法體,以分號(hào)結(jié)尾的方法。例如:
public abstract void doSome();
2)抽象類(lèi)中不一定有抽象方法,但抽象方法一定在抽象類(lèi)當(dāng)中;
3)沒(méi)有方法體的方法不一定都是抽象方法,Object類(lèi)中就有很多方法都沒(méi)有方法體,以" ;"結(jié)尾 e.g.:public native int hashCode();這個(gè)方法底層調(diào)用了C++寫(xiě)的動(dòng)態(tài)鏈接庫(kù)程序;前面修飾符列表中有native,表示調(diào)用JVM本地程序
2、接口
2.1 關(guān)于接口
1)接口也是一直引用數(shù)據(jù)類(lèi)型,
2)接口的完全抽象的(抽象類(lèi)是半抽象類(lèi))或者也可以說(shuō)接口是特殊的抽象類(lèi);
3)接口支持接口繼承也支持接口多繼承;
interface A{
}
interface B{
}
interface C extends A,B{
}4)接口中只包含兩部分內(nèi)容,一部分是常量,另一部分是抽象方法,所有內(nèi)容都是public修飾的,都是公開(kāi)的;
5)接口中抽象方法中的public static 可以省略,"public abstract int sun(int a,int b);" ——> "int sun(int a,int b);"
6)接口中變量中的public static final 可以省略,"public static final double PI = 3.1415926;" —> "double PI = 3.1415926;;"
7)接口中的方法都是抽象方法,所以接口中的方法都沒(méi)有方法體;
2.2 接口怎么定義?
[修飾符列表] interface 接口名{
}
2.3 接口基礎(chǔ)語(yǔ)法
1)類(lèi)和類(lèi)之間叫做繼承,類(lèi)和接口之間叫做實(shí)現(xiàn)(可看作繼承),用關(guān)鍵字"implements";
2)當(dāng)一個(gè)非抽象的類(lèi)實(shí)現(xiàn)接口的話(huà),必須將接口中所有的抽象方法全部實(shí)現(xiàn)(覆蓋、重寫(xiě));
public class interface {
public static void main(String[] args) {
//如何實(shí)現(xiàn)多態(tài)???
//父類(lèi)型的引用指向子類(lèi)型的對(duì)象
MyMath m = new MyMathImp();
//調(diào)用接口里面的方法(面向接口編程)
int result = m.sum(10,2);
System.out.println(result);
}
}
interface MyMath{
double PI = 3.1415926;
int sum(int a,int b);
int sub(int a,int b);
}
class MyMathImp implements MyMath{
public int sum(int a,int b){//重寫(xiě)接口中的抽象方法
return a + b;
}
public int sub(int a,int b){//重寫(xiě)接口中的抽象方法
return a - b;
}
}注意:非抽象的類(lèi)實(shí)現(xiàn)接口時(shí)重寫(xiě)的抽象方法public不可??;
3)一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,這種機(jī)制彌補(bǔ)了"java中類(lèi)和類(lèi)只支持單繼承"帶來(lái)的缺陷;
接口和接口之間在進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換的時(shí)候,沒(méi)有繼承關(guān)系,也可以強(qiáng)轉(zhuǎn),但運(yùn)行的時(shí)候可能會(huì)出現(xiàn)ClassCastException異常,需要加instanceof進(jìn)行判斷;
public class HelloWorld{
public static void main(String[] args) {
//如何實(shí)現(xiàn)多態(tài)???
A a = new C();
if(a instanceof B){
B b2 = (B)a;//此時(shí)a b的底層都是C,C實(shí)現(xiàn)了接口A和接口B,所以可以向下轉(zhuǎn)型
b2.m2();
}
M m = new E();
if(m instanceof K){
K k = (K)m;//這里的E()和K沒(méi)有關(guān)系,E實(shí)現(xiàn)了M,但沒(méi)有實(shí)現(xiàn)接口K,所以不能向下轉(zhuǎn)型
k.m3();
}
}
}
interface A{
void m1();
}
interface B{
void m2();
}
class C implements A,B{//C實(shí)現(xiàn)了A和B
public void m1(){
?
}
public void m2(){
System.out.println("可以向下轉(zhuǎn)型!");
}
}
?
interface K{
void m3();
}
interface M{
void m4();
}
class E implements M{//E實(shí)習(xí)了M,但沒(méi)有實(shí)現(xiàn)K
public void m3(){
}
public void m4(){
}
?4)繼承和實(shí)現(xiàn)都存在的話(huà),代碼怎么寫(xiě)?
extends關(guān)鍵字在前,implements關(guān)鍵字在后
public class interface{
public static void main(String args[]){
//創(chuàng)建對(duì)象
Flyable f = new Cat();
f.fly();
}
}
//動(dòng)物類(lèi):父類(lèi)
class Animal{
}
//可飛翔的接口(是一對(duì)翅膀)
//能插拔的就是接口。
//接口提取的是行為動(dòng)作
interface Flyable{
void fly();
}
//動(dòng)物類(lèi)子類(lèi):貓
//Flyable是一個(gè)接口,是一個(gè)翅膀的接口,通過(guò)接口插到貓身上,讓貓可以飛翔
class Cat extends Animal implements Flyable{
public void fly(){
System.out.println("貓會(huì)飛");
}
}總結(jié)
到此這篇關(guān)于Java中抽象類(lèi)和接口介紹的文章就介紹到這了,更多相關(guān)Java抽象類(lèi)和接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Data JPA結(jié)合Mybatis進(jìn)行分頁(yè)查詢(xún)的實(shí)現(xiàn)
本文主要介紹了Spring Data JPA結(jié)合Mybatis進(jìn)行分頁(yè)查詢(xún)的實(shí)現(xiàn)2024-03-03
Java利用OSHI實(shí)現(xiàn)獲取機(jī)器的硬件信息
OSHI(Operating System and Hardware Information)是一個(gè)開(kāi)源的Java庫(kù),用于獲取操作系統(tǒng)和硬件的詳細(xì)信息,下面我們就來(lái)看看他的具體使用吧2024-11-11
spring?boot如何通過(guò)自定義注解和AOP攔截指定的請(qǐng)求
這篇文章主要介紹了spring?boot通過(guò)自定義注解和AOP攔截指定的請(qǐng)求,本文主要通過(guò)切面類(lèi)和自定注解的方式,攔截指定的接口(代碼中已經(jīng)作了詳細(xì)的說(shuō)明),需要的朋友可以參考下2024-06-06
詳解SpringSecurity處理會(huì)話(huà)管理和注銷(xiāo)功能
本文介紹了詳解SpringSecurity處理會(huì)話(huà)管理和注銷(xiāo)功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
Spring中@Transactional(rollbackFor=Exception.class)屬性用法介紹
這篇文章介紹了Spring中@Transactional(rollbackFor=Exception.class)屬性的用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12
Java連接MySQL數(shù)據(jù)庫(kù)命令行程序過(guò)程
SQL編程包括兩種形式,一種是過(guò)程化編程,主要通過(guò)數(shù)據(jù)庫(kù)交互式工具,通過(guò)存儲(chǔ)過(guò)程、觸發(fā)器、函數(shù)等形式的編程;另一種是嵌入式SQL編程,將SQL語(yǔ)句嵌入到高級(jí)開(kāi)發(fā)語(yǔ)言,完成數(shù)據(jù)的各種操作2021-10-10
IKAnalyzer使用不同版本中文分詞的切詞方式實(shí)現(xiàn)相同功能效果
今天小編就為大家分享一篇關(guān)于IKAnalyzer使用不同版本中文分詞的切詞方式實(shí)現(xiàn)相同功能效果,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
JAVA實(shí)現(xiàn)連接本地打印機(jī)并打印文件的實(shí)現(xiàn)代碼
這篇文章主要介紹了JAVA實(shí)現(xiàn)連接本地打印機(jī)并打印文件的實(shí)現(xiàn)代碼,需要的朋友可以參考下2019-10-10
springboot實(shí)現(xiàn)攔截器之驗(yàn)證登錄示例
本篇文章主要介紹了springboot實(shí)現(xiàn)攔截器之驗(yàn)證登錄示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02

