外部类和内部类
外部类的封装等级只有以下两种形式:
1.
public class 外部类名 {
}
//有public修饰符的外部类属于对外公开的“文件类”,即.java文件名与此类名保持一致
2.
class 外部类名 {
}
//“缺省”修饰的外部类属于普通类,而非“文件类”
内部类一般形式:
class 外部类名 {
class 内部类名 {
}
}
(内部类属于外部类中的,所以内部类可以直接访问外部类的成员,包括私有成员。反之外部类要访问内部类的成员,就必须建立内部类的对象)
abstract 抽象类及其抽象方法
首先它们都得用 abstract 来修饰,而抽象方法不能拥有方法体。而要创建对象需借助向上转型,主要目的是被其子类调用。抽象类可以看作是对类的进一步抽象。在面向对象领域,抽象类主要用来进行类型隐藏。
注意:外部抽象类不能用 static 修饰,但内部的抽象类可以使用 static 修饰。抽象类也可以继承抽象类,但只有具体非抽象派生类才能重写它里面的方法或创建实例。
interface 接口指导和规范
interface 接口可以说是抽象类独立出来的特例。Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征而缺少方法的实现,而这些方法可以在不同的地方被不同的类实现,通过实现可以具有不同的行为(功能)。
abstract VS interface
|
abstract |
interface |
是否允许有实例变量 |
✔ |
× |
是否允许有静态成员变量 |
都允许 |
静态成员变量的类型限制 |
访问类型任意 |
只能是 public static final 类型,且默认为此类型 |
是否允许有构造方法 |
允许,但不能被实例化 |
不允许 |
是否兼容 private、final 关键字 |
都不允许(因为它俩是杜绝重写和继承的) |
是否允许有静态方法 |
都允许 |
是否允许有抽象和非抽象的方法 |
都允许 |
与类关系 |
继承关系 |
实现关系 |
从类的层次上看 |
本质上是个类 |
从抽象类独立出来的一个特例 |
性质 |
指导类、定义类模板 |
更方便地指导类、定义类模版 |
总结 |
- 一个类可以实现多个接口,但最多只能继承一个抽象类(多实现,单继承)
- 有抽象方法的类一定是抽象类;但有抽象方法不一定是抽象类,也有可能是接口
|
匿名内部类(是内部类的简化/“一次性”写法)
出现背景:需要一个子类或实现类,但它的使用频率不高(一次性的),所以我们没必要把它编写成独立的一个类,这就需要使用匿名内部类了!
前提:父类或接口 二选一,且最多只能选择一个继承/实现。
匿名内部类 VS 抽象类
|
匿名内部类 |
抽象类 |
是否有构造方法 |
没有,但可以定义实例初始化块(构造方法的方法名需要和类名一致,而匿名内部类没有类名) |
有,但不能实例化 |
能否创建实例 |
匿名内部类可以创建实例 |
抽象类不能创建实例 |
格式:
外部类.内部类 对象名=new 外部类().内部类() {方法重写};
匿名内部类的子类/实现类构造例子:
1.
abstract class Father {
...
}
public class anonymity {
Father f = new Father() {
//这{}里就是个匿名内部类,注意有个分号;在下面
};
}
2.
interface Father {
...
}
public class anonymity {
Father f = new Father() {
//注意!匿名内部类的作用域就是这个{}里面
};
}
而匿名方法最常用的情况体现在多线程上!因为要实现多线程就必须继承Thread类或实现Runnable接口,这正好符合匿名内部类的使用前提。
例子代码如下:
public class ThreadDemo {
public static void main(String[] args) {
Thread t = new Thread() {
@Override
public void run() {
super.run();
//这里写你自己想同步的线程代码
}
}
}
}
Object类
Date类
System类
String体系类
包装类
有空再补充这些类的专写,拜拜!