abstract关键字,this关键字和多类合作

abstract 关键字, final 关键字和多类合作
1. abstract 关键字
1.1代码的实际问题
目前代码中 ,设计 LOL 英雄基类,同事带有 qwer 四个方法对应 四个技能,子类 继承父类,可以直接使用已经具备执行能力的 qwer 方法,但是如果直接使用会发现父类方法无法满足子类的特征情况,并且没有语法报错,是在用户的过程中发现对应问题。	
	吃屎可以使用重写操作,在子类中重写父类放到,满足之类特征情况。

目前代码流程
	继承---> 调用 --> 出现问题 ---> 重写 ---> 解决问题
期望代码流程
	继承--> 子类强制重写【不满足语法报错】---> 用户完美使用
	
【期望】
	父类限制子类操作,必须强制重写必要方法,并非是在用户发现问题之后,在返工!!
	
1.2 使用 abstract 关键字解决以上问题

abstract 关键字作用

父类中使用 abstract 关键字修饰

/**
 * abstract 关键字演示代码, 利用 Eclipse 提示信息包括快速修复功能,引导完成代码
 * abstract 关键字作用:
 * 			父类中使用 abstact 关键字修饰的成员方法,要求子类强制重写
 * 
 * 第一步:
 * 		使用 abstract 关键字修饰目标方法
 * 		【错误一】
 * 			Abstract method do not specify a body
 * 			abstract 修饰的方法不能有方法体【语法要求】
 * 		【语法总结】
 * 			abstract 修饰方法没有方法体
 * 		【Eclipse 快速修复】
 * 			Ctrl + 1  ==> 选择Remove method body
 * 			Eclipse  快速修复建议选择 删除方法体
 * 
 * 第二步:
 * 		删除方法体后,代码中依然存在问题
 * 		【错误二】
 * 			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 修饰的方法。
 * 		【语法总结】
 * 			abstract 修饰的方法必须定义在一个 abstract 修饰的类内
 *		【Eclipse 快速修复】
 *			Ctrl + 1 ==> Make type 'LOLHero' abstract
 *				Eclipse 快速修复建议选择 使用abstract 关键字修饰 LOLHero 类 
 * 
 * 
 * 
 * 第三步:
 * 			abstract 修饰 LOLHero 类
 * 			【错误三】
 * 
 * 			The type Monkey must implement the inherited abstract method LOLHero.q()
 * 			猴子类必须实现继承得到在 LOLHero 类内使用 abstract 关键字修饰的方法
 * 
 * 			【语法总结】
 * 			子类如果没有abstract 关键字修饰,必须【实现】父类中所有使用abstract 修饰的没有方法体的方法
 * 			【eclipse 快速修复】
 * 			Ctrl + 1  		Add unimplement method
 * 							添加没有实现的方法
 * */
abstract class  LOLHero {
	abstract public void q();
	public void w() {
		System.out.println("W技能");
	}
	public void e() {
		System.out.println("E技能");
	}
	public void r() {
		System.out.println("R技能");
	}	
}

class Monkey extends LOLHero{

	@Override
	public void q() {
		// TODO Auto-generated method stub
		System.out.println("如意金箍棒~~");
		
	}
	
}
class Pig extends LOLHero{

	@Override
	public void q() {
		// TODO Auto-generated method stub
		System.out.println("通天耙");	
	}
	
}

public class Demo2 {
	public static void main(String[] args) {
		Monkey monkey = new Monkey();
		Pig pig = new Pig();
		monkey.e();
		monkey.q();
		monkey.w();
		monkey.r();
	
		pig.e();
		pig.w();
		pig.r();
		pig.q();
		
	}
}

1.3 abstract 实例化
/**
		 * 
		 * 是否可以实例化/创建 abstract 修饰类对应的对象??
		 * 假设:
		 * 		当前代码中实例化/创建了 BaseType 对象
		 * 		请问当前 BasesType 对象调用 testAbstract 方法会有什么效果??
		 * 分析:
		 * 		testAbstract 方法使用 abstract 关键字修饰,对应方法没有方法体
		 * 		没有执行目标和执行内容,【无法执行,语法报错】
		 * 
		 * 假设不成立:
		 * 		abstract 关键字修饰的类,无法实例化/创建对象
		 * 
		 *为什么 abstract 修饰的类内语句全部都是正确的方法,为什么还是无法实例化
		 *		1. abstract 关键字修饰的类【有可能】 存在 abstract 修饰的方法
		 *		2. abstract 修饰的方法要求没有方法
		 *		3. 如果实例化 abstract 修饰类 得到了对应的对象,就【有可能】 存在没有方法体的方法
		 *			采用 abstract 关键字修饰方法,无法执行语法报错 
		 * 		开发中【有可能】出现错误 ==> 一定出现错误 ==> 语法错误
		 * 
		 * */
