Java基礎(chǔ)鞏固抽象類與接口詳解
抽象類與接口
1、抽象類
1.1、什么是抽象類
如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類
1.2、抽象類的用法
一個類如果被 abstract 修飾稱為抽象類,抽象類中被 abstract 修飾的方法稱為抽象方法,抽象方法不用給出具體的實現(xiàn)體。
abstract class Shape{ /* public String name; public int age; public void func(){ System.out.println("ada"); } public static void func2(){ System.out.println("akjdhkjasd"); }*/ public abstract void draw();//抽象方法 }
注意:抽象類也是類,內(nèi)部可以包含普通方法和屬性,甚至構(gòu)造方法
1.3、抽象類特點(限制條件)
1、使用abstract 修飾的類,就是抽象類
2、使用abstract 修飾的方法,就是抽象方法
3、抽象類不能夠進行實例化new 抽象類();
4、里面的成員變量和成員方法都是和普通類是一樣的,只不過就是不能進行實例化了
5、當(dāng)一個普通的類,繼承這個抽象類之后,那么這個普通類,必須重寫這個抽象類當(dāng)中所有的抽象方法。
6、抽象類存在的最大的意義就是為了被繼承
7、抽象類也可以發(fā)生向上轉(zhuǎn)型進一步發(fā)生多態(tài)
8、當(dāng)一個抽象類A繼承了抽象類B,此時抽象類A可以不重寫抽象類B當(dāng)中的方法
9、當(dāng)一個普通的類C繼承了第8條的A,此時就得重寫所有的抽象方法
10、 final不能修飾抽象方法和抽象類
11、抽象方法也不能是private的
12、抽象類當(dāng)中不一-定有抽象方法,但是如果這個方法是抽象方法,呢么這個類- -定是抽象類
代碼示例:
abstract class Shape{ /* public String name; public int age; public void func(){ System.out.println("ada"); } public static void func2(){ System.out.println("akjdhkjasd"); }*/ public abstract void draw();//抽象方法 } abstract class A extends Shape{ //當(dāng)一個抽象類A繼承抽象類Shape時,可以不重寫抽象類Shape中的方法 public abstract void func(); } class B extends A{ //出來混遲早得還,父類沒有重寫 你全寫 @Override public void draw() { } @Override public void func() { } } class Circle extends Shape { //普通類繼承了抽象類(內(nèi)有抽象方法),這里報錯, 必須重寫Shap類當(dāng)中的抽象個方法 @Override public void draw() { System.out.println("?"); } } class Rect extends Shape { @Override public void draw() { System.out.println("?"); } } class Triangle extends Shape { @Override public void draw() { System.out.println("??"); } } public class Testdemo { public static void drawMap(Shape shape){ shape.draw(); } public static void main(String[] args) { //Shape shape = new Shape(); //1、抽象類不能進行實例化 Circle circle = new Circle(); Rect rect = new Rect(); Triangle triangle = new Triangle(); drawMap(circle); drawMap(rect); drawMap(triangle); } //輸出結(jié)果: //就是按順序輸出三種圖形 }
2、接口
2.1、什么是接口
接口就是公共的行為規(guī)范標準,大家在實現(xiàn)時,只要符合規(guī)范標準,就可以通用。在Java中,接口可以看成是:多個類的公共規(guī)范,是一種引用數(shù)據(jù)類型。
2.2、接口的用法
接口的定義格式與定義類的格式基本相同,將class關(guān)鍵字換成 interface 關(guān)鍵字,就定義了一個接口。
interface IShape{ /* //成員變量 默認靜態(tài)常量 必須初始化 (寫不寫都一樣) public static final int a = 10; //成員方法 //public abstract void func();//接口里面的方法是默認抽象方法 default void func(){ System.out.println("默認的方法!");//如果接口當(dāng)中的方法 需要一個具體的實現(xiàn) 必須用default來修飾 } public static void staticFunc(){ System.out.println("靜態(tài)方法!");//接口當(dāng)中的靜態(tài)方法可以有具體的實現(xiàn) }*/ void draw(); }
2.3、如何使用接口
接口不能直接使用,必須要有一個"實現(xiàn)類"來"實現(xiàn)"該接口,實現(xiàn)接口中的所有抽象方法。
class Circle implements IShape { //一個普通的類可以通過implemengts來實現(xiàn)這個接口 另外:重寫抽象方法 @Override public void draw() { System.out.println("?"); } }
注意:
子類和父類之間是extends繼承關(guān)系,類與接口之間是 implements 實現(xiàn)關(guān)系。
2.4、接口的特點(限制條件)
1、接口使用關(guān)鍵字interface來修飾
2、接口當(dāng)中的成員方法,只能是抽象方法。所有的方法默認都是public abstract3、接口當(dāng)中的成員變量,默認是public static final
4、接口當(dāng)中的方法,如果要實現(xiàn),需要用default來修飾
5、接口當(dāng)中的靜態(tài)的方法,可以有具體的實現(xiàn)
6、接口不能進行實例化。new接口
7、-一個普通的類可以通過implements來實現(xiàn)這個接口
interface IShape{ /* //成員變量 默認靜態(tài)常量 必須初始化 (寫不寫都一樣) public static final int a = 10; //成員方法 //public abstract void func();//接口里面的方法是默認抽象方法 default void func(){ System.out.println("默認的方法!");//如果接口當(dāng)中的方法 需要一個具體的實現(xiàn) 必須用default來修飾 } public static void staticFunc(){ System.out.println("靜態(tài)方法!");//接口當(dāng)中的靜態(tài)方法可以有具體的實現(xiàn) }*/ void draw(); } class Circle implements IShape { //一個普通的類可以通過implemengts來實現(xiàn)這個接口 另外:重寫抽象方法 @Override public void draw() { System.out.println("?"); } } class Rect implements IShape { @Override public void draw() { System.out.println("?"); } } class Triangle implements IShape { @Override public void draw() { System.out.println("??"); } } /* @Override public void func() { System.out.println("adiashgd"); }*/ public class Test { public static void drawMap(IShape shape){ shape.draw(); } public static void main(String[] args) { //Shape shape = new Shape(); //1、抽象類不能進行實例化 Circle circle = new Circle(); Rect rect = new Rect(); Triangle triangle = new Triangle(); drawMap(circle); drawMap(rect); drawMap(triangle); } //IShape iShape = new IShape(); //接口不能實例化 /*IShape iShape = new A(); iShape.draw(); iShape.func(); IShape.staticFunc();*/ }
2.5、如何實現(xiàn)多個接口
代碼示例:
class Animal { public String name; public Animal(String name) { this.name = name; } public void eat(){ System.out.println("吃飯飯!"); } // 飛 跑 游泳 布恩那個把這些操作寫在這里 } interface IFlying{ void fly(); } interface IRunning{ void run(); } interface ISwimming{ void swim(); } class Cat extends Animal implements IRunning{ public Cat(String name) { super(name); } @Override public void run() { System.out.println(this.name+"is cat 正在跑!"); } } //狗 繼承了Animal實現(xiàn)了 跑和游泳接口 先繼承后實現(xiàn) 需要重寫兩接口的方法 class Dog extends Animal implements IRunning,ISwimming{ public Dog(String name){ super(name); } @Override public void run() { System.out.println(this.name+"is dog 正在跑!"); } @Override public void swim() { System.out.println(this.name+"正在游泳!"); } } class Robot implements IRunning{ @Override public void run() { System.out.println("我是機器人,我在跑!"); } } class Duck extends Animal implements IRunning,ISwimming,IFlying{ public Duck(String name) { super(name); } @Override public void fly() { System.out.println(this.name+"鴨子正在飛!"); } @Override public void run() { System.out.println(this.name+"鴨子正在跑!"); } @Override public void swim() { System.out.println(this.name+"鴨子正在游泳!"); } } public class TestDemo1 { public static void walk(IRunning iRunning){ iRunning.run(); } public static void fly(IFlying iFlying){ iFlying.fly(); } public static void swim(ISwimming iSwimming){ iSwimming.swim(); } public static void main(String[] args) { //swim(new Dog("小狗")); Duck duck = new Duck("小鴨子"); swim(duck); walk(duck); fly(duck); } public static void main2(String[] args) { walk(new Cat("mimi")); walk(new Dog("mimi2")); walk(new Robot()); } public static void main1(String[] args) { Animal animal = new Cat("mimi"); Animal animal2 = new Dog("mimi2"); IRunning iRunning = new Cat("mimi"); IRunning iRunning2 = new Dog("mimi2"); ISwimming iSwimming2 = new Dog("mimi2"); } }
2.6、接口于接口之間的繼承關(guān)系
類和類之間是單繼承的,一個類可以實現(xiàn)多個接口,接口與接口之間可以多繼承。即:用接口可以達到多繼承的目的。接口可以繼承一個接口, 達到復(fù)用的效果. 使用 extends 關(guān)鍵字.
interface C extends A,B{ void funcC(); } class AA implements C{ //類和接口之間是implements 那么接口與接口之間呢----extends[擴展] @Override public void funcC() { System.out.println("funcC"); } @Override public void funcA() { } @Override public void funcB() { } }
2.7、如何使用接口
在 sort 方法中會自動調(diào)用 compareTo 方法. compareTo 的參數(shù)是 Object , 其實傳入的就是 Student 類型的對象.然后比較當(dāng)前對象和參數(shù)對象的大小關(guān)系(按分數(shù)來算).
import java.util.Arrays; class Student implements Comparable<Student>{ public String name; public int age; public double score; public Student(String name, int age, double score) { this.name = name; this.age = age; this.score = score; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", score=" + score + '}'; } @Override public int compareTo(Student o) { /* if (this.age > o.age){ return 1; }else if (this.age == o.age){ return 0; }else { return -1; }*/ //return this.name.compareTo(o.name);//姓名比較 //return this.age-o.age;//年齡比較 return (int) (this.score-o.score);//分數(shù)比較 } } public class Test { public static void main(String[] args) { Student student1 = new Student("zhangsan",98,78.9); Student student2 = new Student("lisi",38,18.9); System.out.println(student1.compareTo(student2)); } public static void main1(String[] args) { Student[] students = new Student[3]; students[0] = new Student("zhangsan",98,78.9); students[1] = new Student("lisi",38,18.9); students[2] = new Student("abc",78,88.9); Arrays.sort(students); System.out.println(Arrays.toString(students)); } }
到此這篇關(guān)于Java基礎(chǔ)鞏固抽象類與接口詳解的文章就介紹到這了,更多相關(guān)Java抽象類與接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringSecurity+Redis認證過程小結(jié)
這篇文章主要介紹了SpringSecurity+Redis認證過程小結(jié),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01Executor攔截器高級教程QueryInterceptor的規(guī)范
今天小編就為大家分享一篇關(guān)于Executor攔截器高級教程QueryInterceptor的規(guī)范,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12