14_abstract 关键字,final 关键字和多类合作
1、abstract 关键字
1.1 abstract 关键字的使用
abstract 关键字的使用:
1、用来定义 Java 中的抽象类,抽象方法
2、父类中使用 abstract 关键字修饰的成员方法,要求子类强制重写
3、abstract 修饰的类无法实例化
使用软件为 Eclipse
/*
* 复制快捷键 Ctrl + Alt + ↑/↓
* 删除快捷键 Ctrl + D
* 撤销快捷键 Ctrl + Z
*
* 【Eclipse 快速修复】
* Ctrl + 1
*
* 【Eclipse 快速补齐】
* Alt + /
*/
/*
* abstract 关键字作用:
* 父类中使用 abstract 关键字修饰的成员方法 要求子类强制重写
*/
/**
* 使用 abstract 修饰的成员变量和成员方法只能定义在 abstract 修饰的类中或者 interface 修饰的接口中
*
* 设计一个原神角色基础抽象类 设置两个抽象方法 对应两个技能
*
* @author Echo
*/
abstract class BaseYuanShenRole {
public abstract void e();
public abstract void q();
}
/**
* ZhongLi 类继承 BaseYuanShenRole 类
*
* @author Echo
*/
class ZhongLi extends BaseYuanShenRole {
public void e() {
System.out.println("地心");
}
public void q() {
System.out.println("天星");
}
}
/**
* LingHua 类继承 BaseYuanShenRole 类
*
* @author Echo
*/
class LingHua extends BaseYuanShenRole {
public void e() {
System.out.println("神里流·冰华");
}
public void q() {
System.out.println("神里流·霜灭");
}
}
/*
* abstract 修饰的类无法实例化
*/
public class Demo1 {
public static void main(String[] args) {
//实例化 抽象类 BaseYuanShenRole 的子类 ZhongLi 类对象和 LingHua 类对象
ZhongLi zhongLi = new ZhongLi();
LingHua lingHua = new LingHua();
zhongLi.e();
zhongLi.q();
lingHua.q();
lingHua.e();
System.out.println("挑战成功");
}
}
运行结果如下
1.2 abstract 关键字总结
1、abstract 关键字修饰的方法没有方法体
2、子类必须强制实现父类中使用 abstract 修饰的方法
3、abstract 修饰的方法只能定义在 abstract 修饰的类内或者 interface 接口内
4、abstract 关键字修饰的类无法实例化
2、局部变量
2.1 局部变量的定义
定义在方法内或代码块中的变量
作用域是该变量所在的方法或者代码块
生存周期是从方法被调用时开始到方法调用结束时结束。
2.2 局部变量的特征
特征:
1、局部变量先定义后使用
2、局部变量需要先进行赋值,才能执行后续的操作
3、局部变量在自身的作用域内有效,一旦超出作用域无效
4、局部变量在作用域内唯一,不可以重复定义
5、局部变量在内存的 栈区
6、局部变量主要用于在代码运行过程中对数据进行临时的存储和使用
2.3 成员变量的特征
特征:
1、成员变量定义在 class 大括号以内
2、成员变量是在实例化所在类的对象之后 存储在内存的 堆区
3、成员变量的生存周期 从实例化对象开始 到当前对象被销毁结束 (JVM 的 GC 垃圾回收机制 会自动回收)
成员变量的作用域 取决于当前对象的所在位置
3、final 关键字
3.1 修饰成员变量
特征:
1、final 修饰的成员变量一旦被赋值 后期无法修改 可以认为是带有名称的常量
2、final 修饰的成员变量定义时必须初始化 方式有两种
1> 定义时直接赋值对应的数据内容
2> 【高阶用法】使用构造方法给予 final 修饰的成员变量初始化赋值操作
/*
* final 修饰的成员变量
*/
class TypeA {
//定义 public 修饰的成员变量 num 初始化为 0
public int num = 10;
/* The blank final field msg may not have been initialized
* final 修饰的成员变量 msg 可能尚未初始化
* final 修饰的成员变量在定义时必须初始化
* 初始化赋值手段有两种
* 1、定义时直接赋值对应的数据内容
* 2、【高阶用法】使用构造方法给予 final 修饰的成员变量初始化赋值操作
*/
//public final String msg = "final 修饰的成员变量";
public final String msg;
public TypeA(String msg) {
this.msg = msg;
}
}
public class Demo1 {
public static void main(String[] args) {
TypeA typeA = new TypeA("final 修饰的成员变量");
System.out.println(typeA.num);
System.out.println(typeA.msg);
//没有 final 修饰的成员变量 重新赋值
typeA.num = 20;
/* final 修饰的成员变量为最终变量 不能被修改 用于定义有名称的常量 */
//typeA.msg = "常量";
}
}
运行结果如下
3.2 修饰成员方法
特征:
1、final 修饰的方法不能被重写
2、final 修饰的方法常见于核心业务逻辑
package com.qfedu.b_final;
class TypeB {
/* final 修饰的成员方法为最终方法 无法被重写*/
final public void test() {
System.out.println("final 修饰的成员方法");
}
}
class TypeC extends TypeB {
/**
* @Overried
*/
/* final 修饰的成员方法为最终方法 无法被重写*/
//public void test() {}
}
public class Demo2 {
public static void main(String[] args) {
TypeB typeB = new TypeB();
}
}
3.3 修饰类
特征:
1、final 修饰的类不能被继承 没有子类
2、Java 中的 String 类型 就是 final 修饰的类型
package com.qfedu.b_final;
final class TypeD {
int id;
}
/* final 修饰的类没有子类 不能被继承 */
//class TypeE extends TypeD {}
public class Demo3 {
public static void main(String[] args) {
TypeD typeD = new TypeD();
/* final 修饰就近原则 */
typeD.id =10;
typeD.id = 20;
}
}
3.4 修饰局部变量
特征:
1、final 修饰的局部变量只能被赋值一次 赋值之后无法修改
2、引用数据类型使用 final 修饰 指向的地址不可变 但是地址中从存储的数据内容可以改变
package com.qfedu.b_final;
class Person {
int id;
String name;
int age;
}
public class Demo4 {
public static void main(String[] args) {
final int num = 10;
/*
* final 修饰的局部变量只能被赋值一次 赋值之后无法被修改
*/
//num = 20;
/*
* 引用数据类型使用 final 修饰时
* 指向地址不可变
* 地址中存储的数据可以改变
*/
final Person p = new Person();
/* final 修饰就近原则 修饰谁谁不能改变 */
//p = new Person();
p.id = 10;
p.name = "小芳";
p.age = 18;
}
}