我在千峰学习的第十四十五天–关键字

我在千峰学习的第十四十五天–关键字

题外话

	这几天在上网课,因为疫情的原因,所以课程进度会比较慢一点,我就把两天或者三天的课程整合到一天里面去了,周六日是没有讲课的,所以有时候实际日期可能跟课程的日期对不上。
	前期都是一些比较简单的代码,我就没有上传,后期代码量复杂,代码多了以后,我在把代码分类上传一下。
	还有一些我平常的对Java的感悟或者遇到的问题随后我会在单独写一个系列,一周或者两周写一篇把。

知识点

Eclipse 使用

IDE 集成开发工具

安装教程及使用网络地址
https://www.runoob.com/eclipse/eclipse-tutorial.html
常用快捷键:
Alt + / 快速补齐
Ctrl + / 注释
Shift + Alt + S 构造方法/setter getter
Ctrl + S 保存
Ctrl + 1 快速修复/错误修复建议
Ctrl + D 删除光标所在行

多类合作

场景分析

台式机电脑:
	成员变量:
		键盘 
		屏幕
			这里所需的是键盘类对象和屏幕类对象。
	成员方法:
		换键盘,换屏幕

键盘类:
	成员变量:
		品牌
		按键个数

屏幕类:
	成员变量:
		品牌
		尺寸
		

核心逻辑

public class MainProject {
	public static void main(String[] args) {
		/*
		 * 创建屏幕类对象和键盘类对象
		 */
		Screen screen = new Screen("AOC", 24);
		Keyboard keyboard = new Keyboard("Cherry", 108);
		
		/*
		 * 组装电脑, 利用键盘类对象和屏幕类对象作为方法的参数,创建Computer类对象。
		 */
		Computer computer = new Computer(keyboard, screen);
		
		/*
		 * 看一下电脑的配置,当前电脑的屏幕属性和键盘属性
		 */
		computer.show();
		
		/*
		 * 屏幕出现问题
		 */
		System.out.println("--------------------屏幕出现问题--------------------");
		Screen screen2 = new Screen("华硕", 26);
		/*
		 * 当前Computer类对象 computer 调用setter方法,更换屏幕
		 */
		computer.setScreen(screen2);
		/*
		 * 电脑展示配置
		 */
		computer.show();
		
		/*
		 * 键盘出现问题
		 */
		System.out.println("--------------------键盘出现问题--------------------");
		Keyboard keyboard2 = new Keyboard("IKBC", 87);
		/*
		 * 当前Computer类对象 computer 调用 setter 方法,更换键盘
		 */
		computer.setKeyboard(keyboard2);
		
		/*
		 * 再次展示电脑配置
		 */
		computer.show();
	}
}

abstract关键字

场景分析

/**
 * 英雄联盟中的英雄类
 */
class LOLHero {
	public void q() {
		System.out.println("Q技能");
	}

	public void w() {
		System.out.println("W技能");
	}

	public void e() {
		System.out.println("E技能");
	}

	public void r() {
		System.out.println("R技能");
	}
}

/**
 * HappyWindBoy 继承 LOLHero 类 这里可以通过继承得到 QWER 方法
 */
class HappyWindBoy extends LOLHero {	
}

/**
 * Aphelios 厄斐琉斯 继承LOLHero类,可以通过继承得到 QWER 方法
 */
class Aphelios extends LOLHero {	
}

public class Demo1 {
	public static void main(String[] args) {
		HappyWindBoy happyWindBoy = new HappyWindBoy();
		Aphelios aphelios = new Aphelios();
		
		/*
		 * 从目前的 Java 程序运行角度,每一个方法都没有问题,每一个技能都没有问题。
		 * 
		 * 如果英雄联盟每一个英雄的技能都一样,还有什么可玩性???
		 * 		没有可玩性
		 * 
		 * 【要求】
		 * 	目前代码期望子类可以重写父类中的方法,从而满足子类的特征性,非一致性。
		 *  当前代码没有重写父类方法的情况下,语法没有任何的错误!!!【强制重写语法要求】
		 *  
		 * 【强制重写语法要求】
		 * 	子类没有重写/没有实现父类的方法,语法报错。
		 */
		happyWindBoy.q();
		happyWindBoy.w();
		happyWindBoy.e();
		happyWindBoy.r();
		System.out.println();
		
		aphelios.q();
		aphelios.w();
		aphelios.e();
		aphelios.r();
		
	}
}

