抽象类
什么是抽象类? 拥有抽象方法的类必须定义成抽象类。用abstract修饰。
父类的个个子类某个功能完成的情况不一样,子类自己重写这个功能,那么父类的该 功能就可以定义成抽象方法。子类重写调用自己的方法。
什么是抽象方法?
没有方法体只有方法名,且必须用abstract修饰的。
(拥有抽象方法的类一定是抽象类,抽象类中不一定包含抽象方法。)
抽象类的使用:
抽象类就是为了被子类所继承,约束子类要重写的抽象方法。(抽象类的意义)
子类继承了抽象类,要么全部重写抽象类的全部抽象方法,要么也定义成抽象类。
抽象类的定义方式:
abstract class A{
public abstract void eat(); // 抽象类公开,才能被子类继承,才有意义。
}
抽象类的特征:
抽象类拥有抽象方法的能力。抽象类失去了创建对象的能力。
(抽象类属于类,抽象类一定有构造器,提供给子类创建对象调用父类构造器使用。
但是抽象类不能创建对象)
接口
接口是更彻底的抽象,实现接口的子类必须重写完接口的全部抽象方法。
(接口中只能定义抽象方法和常量)
定义方式:
修饰符 interface 接口名称{
}
接口的实现方式:
修饰符 class 实现类名称 implement 接口1,接口2,接口3.......{
} //接口支持多实现 (类与类之间是单继承,但是接口支持多实现)
但必须完成所实现的接口的全部抽象方法。
接口与接口之间也是多继承,在实现类实现已经继承其他接口的接口的时候,需要实现 所有的接口中的抽象方法。
接口中没有构造器,不能创建对象。
代码块
代码块按照有无static修饰分为:静态代码块,实例代码块。
静态代码块格式:
static {
}
必须用static修饰。属于类,与类一起加载,自动触发执行一次!
静态代码块可以用于执行类的方法之前进行静态资源的初始化操作。
实例代码块格式:
{
}
<1>必须无static修饰。属于类的每个对象,会与类的每个对象一起加载,每次创建对 象的时候代码执行一次。
<2>实例代码块可以用于初始化实例资源
<3>实例代码块实际上是提取到每个构造器中执行的。
内部类
内部类是指定义在一个类里面的类就是内部类。
内部类的分类:
(1)静态内部类
(2)实例内部类
(3)局部内部类
(4)匿名内部类
内部类的作用:
可以提供更好的封装性,内部类有更多权限修饰符,封装性有更多的控制。
(1)静态内部类
有static修饰,属于外部类本身,会加载一次。
定义格式:
class A{
public static class B{
}
}
B 就是静态内部类
静态内部类创建对象的格式:
外部类名称 . 内部类名称 对象名称 = new 外部类名称 . 内部类名称();
A.B i = new A.B();
(2)实例内部类
无static修饰,属于外部类的每个对对象,与对象一起加载。
定义格式:
class A{
public class B{
}
}
实例内部类创建对象的格式:
外部类名称.内部类名称 对象名称 = new 外部类构造器.new 内部类构造器;
A.B I = new A() . new B();
实例内部类的成员特点:
实例内部类中不能定义静态成员,其他都可以定义。
(3)局部内部类
定义在方法中,构造器中,代码块中,for循环中的内部类就是局部内部类。
局部内部类的特点:
只能定义实例成员,不能定义静态成员。可以定义常量。
(局部内部类很少用到)
(4)匿名内部类
一个没有名字的局部内部类。
匿名内部类的格式:
new 类名 | 抽象类 | 接口 (形参){
方法重写。
}
Animal a = new Animal() { @Override public void run() { System.out.println("猫跑的贼溜~~~"); } };
final关键字
final可以用于修饰类,方法,变量。
特点:
(1)final修饰类:类不能被继承。
(2)final修饰方法:方法不能被重写。
(3)final修饰变量,变量有且仅能被赋值一次。
final修饰变量的总规则:有且仅能被赋值一次。
成员变量 (被修饰,成员变量变成常量)
静态成员变量:有static修饰,属于类,只能加载一份。
实例成员变量:无static修饰,属于每个对象,与对象一起加载。
局部变量
只能在方法中,构造器中,代码块中,for循环中,用完作用范围消失。
(final修饰局部变量,在运行过程中防止被修改。)
权限修饰符
(上述笔记,作者自己总结。如果不正确的地方,欢迎指正。)