1. 程式人生 > 其它 >抽象類,介面,內部類

抽象類,介面,內部類

抽象類

  • abstract修飾符可以用來修飾方法也可以修飾類,如果修飾方法,那麼該方法就是抽象方法,如果修飾類,那麼該類就是抽象類

  • 抽象類中可以沒有抽象方法,但是又抽象方法的類一定要宣告為抽象類

  • 抽象類,不能用new關鍵字來建立物件,它是用來讓子類繼承的

  • 抽象方法,只有方法的宣告,沒有方法的實現,它是用來讓子類實現的

  • 子類繼承抽象類,那麼久必須要實現抽象類沒有實現的抽象方法,否則該子類也要宣告為抽象類。

  
//abstract 抽象類
public abstract class Action {
//約束~ 有人幫我們實現
//abstract 抽象方法,只有方法名字,沒有方法的實現!
public abstract void doSomeThing();

//1.不能new這個抽象類,只能靠子類去實現它:約束!
//2.抽象類中可以寫普通方法
//3.抽象方法必須在抽象類中
//抽象的抽象:約束~

//思考題? 抽象類存在構造器麼?
//存在 存在的意義,例如遊戲角色,將共同點抽象出來,提高開發效率
}
  
//抽象類的所有方法,繼承了它的子類,都必須要實現它的方法~ 除非子類也是抽象類
public class A extends Action{
@Override
public void doSomeThing() {

}
}

介面

  • 普通類:只有具體實現

  • 抽象類:具體實現和規範都有

  • 介面:只有規範.自己無法寫方法~專業的約束! 約束和實現分離

  • 介面就是規範,定義的是一組規則,體現了現實世界中“如果你是...則必須能...”的思想。如果你是天使,則必須能飛。如果你是汽車,則不虛能跑。如果你是好人,則必須幹掉壞人。如果你是壞人,則必須欺負好人

  • 介面的本質是契約,就像我們人間的法律一樣。制定好後大家都遵守

  • OO的精髓,是對物件的抽象,最能體現這一點的就是介面。為什麼我們討論設計模式都只針對具備了抽象能力的語言(比如C++,java,C#等),就是因為設計模式所研究的,實際上就是如何合理的去抽象

  • 宣告類的關鍵字是class,宣告介面的關鍵字是interface

  • 作用:

    • 約束

    • 定義一些方法,讓不同的人實現

    • 方法都是public abstract

    • 屬性都是public static final

    • 介面不能被例項化,介面中沒有構造方法

    • implements可以實現多個介面

    • 繼承介面的子類必須要重寫介面中的方法

  
//interface 定義的關鍵字,介面都需要有實現類
public interface UserService {

public static final int AGE = 99;
//介面中的所有定義都是預設抽象的 自帶修飾符public abstract
void add(String name);
void delete(String name);
void update(String name);
void query(String name);
}
  
//類 可以實現介面 implements 介面
//實現介面的類,就需要重寫介面中的方法
//單繼承利用介面實現偽多繼承
public class UserServiceImpl implements UserService,TimeService{
@Override
public void add(String name) {

}

@Override
public void delete(String name) {

}

@Override
public void update(String name) {

}

@Override
public void query(String name) {

}

@Override
public void timer() {

}
}

內部類

  • 內部類就是在一個類的內部再定義一個類,比如,A類中定義一個B類,那麼B類相對A類來說就是內部類,而A類相對B類來說就是外部類了。

  • 1.成員內部類

  • 2.靜態內部類

  • 3.區域性內部類

  • 4.匿名內部類

  • lambada表示式

  
public class Outer {

private int id;
public void out(){
System.out.println("這是外部類的方法");
}

public class Inner{
public void in(){
System.out.println("這是內部類的方法");
}
//獲得外部類的私有屬性,方法
public void getID(){
System.out.println(id);
}
}
//區域性內部類
public void method() {
class Inner {
public void in() {
System.out.println("這是內部類的方法");
}
}
}
}

//一個java類中可以有多個class類,但是隻能有一個public class
class A{

}

/*
public class Application {
public static void main(String[] args) {
Outer outer = new Outer();
//通過這個外部類來例項化內部類
Outer.Inner inner = outer.new Inner();
inner.in();
}
}
*/
  
public class Test {
public static void main(String[] args) {
//匿名內部類 沒有名字初始化類,不用把例項儲存到變數中
new Apple().eat();
new UserService(){
@Override
public void hello() {

}
};
}
}
class Apple{
public void eat(){
System.out.println("1");
}
}

interface UserService{
void hello();
}