15、static 关键字

15_static 关键字

1、补充 多类合作

放在一个文件夹中

1.1 Keyboard.java
public class Keyboard {
	/**
	 * 键盘品牌
	 */
	private String name;
	
	/**
	 * 键盘个数
	 */
	private int keyCount;
	
	public Keyboard() {}
	
	public Keyboard(String name, int keyCount) {
		this.name = name;
		this.keyCount = keyCount;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getKeyCount() {
		return keyCount;
	}
	public void setKeyCount(int keyCount) {
		this.keyCount = keyCount;
	}

	/* 重写 toString 方法 返回字符串类型数据 */
	@Override
	public String toString() {
		return "键盘 [品牌:" + name + ", 按键个数:" + keyCount + "]";
	}
	
}

1.2 Screen.java
public class Screen {
	/**
	 * 屏幕品牌
	 */
	private String name; 
	
	/**
	 * 屏幕尺寸
	 */
	private int size;
	
	public Screen() {}

	public Screen(String name, int size) {
		this.name = name;
		this.size = size;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getSize() {
		return size;
	}

	public void setSize(int size) {
		this.size = size;
	}

	/* 重写 toString 方法 返回字符串类型数据 */
	@Override
	public String toString() {
		return "屏幕 [品牌:" + name + ", 尺寸:" + size + "]";
	}

}

1.3 Computer.java
public class Computer {
	/**
	 * 电脑类成员变量键盘类型
	 */
	private Keyboard keyboard;
	
	/**
	 * 电脑类成员变量屏幕类型
	 */
	private Screen screen;
	
	public Computer() {}

	/**
	 * Computer 构造方法 所需参数是 Keyboard 类对象和 Screen 类对象
	 * 
	 * @param keyboard Keyboard 键盘类型
	 * @param screen Screen 屏幕类型
	 */
	public Computer(Keyboard keyboard, Screen screen) {
		this.keyboard = keyboard;
		this.screen = screen;
	}

	public Keyboard getKeyboard() {
		return keyboard;
	}

	public void setKeyboard(Keyboard keyboard) {
		this.keyboard = keyboard;
	}

	public Screen getScreen() {
		return screen;
	}

	public void setScreen(Screen screen) {
		this.screen = screen;
	}

	/* 
	 * 电脑配置展示方法
	 *  
	 *  电脑安装了类似于管家类软件 可以查看电脑相关的硬件配置信息
	 */
	/**
	 * 展示电脑的硬件信息 目前可以展示的有
	 * 当前电脑的键盘信息 和当前电脑的屏幕信息
	 */
	public void show() {
		System.out.println("键盘品牌:" + keyboard.getName() + " 按键个数:" + keyboard.getKeyCount());
		
		System.out.println("屏幕品牌:" + screen.getName() + " 屏幕尺寸:" + screen.getSize());
	}
	
	/* 重写 toString 方法 返回字符串类型数据 */
	@Override
	public String toString() {
		return "电脑 [键盘:" + keyboard + ", 屏幕:" + screen + "]";
	}
}

1.4 Demo1.java
public class Demo1 {
	public static void main(String[] args) {
		/* 
		 * 实例化 Keyboard 键盘类 和 Screen 屏幕类对象
		 */
		Keyboard keyboard = new Keyboard("ikbc", 87);
		Screen screen = new Screen("Lenovo", 14);
		
		/* 
		 * 实例化 Computer 电脑类对象
		 */
		Computer computer = new Computer(keyboard, screen);
		
		/* 
		 * 展示当前电脑配置
		 */
		//通过 show 方法展示
		computer.show();
		
		System.out.println("--------------------");
		
		//重写 toString 方法后 直接展示对象
		System.out.println(computer);
	}
}

运行结果如下
多类合作

2、static 关键字
2.1 static 修饰静态成员变量
2.1.1 static 关键字使用及其特征
特征:
	1、static 关键字修饰的静态成员变量,不推荐使用类对象调用,推荐使用类名直接调用。类对象调用静态成员变量时 Eclipse 工具会提示警告。
	2、静态成员变量一处修改,处处修改。
	3、静态成员变量生存周期早于类对象出现,晚于类对象销毁。
2.1.2 类加载问题
Java 中的类加载
	1、JVM 分析当前程序所需的字节码文件
	2、根据当前程序的运行情况 分析每一个类应该执行的时间
	3、对应类在执行之前 会将所有 static 修饰的内容进行处理
		static 修饰的静态成员变量加载到内存的【数据区】 具备数据存储和数据提供能力
		static 修饰的静态成员方法加载到内存的【方法区】具备方法执行能力 
		static 修饰的静态代码块加载到内存的【方法区】 直接执行
	4、static 修饰的内容处理完毕后 程序才开始运行
2.1.3 静态成员变量内存存储问题
内存:
	栈区
		局部变量
	堆区
		实例化对象 数组
	数据区
		静态成员变量 字符串常量
	方法区 
		所有可以执行的代码都在方法区 字节码文件都是存在内存的【方法区】
		静态成员方法、成员方法、类型声明

静态成员变量在内存的【数据区】
	在程序加载过程中,静态成员变量的内存空间、数据类型、存储数据都已经准备就绪,具备了数据存储和数据提供能力

【注】static 修饰的静态成员变量只在类文件加载的时候执行一次
2.1.4 static 修饰静态成员变量总结
1、存放空间
	静态成员变量存储与内存的【数据区】 属于公共区域
2、归属权问题
	静态成员变量属于当前所在类 与对象无关
3、修改问题
	静态成员变量一处修改 从修改位置之后 处处修改
4、使用权
	通过类名.对象名调用 无警告
5、共享资源
	静态成员变量可以被所在类中的内容使用 是一个全局变量
6、生存周期
	静态成员变量随着类文件加载生成 程序退出之前 所有的对象被 JVM 销毁后 才会清理 static 修饰内容占用的空间
	static 修饰的静态成员变量和类对象生存周期不同 与对象无关
2.2 static 修饰的静态成员方法
2.2.1 格式
权限修饰符 static 返回值类型 方法名(形式参数列表) {
	方法体;
}
2.2.2 代码演示

SinglePerson.java

public class SinglePerson {

