static关键字和接口
1. static关键字【重难点】
1.1 static关键字修饰成员变量
1.1.1 生活中和开发中需要解决的问题
饮水机:
不可能每一个人给你配一个!!!
存放在一个公共区域!!!
1. 提供给所有人使用,【共享性】
2. 你来学习之前,饮水机在这里,你离开以后,他还在这里。】
【所属权和你无关】
3. 饮水机坏了,所有人都会受到影响【相互干扰】
1.1.2 static修饰静态成员变量的特征
特征:
1. 使用类对象操作静态成员变量IDE工具有警告提示,使用类名调用没有任何的警告。静态成员变量和对象无关 【没有对象】
2. 静态成员变量在没有类对象的情况下可以通过类名调用使用,类对象销毁之后依然可以使用。
3. 不管通过哪一种方式修改静态成员变量的对应是数据,所有使用到静态成员变量的位置都会受到影响 【共享性】
没有对象:
1. 静态成员变量和类对象所处的内存空间不再同一个区域内,静态成员变量是存储在内存的【数据区】,而类对象是在内存的【堆区】。之所以类对象可以使用在内存数据区的静态成员变量,是因为持有的对应内存空间的首地址。 【没有对象】
2. 静态成员变量是随着类文件(.class字节码文件)的加载而直接定义在内存的【数据区】,早于类对象的创建。并且静态成员变量是在程序退出时,才会从内存的数据区销毁,晚于类对象的销毁。两者的生存周期是完全不同的,从生存周期角度来看,是没有任何关系的,所以【没有对象】
3. IDE工具提示类对象操作静态成员变量是有警告的!!!告知开发者,不建议使用非静态方式来操作静态成员变量,推荐使用类名操作。这也是告诉你,【没有对象】
共享性:
1. 通过任何一种方式修改对应的静态成员变量,所有使用到的位置都会受到响应。
【共享资源】
使用建议:
1. 静态成员变量只通过类名调用
2. 静态成员变量保存一些真实存在的共享数据
1.2 static关键字修饰成员方法
1.2.1 静态成员方法代码演示
package com.qfedu.b_staticmethod;
class SingleDog {
int id;
String name;
static String country = "上海";
public void test() {
id = 10;
name = "飞飞";
System.out.println(country);
System.out.println("非静态成员方法");
}
public static void testStatic() {
System.out.println(country);
System.out.println("静态成员方法");
}
}
public class Demo1 {
public static void main(String[] args) {
SingleDog.testStatic();
new SingleDog().test();
SingleDog.testStatic();
}
}
1.2.2 静态成员方法特征解释和作用
加载时间:
静态成员方法时随着类文件的加载而直接定义在内存的【方法区】,而且已经可以运行。是早于类对象出现的,所以和对象无关【没有对象】
静态成员方法不能使用类内的非静态成员,可以认为脱离类对象的,静态成员方法还可以运行。
静态成员方法运行不需要类对象
1. 节约内存
2. 提高效率
3. 可以做成工具
工具类的使用
Arrays数组工具
1.2.3 Arrays工具类使用和自定义工具类样式
Arrays工具类是数组工具类
toString(); 鸡肋
sort(); 排序
binarySearch(); 二分法查询,要求查询数据的数组必须是排序之后的数组
所有的方法都是通过类名调用,也就是static修饰的静态成员方法
package com.qfedu.b_staticmethod;
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};
System.out.println(Arrays.toString(arr));
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
int i = Arrays.binarySearch(arr, 0);
System.out.println(i);
}
}
1.2.4 静态面试题
类方法是否可以使用成员变量???
类方法是类内的静态成员方法,
静态成员方法可以使用静态成员变量
但是不可以直接使用非静态成员变量
类变量:静态成员变量
类方法:静态成员方法
1.3 static关键字修饰静态代码块
1.3.1 代码块
构造代码块
初始化当前类的所有类对象,只要调用当前类的构造方法,一定会执行类内的构造代码块
类内
{
}
静态代码块
只要当前Java代码对应的.class字节码文件加载到内存中,就一定执行,并且只执行一次
类内
static {
}
局部代码块
用于在方法内提供变量的内存收回效率,局部变量的使用。
目前使用很少!!!
方法内
{
}
1.3.2 代码块面试题
class Demo {
static Demo demo1 = new Demo();
static Demo demo2 = new Demo();
static {
System.out.println("静态代码块");
}
{
System.out.println("构造代码块");
public Demo() {
System.out.println("构造方法");
}
public static void main(String[] args) {
Demo demo = new Demo();
}
}
2. 接口
2.1 生活中的接口
USB USB-C雷电协议
Type-C 3.5mm 国标电源接口 VGA HDMI ARJ45网线接口 SATA M.2
PCI-E
60GB/s
USB-A
鼠标 键盘 声卡 U盘 游戏手柄 耳机 散热器
USB接口只是确定了规范
由USB设备来决定当前这个设备是做什么功能
2.2 Java中定义接口的方式
关键字:
interface UI User Interface
定义接口的格式
interface 接口 {
// 成员变量
// 成员方法
}
注意事项:
1. 接口名必须符合命名规范,见名知意,动宾结构,大驼峰命名法
2.3 Java中使用接口的方式
2.3.1 类【遵从】接口
关键字:
implements
一个类【遵从】接口的格式
class 类名 implements 接口名 {
需要实现对应abstract修饰的方法
}
注意事项:
1. 一个非abstract修饰的类,遵从接口需要完成接口中所有缺省属性为abstract的方法
2. 一个类可以遵从多个接口,完成多个条件的实现
电脑有多个接口
2.3.2 接口的继承
Java中的接口可以多继承
interface USB1_0 {
void test1();
}
interface USB2_0 {
void test2();
}
interface USB3_0 {
void test3();
}
interface USB3_1 extends USB1_0, USB2_0, USB3_0 {
void test3_1();
}
【补充知识点 JDK1.8新特征】
package com.qfedu.d_interface;
interface C {
void test();
default void testDefault() {
System.out.println("使用default修饰的方法可以有方法体");
}
}
class TypeC implements C {
@Override
public void test() {
}
}
public class Demo3 {
}