1.final
1.final时java语言中的一个关键字。
2.final表示最终的、不可变的。
3.final修饰的变量
,只能赋一次值,不能重新赋值。
4.final修饰的方法
无法被重写。
5.final修饰的类
无法被继承。
6.final修饰的引用只能指向1个对象,并且永远指向该对象,无法再指向其它对象。并且在该方法执行过程中,该引用指向对象之后,该对象不会被垃圾回收器回收。直到当前方法结束,才会释放空间。
7.final修饰的实例变量,系统不会赋默认值,必须手动赋值。
8.final修饰的实例变量前面一般添加static关键字,变为静态的,存储在方法区,节省内存空间。
9.static final 联合修饰的变量称为常量
,并且和静态变量一样,都是在类加载时初始化,都存储在方法区。区别:常量的值不能变,常量一般用public修饰。
public static final double PI = 3.1415926;
2.抽象类
1.抽象类是类与类之间的共同特征所提取形成的。类是由对象与对象之间的共同特征所提取形成的。类本身是不存在的,所以抽象类无法创建对象无法实例化
。抽象类主要是用来被子类继承的。
2.抽象类也属于引用数据类型。
3.抽象类语法:
[修饰符列表] abstract class 类名{
类体
}
4.final和abstract 不能联合使用,这两个关键字是对立的。
5.抽象类的子类可以是抽象类,也可以是非抽象类。
6.抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的。
7.抽象类中不一定有抽象方法,抽象方法必须出现在抽象类中。
8.一个非抽象的类,继承抽象类,必须将抽象类中的抽象方法进行覆盖/重写/实现。
public class AbstractTest{
public static void main(String[] args){
//使用多态
Animal a = new Cat(); //这就是面向抽象编程
a.move();
}
}
//动物类(抽象类)
abstract class Animal{
//抽象方法
public abstract void move();
}
//子类(非抽象的)
class Cat extends Animal{
//需要实现父类(抽象类)的抽象方法
public void move(){
System.out.println("猫在跑步");
}
}
//如果子类也是抽象类,则可以不用实现父类(抽象类)的抽象方法
abstract class Dog extends Animal{
}
3.接口
1.接口也是一种引用数据类型。
2.接口是完全抽象
的(抽象类是半抽象的)。接口是特殊的抽象类。
3.接口的语法:
[修饰符列表] interface 接口名{}
4.接口支持多继承
。一个接口可以继承多个接口,一个类可以实现多个接口。
/*
继承使用extends关键字。
实现使用implements关键字。
*/
interface A{}
interface B{}
interface C extends A,B{}
class MyImpl implements A,B{}
5.接口中只包含常量
和抽象方法
。抽象方法不能有方法体。
6.接口中的所有元素都是public修饰的。
7.接口中的抽象方法定义时:public abstract修饰符可以省略。
8.接口中的常量定义时:public static final修饰符可以省略。
9.一个非抽象的类,实现接口的时候,必须将接口中所有方法加以实现。
10.两个接口之间虽然没有继承关系,但是写代码时可以互转。编译没问题,但是运行时可能会出现:ClassCastException异常
public class InterfaceTest1{
public static void main(String[] args){
A a = new C();
//a.m2(); //编译报错,A接口中没有m2方法。
B b = new C();
//编译没问题,运行也没问题
B b1 = (B)a; //a引用要调用B中的m2方法必须进行强转
b1.m2();
A a1 = new D();
//编译没问题,运行时会出现java.lang.ClassCastException异常
//B b1 = (B)a1; //接口和接口之间没有继承关系也可以强转
if(a1 instanceof B){ //可以加个判断
B b2 = (B)a1;
}
}
}
//接口
interface A{
void m1();
}
interface B{
void m2();
}
//非抽象类
class C implements A,B{
//实现A接口中m1方法
public void m1(){
System.out.println("m1...");
}
//实现B接口中m2方法
public void m2(){
System.out.println("m2...");
}
}
class D implements A{
//实现A接口中m1方法
public void m1(){
System.out.println("m3...");
}
}