Java进阶:final、抽象类和接口

final、抽象类和接口

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...");
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值