abstract关键字语法

一个方法使用 abstract 修饰,要求子类必须【强制重写/强制实现】该方法

代码案例

/**
 * 英雄联盟中的英雄类
 */
/*
abstract关键字使用流程和 Eclipse 提示操作
第一个错误:
	Abstract methods do not specify a body
	abstract 修饰的方法没有方法体
	
	Ctrl + 1 快速修复
		选择 Remove method body
		 	移除方法体	
	
	修复之后的结果
		public void q() {方法体} ==> abstract public void q();

第二个错误:
	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
			将当前 LOLHero 添加 abstract 关键字修饰,成为一个 abstract 修饰的类

第三个错误:
	The type HappyWindBoy must implement the inherited abstract method LOLHero.q()
		HappyWindBoy 类必须实现 通过该继承得到的LOLHero 类内的 q 方法
		
	The type Aphelios must implement the inherited abstract method LOLHero.q()
		Aphelios 类必须实现 通过该继承得到的LOLHero 类内的 q 方法
		
	Ctrl + 1 快速修复:
		选择 Add unimplemented Methods
			添加未实现的方法
			当前的 q 方法只有方法声明,没有方法体,没有方法体的方法无法执行,换而言之,在LOLHero类内只是声明了
			所有的子类都有一个 q 方法,但是该方法具体实现由子类自行完成。
 */
abstract class LOLHero {
	/*
	 * 期望子类可以重写 q 方法,使用 abstract 关键字修饰 q 方法
	 */
	abstract public void q();

	abstract public void w();

	abstract public void e();

	abstract public void r();
}


/**
 * HappyWindBoy 继承 LOLHero 类 这里可以通过继承得到 QWER 方法
 */
class HappyWindBoy extends LOLHero {

	@Override
	public void q() {
		System.out.println("斩钢闪");
	}

	@Override
	public void w() {
		System.out.println("风之障壁");
	}

	@Override
	public void e() {
		System.out.println("踏前斩");
	}

	@Override
	public void r() {
		System.out.println("狂风绝息斩");
	}
	
}

/**
 * Aphelios 厄斐琉斯 继承LOLHero类,可以通过继承得到 QWER 方法
 */
class Aphelios extends LOLHero {

	@Override
	public void q() {
		System.out.println("武器技能");
	}

	@Override
	public void w() {
		System.out.println("月相轮转");
	}

	@Override
	public void e() {
		System.out.println("武器队列系统");
	}

	@Override
	public void r() {
		System.out.println("清辉夜凝");	
	}
	
}

public class Demo1 {
	public static void main(String[] args) {
		HappyWindBoy happyWindBoy = new HappyWindBoy();
		Aphelios aphelios = new Aphelios();
		
		happyWindBoy.q();
		happyWindBoy.w();
		happyWindBoy.e();
		happyWindBoy.r();
		
		System.out.println();
		
		aphelios.q();
		aphelios.w();
		aphelios.e();
		aphelios.r();
		
	}
}

abstract 关键字使用总结

1. abstract 关键字修饰的方法没有方法体
2. abstract 修饰的方法有且只能定义在 abstract 修饰的类内 或者 interface 接口内【后期重点】
3. 一个非 abstract 修饰的类 继承 abstract 类,必须实现在 abstract 类内所有使用 abstract 修饰没有方法体的方法。
4. abstract 类不能创建自己的类对象
	如果可以创建 abstract 修饰类的对象,但是在对象执行方法的过程中,会涉及到 abstract 修饰的没有方法体的方法,无法执行。语法限制 abstract 修饰的类没有自己的类对象。
