目錄
創(chuàng)新互聯(lián)是專業(yè)的零陵網(wǎng)站建設(shè)公司,零陵接單;提供成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行零陵網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!前言:
1.抽象類
1.1抽象類的概念及語法
1.2?抽象類的特征
1.3抽象類的特性
2.接口
2.1接口的概念及語法
2.2接口的使用及特性
2.2.1接口的使用
2.2.2接口的特性
2.3實現(xiàn)多個接口
2.4接口的繼承
3.抽象類與接口的區(qū)別
結(jié)束語:
上一次小編講解了繼承、組合和多態(tài),這次小編和大家分享一下抽象類與接口的知識點。
1.抽象類 1.1抽象類的概念及語法在面向?qū)ο蟮母拍钪?,所有的對象都是通過類來描述的,但是反過來,并不是所有的類都是用來描述對象的,如果這個類中沒有包含足夠的信息來描述一個具體的對象,這樣的類就是抽象類。
1.2?抽象類的特征關(guān)鍵字:abstract
通過abstract修飾的類就叫抽象類,通過abstract修飾的方法叫抽象方法。
代碼如下所示:
package demo1;
//抽象類Test
public abstract class Test {
public int a;//成員變量
public void func1(){
//普通方法
}
abstract public void func2();//抽象方法
}
注意:
①抽象類不能直接實例化對象。
②抽象方法不被private、final和static修飾,因為被abstract修飾的方法需要在子類中重寫,被修飾之后就不能重寫了。
③抽象類必須要被繼承,并且繼承后子類要重寫父類中的抽象方法,否則子類也是抽象類,必須要使用abstract修飾。
代碼如下所示:
package demo1;
abstract class Shape{
abstract public void draw();
abstract void calcArea();
}
class Rect extends Shape{
private double length;
private double width;
public Rect(double length, double width) {
this.length = length;
this.width = width;
}
@Override
//該注釋可以幫助我們檢查重寫代碼的格式是否正確
public void draw() {
//子類必須重寫父類的abstract修飾的方法
System.out.println("矩形為:length=" + length + " width=" + width);
}
@Override
void calcArea() {
//子類必須重寫父類的abstract修飾的方法
System.out.println("矩形的面積為:" + length * width);
}
}
public class Test2 {
public static void main(String[] args) {
Rect rect = new Rect(12,23);
rect.draw();
rect.calcArea();
}
}
結(jié)果如下所示:
④抽象類中不一定包含抽象方法,但包含抽象的方法的類必須是抽象類。
⑥抽象類中可以有構(gòu)造方法,供子類創(chuàng)建對象時,初始化父類的成員變量。
代碼如下所示:
package demo1;
abstract class A{
public int a;
public int b;
abstract public void func();
public A(int a, int b) {
this.a = a;
this.b = b;
}
}
class B extends A{
public B(int a, int b) {
super(a, b);
//先幫助父類構(gòu)造
}
@Override
public void func() {
System.out.println("對父類被abstract修飾的方法進行重寫!");
}
}
public class Test3 {
public static void main(String[] args) {
B b = new B(1,2);
b.func();
}
}
結(jié)果如下所示:
2.接口 2.1接口的概念及語法接口就是公共的行為規(guī)范標(biāo)準(zhǔn),大家在實現(xiàn)時,只要符合規(guī)范標(biāo)準(zhǔn),就可以通用。在java中,接口也可以看做是:多個類的公共規(guī)范,是一種引用數(shù)據(jù)類型。
關(guān)鍵字:interface。
代碼如下所示:
interface IUsb{
//一個接口的定義
void func();
}
注意:
接口不可以直接使用,必須要有一個“實現(xiàn)類”來“實現(xiàn)”該接口,實現(xiàn)接口中的所有抽象方法。
關(guān)鍵字:implements
代碼如下所示:
package demo2;
public class Test2 implements IUsb{
@Override
public void func() {
//實現(xiàn)接口中的所有抽象方法
}
}
注意:子類和父類直接是extends繼承關(guān)系,類與接口之間是implements實現(xiàn)關(guān)系。
2.2.2接口的特性①接口類型是一種引用類型,但是不能直接new接口的對象。
②接口中的每一個方法都是public的抽象方法,即接口中的方法會被隱式指定為public?abstract(只能是public?abstract,其他修飾符都會報錯)。
interface B{
void func1();
public abstract void func2();
//其中func1和func2之前的修飾符都是一樣的。
}
③接口中的方法是不能在接口中實現(xiàn)的,只能由實現(xiàn)接口的類來實現(xiàn)。
package demo2;
interface C{
public abstract void func();
//不可以在接口中實現(xiàn)該方法,而是應(yīng)該在實現(xiàn)類中實現(xiàn)該方法!??!
// public abstract void func2(){
// System.out.println("接口中實現(xiàn)方法體!");
// }
}
public class Test5 implements C{
@Override
public void func() {
System.out.println("在實現(xiàn)類中實現(xiàn)!");
}
}
④重寫接口中方法時,不能使用默認(rèn)的訪問權(quán)限。
package demo2;
interface D{
void func();
}
public class Test6 implements D {
@Override
void func() {
System.out.println("不可以使用默認(rèn)的訪問權(quán)限?。?!");
}
// @Override
// public void func() {
// System.out.println("使用public修飾的?。?!");
// }
}
⑤接口中可以含有變量,但是接口中的變量會被隱式的指定為public?static?final變量。
interface E{
public static final int a = 10;//必須要給定默認(rèn)值
double b = 1.2;//默認(rèn)是被public static final修飾的。
}
⑥接口中不能有靜態(tài)代碼塊和構(gòu)造方法。
interface F{
// static {
// //不能有靜態(tài)代碼塊
// }
int a = 10;
int b = 20;
//不可以有構(gòu)造代碼塊
// public F(int a, int b) {
// this.a = a;
// this.b = b;
// }
}
⑦接口雖然不是類,但是接口編譯完成后字節(jié)碼文件后綴格式也是.class。
⑧如果類沒有實現(xiàn)接口中的所有的抽象方法,則該類必須設(shè)置為抽象類。
package demo2;
interface G{
void func1();
void func2();
//如果類沒有實現(xiàn)接口中的所有的抽象方法,則該類必須設(shè)置為抽象類。
}
public abstract class Test9 implements G{
@Override
public void func1() {
//只實現(xiàn)一個抽象方法,則該類必須置為abstract
}
}
⑨JDK8中:接口中還可以包含default方法。
interface H{
//default void func3();在JDK8中可以。
}
2.3實現(xiàn)多個接口在Java中,類和類之間是單繼承的,一個類只能有一個父類,即Java中不支持多繼承,但是一個類可以實現(xiàn)多個接口。
代碼如下所示:
package demo3;
interface IEat{
void eat();
}
interface IRunning{
void run();
}
public class Animal {
public String name;
public int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
}
class Cat extends Animal implements IEat,IRunning{
//先繼承,再實現(xiàn)。繼承只能繼承一個,實現(xiàn)可以實現(xiàn)多個接口
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println(name + "正在吃飯!");
}
@Override
public void run() {
System.out.println(name + "正在跑!");
}
public static void main(String[] args) {
Cat cat = new Cat("咪咪",12);
cat.eat();
cat.run();
}
}
結(jié)果如下所示:
注意:一個實現(xiàn)類實現(xiàn)多個接口的時候,每一個接口中的抽象方法都要實現(xiàn),否則該類必須設(shè)置為抽象類。
2.4接口的繼承在java中,類和類之間是單繼承,一個類可以實現(xiàn)多個接口,接口與接口之間可以多繼承,即用接口可以達到多繼承的目的。
關(guān)鍵字;extends。
代碼如下所示:
package demo4;
interface IRunning{
void run();
}
interface ISwimming{
void swimming();
}
interface IFly extends IRunning,ISwimming{
//實現(xiàn)了接口間的多繼承
void fly();
}
public class Animal {
public String name;
public int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
}
class Duck extends Animal implements IFly{
public Duck(String name, int age) {
super(name, age);
}
@Override
public void run() {
System.out.println(name + "正在跑!");
}
@Override
public void swimming() {
System.out.println(name + "正在游泳!");
}
@Override
public void fly() {
System.out.println(name + "正在飛");
}
public static void main(String[] args) {
Duck duck = new Duck("阿飛",13);
duck.fly();
duck.run();
duck.swimming();
}
}
結(jié)果如下所示:
抽象類:
接口:
這次小編主要和大家分享了抽象類和接口的一些簡單知識點,至于具體的應(yīng)用后期小編還會繼續(xù)出的,敬請期待,希望對大家有所幫助,想要學(xué)習(xí)的同學(xué)記得關(guān)注小編和小編一起學(xué)習(xí)吧!如果文章中有任何錯誤也歡迎各位大佬及時為小編指點迷津(在此小編先謝過各位大佬啦?。?
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