类与接口
一、类
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)外部类不可直接访问内部类的成员,要想访问必须先创建内部类对象,通过内部类对象进行访问。
(2)外部类不可直接访问内部类的成员,要想访问必须先创建内部类对象,通过内部类对象进行访问。
3.分类
内部类根据定义的位置不同,分为:
(1)成员内部类:定义在成员位置;
(2)局部内部类:定义在成员方法里面。
4.匿名内部类——特殊的局部内部类
new 类名/接口名(){ 重写方法; };//注意这里有 分号; !!!【tips】:匿名内部类本质上就是继承了该类(实现了该接口)的子类(实现类)匿名对象!!!
本质上是个对象!对象!对象!所以当类名/接口名作形参时,()可以直接用匿名内部类作形参!!!