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 电脑,屏幕和键盘
屏幕是一个类:
	属性:	尺寸 品牌

键盘是一个类:
	属性: 按键个数 品牌

电脑是一个类:
	属性:
		屏幕
		键盘
	行为:
		换键盘
		换屏幕
posted @ 2022-03-10 17:57  qtyanan  阅读(67)  评论(1编辑  收藏  举报