1.4 abstract 关键字使用总结
1. abstract 修饰的方法没有方法体。
	abstract 关键字的重点是在于修饰方法。
2. abstract 修饰的方法,要求继承当前 abstract 所在类对应子类必须强制实现对应的 abstract 方法
	子类非 abstract 修饰,继承abstract 对应的父类,必须事先所有的abstract 方法。
3. abstract 修饰的方法,有且只能够定义在 abstract 修饰的类内 或者 interfect 接口内
4. abstract 修饰的类无法实例化
	因为 abstract 关键字修饰的类中,有可能存在只有方法声明的 abstract 修饰方法,这一类方法无法实例化对	   象调用执行。
2.局部变量
2.1局部变量
定义在方法中的变量 ==> 局部变量
for (int i = 0;i < 10; i++) {
	//循环体
}
System.out.println(i);
/*语法报错 i 没有定义
	 	for 循环条件中定义声明的变量i 对应在有效范围是在 for 循环大括号内,超出大括号范围无效。
*/
int num = 10;
int num = 20;
/*
语法报错,重复定义 num 报错
*/
for (int i = 0;i < 10; i++) {
    
}
for (int i = 0; i < 10; i++) {
    
}
/*
每个for 循环中 i 都是各自区间有效
*/


for (int i = 0; i < 10; i++) {
    if (5 == i) {
        int num = 10;
    }
    System.out.println(num);
}

/*
	int num 定义在 if 分支结构大括号内,有效范围有且只有在 if 对应大括号以内
超出范围无效
*/
2.2 局部变量特征
特征:
	1. 局部变量先定义后使用
	2. 局部变量如果在没有被复制的情况下,有且只能参与赋值操作,其他任何操作无法执行
	3. 局部变量在定义对应的大括号范围有效,一旦超出范围无效
		大括号范围 方法体大括号,分支结构,循环结构
	4. 局部变量在有效范围以内唯一,不可以重复定义
	5.局部变量在内存的【栈区】
	6.局部变量主要用于在代码运行过程中,针对于数据的临时存储和使用
		int num = 10;
		num += 10;
		num = 20;
	7.【生存周期、 作用范围】都在对应大括号范围以内
2.3 成员变量特征
特征:
	1. 成员变量定义 class 大括号以内
	2. 成员变量主要作用描述当前类所具备的属性。
	3. 成员变量是在实例化对象之后,储存在内存的【堆区】
	4. 成员变量
		【生存周期】从实例化对象开始,到当前对象被销毁结束。
			JVM 的 GC 垃圾回收机制
		【作用范围】
			作用范围取决于当前对象在哪里
3. final 关键字
3.1 修饰成员变量

特征总结

  1. final 修饰成员变量一旦被赋值,后期无法修改,可以认为是带有名称的常量

  2. final final 修饰的成员变量定义时必须初始化!!

    初始赋值手段有两种

    2.1定义时直接赋值对应的数据内容

    2.2【高阶用法】 使用构造方法给予 final 修饰成员变量初始化赋值操作

package com.qf.a_final;


class TypeA {
	
	public int num = 10;
	//final 修饰成员变量
	
	/**
	 * 
	 * The blank final field msg may not have been initialized
	 * 		final 修饰的成员变量 msg 可能尚未初始化
	 * 
	 * 【注意】
	 * 		final 修饰的成员变量定义时必须初始化!!
	 * 		初始赋值手段有两种
	 * 			1. 定义时直接赋值对应的数据内容
	 * 			2. 【高阶用法】 使用构造方法给予 final 修饰成员变量初始化赋值操作
	 * */
	//public final String msg = "你好";
	 public final String msg;
	 
	 public TypeA(String msg) {
		 this.msg = msg;
	 }
}