5. abstract 修饰的方法、对应的类、包括后期学习的接口,都是在制定规则,制定准则。
	例如:
		LOL 游戏中,有一个技能按键是Q,但是每一个英雄 Q 技能的具体情况,操作,效果,特征都是由英雄自己完成
		的。
	abstract 后期也会作为【承上启下】的功能存在

staitc关键字

一、static修饰成员变量

共享单车和饮水机
	1. 所处位置,存放位置是公共区
	2. 所属权,都是归运营公司所有
	3. 使用权,每一个人都可以使用
	4. 共享特征,一旦出现问题,大家都无法使用
static --> 静态的,没有对象
	在开发中,存在一些数据,每一个对象都需要使用,而且数据是一致的,如果给每一个对象在内存空间准备对应数据,和内容,会导致内存冗余,数据浪费。
【考虑】
	将国籍作为一个公共数据/共享数据,提供给每一个对象使用。
	或者如: 3.1415927
	需要使用static
1. static 修饰的静态成员变量,存储在内存的【数据区】,是一个针对于当前类所有对象共享数据,内存存储位置和类对象存储不一样,【没有关系 ==> 没有对象】

2. static 修饰的静态成员变量,通过类名调用与对象无关。【没有对象】

3. static修饰的静态成员变量,不管通过哪一个方式进行修改,所有使用的位置数据都会变化,这是一个共享资源的特征。

4. static修饰的静态成员变量,是随着类文件的加载,直接定义在内存的数据区,所以在没有对象情况下,我们可以通过类名直接调用。当程序退出,JVM首先会回收所有的对象占用的内存空间,销毁所有的对象。再来处理静态成员变量占用的内存【数据区】内容。整个静态成员变量生命周期是从类文件加载开始,到程序退出结束,是早于类对象出现,晚于类对象销毁。静态成员变量和类对象没有关系,【没有对象】
	例如:
		饮水机
		你来之前,它在这里,你走之后,它依然在这里。

5.静态成员变量的所属权归 类 所有,与对象无关。

static 修饰静态成员变量作用

1. 用于处理较为简单的共享资源情况
	销售车票
		每一个窗口都可以认为是销售类一个对象,所有的票务大家统一。
2. 用于带有名字的常量,节约空间,提高效率。
	带有名字的常量基本格式
		public/private static final 数据类型 常量名 = 数据;
		给予数据更好的描述方式。
		public static final int DEFAULT_CAPACITY = 10;
		public static final int MAX_PRIORITY = 10;
		public static final int MIN_PRIORITY = 1;		
		public static final int NORMAL_PRIORITY = 5;		

3. 静态成员变量可以用于计数器累加操作。

4. 后面会用实际案例分析不同的变量使用形式
	成员变量,静态成员变量,局部变量

二、 static修饰成员方法

//静态成员方法基本格式
public static void main(String[] args) {

}

格式总结:
	权限修饰符 static 返回值类型 方法名(形式参数列表) {
		方法体
	}
// 静态成员方法特征
1. 静态成员方法推荐使用类名直接调用,不推荐使用类对象调用。
2. 静态成员方法不可以使用类内的其他非静态成员变量和非静态成员方法,因为【没有对象】。
3. 静态成员方法不可以使用this关键字,this关键字表示调用当前方法的类对象,无法表示类名,不可以使用,【没有对象】
4. 静态成员方法可以使用类内的其他静态成员变量和静态成员方法,【难兄难弟,互不嫌弃】
5. 静态成员方法在类文件(.class)加载过程中,已经在内存的【方法区】准备就绪,具备随时执行的能力。与方法执行相关的所有内容。权限修饰符,返回值类型,方法名,形式参数列表,方法体一系列信息全部明确!!!
//静态成员方法作用
问题:
	成员方法执行效率高还是静态成员方法执行效率高???
		执行静态成员方法可以通过类名直接调用,不需要创建对象,也就节约了对象的创建时间,对于内存的占用,同时不
		需要考虑内存的回收问题。
		静态成员方法执行摆脱类对象的限制,效率高!!
