abstract关键字和final关键字
目录
abstract关键字和final关键字
1. abstract关键字
1.1 强制重写场景分析
父类方法继承给子类使用,子类没有重写的情况,可以执行操作,但是无法满足子类需求,子类应该重写父类继承得到方法,满足子类的特征性。
LOLHero 类内准备 QWER 方法,子类继承之后,应该根据自己的所需进行重写操作,但是目前情况下,子类不重写父类方法,没有任何的错误提示和警告机制。
考虑
将用户面临的错误前置到代码编译阶段,如果没有重写提要求的方法,直接报错!!!
1.2 abstract 语法要求
abstract 修饰的方法,子类必须重写!!!
package com.qfedu.a_abstract;
/**
* 英雄联盟 【基类】
* 【公告】
* LOLHero 中的 QWER 方法 必须重写,谁不重写谁是狗 @全体成员
* @author Anonymous
*
* abstract关键字使用错误解决,需要利用 Eclipse 工具进行引导
* 第一个错误:
* Abstract methods do not specify a body
* abstract 修饰的方法不可以有方法体
* 快速修复: Ctrl + 1
* 选择 Remove method body 移除 abstract 修饰方法方法体
*
* 第二个错误:
* The abstract method q in type LOLHero can only be defined by an abstract class
* LOLHero类内的 abstract 修饰方法 q 有且只能定义在一个 abstract 修饰类内
* The type LOLHero must be an abstract class to define abstract methods
* LOLHero 必须 是一个 abstract 修饰类才可以定义 abstract 修饰方法。
* 快速修复: Ctrl + 1
* 选择 Make Type 'LOLHero' abstract 使用 abstract 关键字修饰类
*
* 第三个错误:
* The type HappyWindBoy must implement the inherited abstract method LOLHero.q()
* HappyWindBoy 类 必须实现通过继承得到的在 LOLHero 类内 abstract 修饰方法 q
* The type Thresh must implement the inherited abstract method LOLHero.q()
* Thresh 类 必须实现通过继承得到的在 LOLHero 类内 abstract 修饰方法 q
* 快速修复: Ctrl + 1
* 选择 Add unimplemented methods 添加尚未实现的方法
*/
public abstract class LOLHero {
abstract public void q();
abstract public void w();
abstract public void e();
abstract public void r();
}
package com.qfedu.a_abstract;
/**
* 快乐风男 继承 LOLHero 类
* @author Anonymous
*
*/
public class HappyWindBoy extends LOLHero {
@Override
public void q() {
System.out.println("斩钢闪");
}
@Override
System.out.println("风之障壁");
}
@Override
public void e() {
System.out.println("踏前斩");
}
@Override
public void r() {
System.out.println("狂风绝息斩");
}
}
package com.qfedu.a_abstract;
public class Demo1 {
public static void main(String[] args) {
HappyWindBoy happyWindBoy = new HappyWindBoy();
happyWindBoy.q();
happyWindBoy.w();
happyWindBoy.e();
happyWindBoy.r();
Thresh thresh = new Thresh();
thresh.e();
thresh.q();
thresh.r();
thresh.w();
}
}
1.3 abstract 关键字总结
1. abstract 关键字修饰的方法 没有方法体
2. abstract 关键字修饰的方法,有且只能定义在 abstract 修饰的类内 或者 interface 接口内
3. 非 abstract 修饰子类继承一个 abstract 修饰类,必须要求实现在 abstract 类内的所有没有方法体的 abstract 方法。
4. 请问:
没有方法体的方法,可以执行吗???
不可以执行,没有执行目标。
abstract 修饰方法有且只有方法声明
请问:
abstract修饰的类是否可以创建对象??? new对象
不能!!!
如果可以创建 abstract 修饰类对应的对象,在 abstract 类内有可能存在 abstract 修饰的没有方法体
的方法声明,这部分内容无法执行,不符合代码执行要求,语法错误!!!
5. abstract 修饰类内可以定义非 abstract 修饰方法。
2. final关键字
2.1 final 可以修饰的内容
成员变量
1. 定义时必须初始化
2. 一旦被赋值,后期无法修改
3. 常用于带有名字的常量!!!例如 MAX_VALUE MIN_VALUE MAX_ARRAY_SIZE DEFAULT_CAPACITY
成员方法
不可以被子类重写,常用于涉及到安全校验的核心方法。
局部变量
一旦被赋值,后期无法修改
类
没有子类,不能被继承,断子绝孙。
Java 源代码中 java.lang.String 类就是一个 final 修饰类
2.2 final 面试题
package com.qfedu.b_final;
class Dog {
String name;
final int age = 10;
}
public class Demo2 {
public static void main(String[] args) {
final Dog dog = new Dog();
/*
1. dog = new Dog();
2. dog.name = "豆豆";
3. dog.age = 20; 错
哪一个是对的???
第二个是对的!!!
final 修饰内容是一个局部变量,同时也是一个 引用数据类型 变量,引用数据类型变量中
存储的数据为对应内存空间地址,也就是 new + Dog() 创建对象在内存【堆区】的地址。
该地址存储于 dog 对象中,存储内容不可以改变。
但是 new + Dog() 创建对象所处的内存【堆区】数据空间内容随意
【指向不可变,执向空间可变】
例如:
你买的房子坐落不可变,但是房子里面的装修,布置,安排随便你!!!
*/
dog.name = "豆豆";
// dog = new Dog();
}
}
3. 多类合作
3.1 汽车和修理厂
汽车是一个类:
属性:
颜色 品牌 轮胎个数
行为:
飙车
修理厂是不是一个类:
属性:
联系方式 名称 位置
行为:
修车
3.2 电脑,屏幕和键盘
屏幕是一个类:
属性: 尺寸 品牌
键盘是一个类:
属性: 按键个数 品牌
电脑是一个类:
属性:
屏幕
键盘
行为:
换键盘
换屏幕