public class Demo1 {
	public static void main(String[] args) {
		TypeA typeA = new  TypeA("测试");
		System.out.println(typeA.num);
		System.out.println(typeA.msg);
		
		
		
		typeA.num = 20;
		/**
		 * 
		 * 【报错】
		 * The final field TypeA.msg cannot be assigned
		 *   TypeA 类适用 final 修饰的成员变量 msg 不能被赋值
		 *   
		 *   【注意】
		 *   		final 修饰的成员变量一旦被赋值,后期无法修改,可以认为是
		 *   		带有名称的常量
		 *   
		 * typeA.msg = "郑州加油";
		 * */
		
	}
}

3.2修饰成员方法

特征总结

​ 1.final 修饰的方法不能被重写

​ 2.final 修饰的方法常见于核心业务逻辑,例如 支付

package com.qfedu.b_final;

class TypeB {
	final public void test() {
		System.out.println("正常方法");
	}
}

class TypeC extends TypeB {
	/*
	 * 【错误】
	 * 		Cannot override the final method from TypeB
	 * 		子类不能重写 TypeB 类内 final 修饰的成员方法 
	 * 【注意】
	 * 		final 修饰的成员方法为最终方法,无法被重写!!!
	 * 【作用】
	 * 		限制项目中的核心业务逻辑,重要业务逻辑
	 * 		例如 支付操作
	 */
	@Override
	public void test() {
		System.out.println("重写");
	}
}

public class Demo2 {
	public static void main(String[] args) {
		TypeC typeC = new TypeC();
		typeC.test();
	}
}
3.3修饰类

特征总结

​ 1.final 修饰的类不能被继承,没有子类

  1. Java 中的 String 类型就是 final 修饰的类型
package com.qf.a_final;


final class TypeD {
	
}
/**
 * The type TypeE cannot subclass the final class TypeD
 * 	 子类不能继承一个被final 修饰的类
 * 
 * 【注意】
 * 			final 修饰的类没有子类,不能被继承,一般用于代码中的基础类
 * 			例如 java 中的 String 类型
 * 
 * */
class TypeE extends TypeD {
	
}


public class Demo3 {

}
3.4修饰局部变量

特征总结

  1. final 修饰的局部变量 有且只能被赋值一次,赋值之后无法修改
  2. 引用数据类型使用 final 修饰,引用指向不可变,但是指向空间数据内容可变
package com.qf.a_final;


class Person {
	
	
	int  id;
	String name;
	int age;
}



public class Demo4 {
	public static void main(String[] args) {
		final int num;
		num = 10;
		
		
		/**
		 * 【错误】
		 * The final local variable num may already have been assigned
		 * final 修饰的局部变量 有且只能被赋值一次,赋值之后无法修改
		 * 
		 * local varible 局部变量
		 * 
		 * */
		
		//num = 20;
		
		final Person p = new Person();
		/**
		 * 【错误】
		 * The final local variable p cannot be assigned. It must be blank and not using a compound assignment
		 * 引用数据类型使用 final 修饰,引用指向不可变,但是指向空间数据内容可变
		 * 
		 * final 修饰 就近原则,修饰谁谁不能变
		 * 房子装修问题
		 * 			房子地址不可变
		 * ·		装修随便来
		 * */
		/*
		p = new Person();
		p.id = 10;
		p.name = "张三";
		p.age = 20;
		*/
				
	}
}

4. 多类合作
4.1 电脑和配件问题
键盘: ==> 键盘类
	属性:品牌名称,按键个数
		
屏幕: ==> 屏幕类
	属性: 品牌名称,尺寸
	
	
	
电脑: ==>  电脑类
	实际组成:
		CPU 内存 硬盘 屏幕 键盘 主板.....
	目前属性:【成员变量】
    	键盘
    	屏幕
    【知识点】
    	自定义类型作为其他类型的成员变量组成
  
 面向对象的代码,想清楚生活逻辑比代码本身重要!!!

修饰,引用指向不可变,但是指向空间数据内容可变
*
* final 修饰 就近原则,修饰谁谁不能变
* 房子装修问题
* 房子地址不可变
* · 装修随便来
* /
/

p = new Person();
p.id = 10;
p.name = “张三”;
p.age = 20;
*/

}

}


##### 4. 多类合作

###### 4.1 电脑和配件问题

键盘: ==> 键盘类
属性:品牌名称,按键个数

屏幕: ==> 屏幕类
属性: 品牌名称,尺寸

电脑: ==> 电脑类
实际组成:
CPU 内存 硬盘 屏幕 键盘 主板…
目前属性:【成员变量】
键盘
屏幕
【知识点】
自定义类型作为其他类型的成员变量组成

面向对象的代码,想清楚生活逻辑比代码本身重要!!!


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值