1.静态成员方法作为工具类方法使用。
Java中提供的工具类
	Arrays 数组相关操作工具类。
		static String toString(int[] arr);
			将一个int类型数组,存储数据内容转换成一个字符串
				int[] arr = {1, 2, 3, 4, 5}; 
				==> toString 方法执行
				String [1, 2, 3, 4, 5]
				
		static void sort(int[] arr);
			快速排序算法,默认是升序
				【空间换时间,时间换空间】
				
		static int binarySearch(int[] arr, int target);
二分法查找,要求当前数组是已经排序之后的数组,从排序之后的数组中
找出目标数据,不保证找的数据是整个数组中的第几个,如果没有找到,
返回负数。
import java.util.Arrays;
public class Demo2 {
	public static void main(String[] args) {
		int[] arr = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
		
		/*
		 * sort 排序
		 */
		Arrays.sort(arr);
		
		/*
		 * toString 转字符串
		 */
		String string = Arrays.toString(arr);
		System.out.println(string);
		
		/*
		 * binarySearch 二分法查找
		 */
		int index = Arrays.binarySearch(arr, 16);
		System.out.println(index);
	}
}

三、static修饰静态代码块

代码块

{}

class大括号以内
	构造代码块
	用于初始化当前类的所有类对象,只要调用当前类的构造方法,一定会执行构造代码块内容
	
在方法大括号以内
	局部代码块
	已淘汰,没什么特别大的用途
	
class大括号以内,并且使用 static 修饰
	静态代码块
package com.qfedu.c_staticblock;

class SingleDog {
	int id;
	String name;
	char gender;

	/*
	 *  构造代码块 只要调用当前类的构造方法,构造代码块一定执行
	 *  先执行构造代码块,再来执行构造方法。
	 */
	{
		System.out.println("构造代码块");
	}

	public SingleDog() {
		System.out.println("构造方法1");
	}

	public SingleDog(int id) {
		this.id = id;
		System.out.println("构造方法2");
	}

	public SingleDog(int id, char gender) {
		this.id = id;
		this.gender = gender;
		System.out.println("构造方法3");
	}

	public SingleDog(int id, String name) {
		this.id = id;
		this.name = name;
		System.out.println("构造方法4");
	}

	public SingleDog(int id, String name, char gender) {
		this.id = id;
		this.name = name;
		this.gender = gender;
		System.out.println("构造方法5");
	}

}

public class Demo1 {
	public static void main(String[] args) {
		new SingleDog();
		new SingleDog(10);
		new SingleDog(10, '男');
		new SingleDog(10, "张三");
		new SingleDog(10, "张三", '男');
		
		/*
		 * 局部代码块 作用是提高内存的利用率 增强内存回收
		 */
		{
			int num = 10;
		}
		
		System.out.println(num);
	}
}

静态代码块特征

1. 静态代码块在类文件加载阶段,一定执行。有且只执行一次。
2. 静态代码块中,不可以使用类内的非静态成员变量和非静态成员方法,
   在类文件加载阶段,没有对象参与,静态代码块中不可以使用与对象
   相关联的内容。【没有对象】
3. 静态代码块中,可以使用其他的静态成员变量和静态成员方法【难兄
	难弟,互不嫌弃】
4. 静态代码块中,不可以使用this关键字,因为 this 关键字表示调用
	当前方法的对象本身或者new + 构造方法创建的对象本身,这里没
	有对象存在,不能使用。【没有对象】
6. 静态代码块作用【后期讲】
	用于项目启动阶段初始化操作,可以在程序执行之前,明确资源
	路径,文件路径,存储路径,日志路径,数据库相关信息...
	开机自启

面试题

class Demo {
    static Demo demo1 = new Demo();
    static Demo demo2 = new Demo();
    
    {
        System.out.println("构造代码块");
    }
    
    static {
        System.out.println("静态代码块");
    }
    
    public Demo() {
        System.out.println("构造方法");
    }
    
    public static void main(String[] args) {
        Demo demo = new Demo();
    }
}
/*
简述整个代码的执行流程:
*/

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值