	//成员变量
	public int num = 10;
	
	//静态成员变量
	public static String msg = "static 静态成员变量";
	
	//成员方法
	public void test() {
		System.out.println("普通成员方法");
	}
	
	//静态成员方法
	public static void testStatic() {
		System.out.println("static 静态成员方法");
		
		/* 
		 * num 是成员变量 调用过程依赖对象 
		 * 但是静态成员方法和对象无关 不能使用类内的非静态成员变量
		 */
		//System.out.println(num);
		
		/* msg 是静态成员变量 和当前方法性质一直 */
		System.out.println(msg);

		/* 是成员方法 需要实例化对象后通过对象调用
		 * 但是静态成员方法和类对象无关
		 * 不能够直接使用类内的非静态成员方法 
		 */
		//test();
		
		/* 可以直接调用 和当前方法性质一样 */
		testStaticTwo();
	}

	//静态成员方法
	public static void testStaticTwo() {
		System.out.println("static 静态成员方法2");
	}
}

Demo1.java

package com.qfedu.b_staticMethod;

public class Demo1 {

	public static void main(String[] args) {
		/* 
		 * 静态成员方法
		 */
		SinglePerson.testStatic();
		
		SinglePerson singlePerson = new SinglePerson();
		
		/* 
		 * 通过实例化对象调用静态成员方法有警告
		 *  
		 * Eclipse 提示
		 *  	静态成员变量不推荐使用类对象调用
		 */
		singlePerson.testStatic();
	}

}

运行结果如下
static 修饰成员变量和成员方法

2.2.3 static 修饰静态成员方法总结
1、使用类名直接调用 没有警告
2、静态成员方法不可以直接使用类内的 非静态成员变量 和 非静态成员方法 后两者需要类对象调用 静态成员方法中没有对象(static 修饰的成员方法 对应的大括号范围内是一个静态区域 静态区域中不可以直接使用非静态内容)
3、静态成员方法在类文件加载时 被加载到内存的【方法区】 具备执行能力
4、静态成员方法执行只需要类名直接调用 没有类对象的约束 节约了时间和空间
5、静态成员方法常用于工具类
2.2.4 Arrays 工具类

代码演示

package com.qfedu.c_staticTool;

import java.util.Arrays;

public class Demo1 {
	public static void main(String[] args) {
		int[] arr1 = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
		
		/* 用户提供一个 int 类型数据
		 * 将数组中数据使用 , + 空格形式隔开,前后使用 [] 包含
		 * 返回值一个 String 字符串类型描述当前数组的数据内容 
		 */
		//把数组转换成字符串打印
		String str = Arrays.toString(arr1);
		System.out.println(str);
		
		/* Arrays 数组工具类排序方法
		 * 底层逻辑是双轴快排
		 * 默认排序结果为升序 
		 */
		//使用 Arrays工具类中的 sort 方法 对数组快速排序 默认升序排列
		Arrays.sort(arr1);
		
		System.out.println(Arrays.toString(arr1));
		
		int[] arr2 = {1, 3, 3, 3, 4, 5, 5, 5, 5, 2, 6, 8, 10};
		
		/* 
		 * 二分法查询,找出指定元素在数组中对应的下标位置
		 * 要求参数数组必须通过 sort 排序
		 * 找到的下标位置不保证是当前数组中对应数据的第几个
		 * 如果没有指定数据 返回负数
		 */
		//使用 Arrays 工具类中的 binarySearch 方法查询 
		int index = Arrays.binarySearch(arr2, 5);
		
		System.out.println(index);
		
	}
}


运行结果如下
Arrays工具类中的一些方法

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值