一、final关键字
1、 final表示最终的,不可变的;
final可以修饰变量、方法和类等。
2、 final修饰的类无法继承;
final修饰的方法无法被覆盖,重写;
final修饰的变量只能赋一次值;
final修饰的引用一旦指向某个对象,则不能再重新指向其它对象,但该引用指向的对象内部的数据是可以修改的。
final修饰的实例变量系统不赋默认值,必须手动初始化。
手动赋值:在变量后面赋值,或在构造方法中赋值。
(实例变量在构造方法执行时赋值,new时赋值)
final int age = 20;
3、 final修饰的实例变量一般和static联合使用,称为常量。
常量名建议全部大写,每个单词之间采用下划线衔接。
static final 数据类型 常量名;
public static final double PI = 3.1415926;
实际上,常量和静态变量一样,都存储在方法区,并且都是在类加载时初始化;
区别是,常量的值不能变。
常量一般都是公开的,因为没有被修改的风险。
public static final 数据类型 常量名;
二、抽象类 Abstract
1、 抽象类的定义
类和类之间有共同特征,将这些具有共同特征的类再进一步抽象形成了抽象类。
由于类本身是不存在的,所以抽象类无法创建对象。
抽象类无法实例化,无法创建对象。
抽象类和抽象类实际上可能还会有共同特征,还可以进一步再抽象。
2、 抽象类也属于引用数据类型。
3、 抽象类的语法:
[修饰符列表] abstract class 类名{
类体;
}
4、 抽象类的作用
抽象类无法实例化,无法创建对象,因此抽象类是用来被子类继承的。
5、 final和abstract不能联合使用,这两个关键字是对立的。
6、 抽象类的子类可以是抽象类。
7、 抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的。
8、 抽象类关联的概念————抽象方法
抽象方法表示没有实现的方法,没有方法体的方法。
public abstract void doSome();
抽象方法的特点是:
① 没有方法体,以分号结尾;
② 前面修饰符列表中有abstract关键字。
抽象类中不一定有抽象方法,抽象方法只能出现在抽象类中。
9*、一个非抽象的类继承抽象类,必须将抽象类中的抽象方法进行覆盖/重写/实现。
抽象类继承抽象类,无需重写抽象方法。
10、面向抽象编程
面向抽象编程,而不是面向具体编程,降低程序的耦合度,提高程序的扩展力。
abstract class Animal{
public abstract void move();
}
class Bird extends Animal{
// 非抽象类继承抽象类,必须对抽象方法进行重写/覆盖/实现
public void move(){
System.out.println("Fly");
}
}
Animal a = new Bird();
a.move();
// 编译时调用Animal的move()
// 运行时运行Bird的move()
// 这就是面向抽象编程
11、(判断题):java语言中凡是没有方法体的方法都是抽象方法。
错误。
Object类中有很多方法都没有方法体,都是以“;”结尾的,
但他们都不是抽象方法,例如:
public native int hashCode();
这个方法底层调用了C++写的动态链接库程序。
前面修饰符列表中没有:abstract。有一个native。表示调用JVM本地程序。
三、接口
1、 接口的基础语法
1.1 接口是一种引用数据类型;
接口是完全抽象的。抽象类是半抽象的,
也可以说接口是特殊的抽象类。
1.2 接口的语法格式:
[修饰符列表] interface 接口名 {}
1.3 接口支持多继承,一个接口可以继承多个接口。
interface C extends A, B{
}
1.4 接口中只包含两部分内容:
常量、抽象方法
1.5 接口中所有的元素都是public修饰的。
1.6 接口中的抽象方法定义时:public abstract修饰符可以省略。
// public abstract int sum(int a, int b);
int sum(int a, int b);
1.7 接口中的方法都是抽象的,所以接口中的方法不能有方法体。
1.8 接口中常量的public static final可以省略。
// public static final double PI = 3.1415926;
double PI = 3.1415926;
2、 类实现接口
2.1 使用implements关键字实现
语法:
class 类名 implements 接口名{
}
2.2 当一个非抽象类实现接口时,必须将接口中所有的抽象方法全部实现(覆盖/重写)。
2.3 接口支持多继承,一个类可同时实现多个接口
弥补了类单继承的缺陷。
接口之间即使没有继承关系,也可进行强制类型转换,
但运行时可能会出现ClassCastException异常。
2.4 继承和实现同时存在
extends和implements可以共存,extends在前,implements在后。
// 先继承后实现
class Animal{}
interface Flyable{
void fly();
}
class Cat extends Animal implements Flyable{
public void fly(){
System.out.print("flying")}
}
// 只继承不实现
class Dog extends Animal{}
// 只实现不继承(默认继承了Object)
class Pig implements Flyable{
public void fly(){
System.out.println("flying")
}
}
2.5 使用接口写代码时,可以使用多态
(父类型引用指向子类型对象)
3、 接口在开发中的作用
接口在开发中的作用,类似于多态在开发中的作用
降低程序耦合度,提高程序扩展力
面向接口编程,可以降低程序的耦合度,提高程序的扩展力。符合OCP开发原则。
接口的使用离不开多态机制。(接口+多态才可以达到降低耦合度。)
4、 类与类之间的关系
is a :
继承关系
A extends B;
has a:
关联关系,通常以属性形式存在
A{
B b;
}
like a:
实现关系,通常是类实现接口
A implements B;