抽象类与枚举、特殊类
抽象方法
概念
抽象->具体
-
抽象方法主要指不能具体实现的方法并且使用 abstract 关键字修饰,没有方法体
-
格式
//访问权限 abstract 返回值类型 方法名 (形参列表); public abstract void cry();
抽象类
概念
-
主要指不能具体实例化的类 并且使用 abstract 关键字修饰,也就是不能创建对象
public abstract class AbstractTest{ public abstract void cry(); }
抽象类和抽象方法的关系
- 抽象类中可以有 成员变量、构造方法、成员方法
- 抽象类中可以有抽象方法,也可以没有抽象方法
- 拥有抽象方法的类必须是抽象类, 因此真正意义上的抽象类应该是具有抽象方法并且使用abstract关键字修饰的类
- 如果一个抽象类中没有抽象方法,那么抽象类 不能创建对象 的特性毫无意义
抽象类的实际意义
- 抽象类的意义不在于创建对象而在于被继承
- 当一个类继承抽象类后必须重写抽象方法,否则该类也必须为抽象类
- 抽象类对子类具有强制性和规范性,因此又叫做 模板设计模式
接口
概念
-
接口就是一种比抽象类还抽象的类
- 所有的方法都为抽象方法
-
// interface 关键字 public interface InterfaceTest { public abstract void cry(); public abstract void show(); }
类、接口、抽象类之间的关系
名称 | 关键字 | 关系 |
---|---|---|
类和类 | extends–表达继承关系 | 支持单继承 |
类和接口 | implements–表达实现关系 | 支持多实现 |
接口和接口 | extends表达继承关系 | 支持多继承 |
接口和抽象类的区别
接口 | 抽象类 | |
---|---|---|
定义的关键字 | abstract class | interface |
继承/实现的关键字 | extends | implements |
继承/实现要求 | 单继承 | 多实现 |
构造方法 | 可以有 | 不可以有 |
成员变量 | 可以有 | 只能是常量 |
成员方法 | 可以有 | 只能是抽象方法 |
增加方法时 | 可以不重写 | 需要重写(java8之前) |
- 从java8开始增加新特性: 接口中允许出现非抽象方法和静态方法,但非抽象方法需要使用default关键字修饰
- 从java9开始增加新特性,接口中允许出现私有方法
内部类
概念
- 当一个类的定义出现在另外一个类的类体时,那么这个类就叫做内部类(Inner),而这个内部类所在的类叫做外部类(Outer)
实际作用
- 当一个类存在的价值仅仅是为某一个类单独服务时,那么就可以将这个类定义为所服务类中的内部类
- 这样就可以隐藏该类的实现细节并且可以方便的访问外部类的私有成员而不再需要提供公有的get、set方法
1.普通(成员)内部类
- 直接将一个类的定义放在另一类的类体中
访问修饰符 class 外部类的类名{
访问修饰符 class 内部类的类名{
内部类的类体;
}
}
//普通内部类
public class NormalClass {
public class ClassInner {
private int ia = 1;
//普通内部类
public ClassInner() {
System.out.println("普通内部类的构造方法");
}
public void show() {
System.out.println("普通内部类的show()");
System.out.println("普通内部类的 ia = " + ia);
}
}
}
// 普通内部类测试类
public class NormalClassTest {
public static void main(String[] args) {
//声明 NormalCla
NormalClass nc = new NormalClass();
NormalClass.ClassInner inner = nc.new ClassInner();
inner.show();
}
}
运行结果:
使用方式
-
普通内部类和普通类一样可以定义成员变量、成员方法、构造方法等
-
普通内部类和普通类一样可以使用final、abstract关键字修饰
-
普通内部类可以使用private、protected关键字修饰
-
普通内部类需要使用外部类对象来创建对象
- 如果内部类访问外部类中与本类内部同名的成员方法变量或方法时,需要使用this关键字
public class NormalClass { private int outer = 1; //普通内部类 public class ClassInner { private int outer = 2; public ClassInner() { System.out.println("普通内部类的构造方法"); } public void show() { System.out.println("普通内部类的show()"); System.out.println("普通内部类的 ia = ");