一、类

1.类的组成

        对象的属性(对象有什么)和对象的行为(对象能干什么)

2.定义

public class Student{
    //成员变量(对象属性)
    数据类型 变量名;
    ...
    //成员方法(对象行为)
    方法1;
    ...
    }

二、抽象类

1.什么是抽象类?

    在Java中,没有方法体的方法要写成抽象方法,具有抽象方法的类要写成抽象类。
【tips】:没有方法体指的是连{}都没有,无参构造方法不叫没有方法体!

2.特点

(1)抽象方法和抽象类要用关键字abstract修饰;
public abstract class 类名{
        ...
    public abstract void show(){
        ...;
    }
        ...
}
(2)抽象类多态:抽象类不能直接实例化,要用多态的形式创建对象;
(3)继承抽象类的子类必须重写抽象类中所有的抽象方法(因为不重写就继承了,继承过来自己又成抽象类了);
【tips】:抽象类中的抽象方法,可以限定子类必须完成某些动作。

三、接口

1.什么是接口?

接口是一种公共的规范标准,Java中的接口更多的体现在对行为的抽象上。

2.接口的组成

(1)常量:默认被public static final修饰;
(2)抽象方法:默认被public abstract修饰;
(3)默认方法(Java8新加)
    1)定义格式:用default修饰:
default 返回值类型 方法名(参数列表){
    ...;
}
    2)注意事项:①默认方法不是抽象方法!实现类不会被强制要求重写默认方法;重写默认方法时,就用写default了;
                            ②默认方法默认被public修饰,所以public可以省略。
(4)静态方法(Java8)
    1)定义格式:(同类一样)
public static 返回值类型 方法名(参数列表){
    ...;
}
    2)注意事项:①接口中的静态方法只能通过接口名调用,不能通过实现类名或对象名调用。
                            ②静态方法默认被public修饰,所以public可以省略。
(5)私有方法(Java9)
    1)为什么接口会有私有方法?
    Java8允许在接口中定义默认方法和静态方法,当两个默认方法或静态方法中含有一段相同的代码时,程序会考虑将这段代码抽取呈一个共性方法,而这个共性方法是不需要让别人使用的,这就需要用私有给隐藏起来,所以就有必要引入接口的私有方法。
    2)定义格式:
//非静态私有方法
private 返回值类型 方法名(参数列表){
    ...;
}

//静态私有方法
private static 返回值类型 方法名(参数列表){
    ...;
}

    3)注意事项:静态方法只能调用静态方法,而非静态方法可以调用静态方法也可以调用非静态方法,所以接口的静态方法只能调用静态私有方法。

3.特点

(1)接口要用关键字interface修饰:
public interface 接口名
(2)类与类可以继承,类与接口可以实现,类实现接口要用implements修饰:
public class 类名 implements 接口名
(3)接口类多态:接口没有构造方法,不能直接实例化,要用多态的形式创建对象,通过实现类进行实例化;
(4)接口的实现类要么重写接口的所有抽象方法,要么是个抽象类。
【tips】:接口A的实现类一般用 AImpl 来命名。

3.类与接口的关系

(1)类与类可继承:单继承、多层继承;
(2)类与接口可实现:单实现、多实现;
public class 类名 implements 接口1,接口2...
(3)接口与接口可继承:单继承、多继承
public interface 接口1 extends 接口2,接口3...

4.接口与抽象类的区别

(1)成员区别:抽象类有成员变量、常量、构造方法、get/set方法、抽象方法、非抽象方法,而接口只有常量(因为默认被final修饰)和抽象方法。
(2)设计理念区别:抽象类是对类进行抽象,包括属性和方法,而接口主要是对行为进行抽象。

四、类名、抽象类名、接口名作形参和返回值的情况

1.类名作

(1)形参:需要该类的对象作形参;
(2)返回值:返回的是该类的对象。

2.抽象类名作

(1)形参:需要该抽象类的子类对象作形参;
(2)返回值:返回的是该抽象类的子类对象。

3.接口名作

(1)形参:需要该接口的实现类对象作形参;
(2)返回值:返回的是该接口的实现类对象。

五、内部类

1.定义

内部类:在Outer类中定义一个Inner类,Inner类就叫内部类。

public class Outer{
    ...;
    修饰符 class Inner{
        ...;
    }
    ...;
}

2.访问特点

(1)内部类可以直接访问外部类的成员(包括被private修饰的成员,因为内部类也是外部类私有的)
(2)外部类不可直接访问内部类的成员,要想访问必须先创建内部类对象,通过内部类对象进行访问。

3.分类

    内部类根据定义的位置不同,分为:
(1)成员内部类:定义在成员位置;
(2)局部内部类:定义在成员方法里面。

4.匿名内部类——特殊的局部内部类

    new 类名/接口名(){
        重写方法;
    };//注意这里有 分号; !!!
【tips】:匿名内部类本质上就是继承了该类(实现了该接口)的子类(实现类)匿名对象!!!
                本质上是个对象!对象!对象!所以当类名/接口名作形参时,()可以直接用匿名内部类作形参!!!