Java学习笔记九:基础知识——final关键字/抽象类/接口

一、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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值