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、抽象類不能夠進(jìn)行實例化new 抽象類();
4、里面的成員變量和成員方法都是和普通類是一樣的,只不過就是不能進(jìn)行實例化了
5、當(dāng)一個普通的類,繼承這個抽象類之后,那么這個普通類,必須重寫這個抽象類當(dāng)中所有的抽象方法。
6、抽象類存在的最大的意義就是為了被繼承
7、抽象類也可以發(fā)生向上轉(zhuǎn)型進(jì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、抽象類不能進(jìn)行實例化
Circle circle = new Circle();
Rect rect = new Rect();
Triangle triangle = new Triangle();
drawMap(circle);
drawMap(rect);
drawMap(triangle);
}
//輸出結(jié)果:
//就是按順序輸出三種圖形
}
2、接口
2.1、什么是接口
接口就是公共的行為規(guī)范標(biāo)準(zhǔn),大家在實現(xiàn)時,只要符合規(guī)范標(biāo)準(zhǔn),就可以通用。在Java中,接口可以看成是:多個類的公共規(guī)范,是一種引用數(shù)據(jù)類型。
2.2、接口的用法
接口的定義格式與定義類的格式基本相同,將class關(guān)鍵字換成 interface 關(guān)鍵字,就定義了一個接口。
interface IShape{
/* //成員變量 默認(rèn)靜態(tài)常量 必須初始化 (寫不寫都一樣)
public static final int a = 10;
//成員方法
//public abstract void func();//接口里面的方法是默認(rèn)抽象方法
default void func(){
System.out.println("默認(rèn)的方法!");//如果接口當(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)中的成員方法,只能是抽象方法。所有的方法默認(rèn)都是public abstract3、接口當(dāng)中的成員變量,默認(rèn)是public static final
4、接口當(dāng)中的方法,如果要實現(xiàn),需要用default來修飾
5、接口當(dāng)中的靜態(tài)的方法,可以有具體的實現(xiàn)
6、接口不能進(jìn)行實例化。new接口
7、-一個普通的類可以通過implements來實現(xiàn)這個接口
interface IShape{
/* //成員變量 默認(rèn)靜態(tài)常量 必須初始化 (寫不寫都一樣)
public static final int a = 10;
//成員方法
//public abstract void func();//接口里面的方法是默認(rèn)抽象方法
default void func(){
System.out.println("默認(rèn)的方法!");//如果接口當(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、抽象類不能進(jìn)行實例化
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("我是機(jī)器人,我在跑!");
}
}
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)多個接口,接口與接口之間可以多繼承。即:用接口可以達(dá)到多繼承的目的。接口可以繼承一個接口, 達(dá)到復(fù)用的效果. 使用 extends 關(guān)鍵字.
interface C extends A,B{
void funcC();
}
class AA implements C{ //類和接口之間是implements 那么接口與接口之間呢----extends[擴(kuò)展]
@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)系(按分?jǐ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);//分?jǐn)?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認(rèn)證過程小結(jié)
這篇文章主要介紹了SpringSecurity+Redis認(rèn)證過程小結(jié),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01
Executor攔截器高級教程QueryInterceptor的規(guī)范
今天小編就為大家分享一篇關(guān)于Executor攔截器高級教程QueryInterceptor的規(guī)范,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12

