浅谈Java中的static关键字和接口

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;

/*
特征:
    1. 静态成员方法推荐使用类名调用,使用类对象调用会有警告。
    2. 类对象创建之前,静态成员方法可以通过类名调用,类对象销毁之后
    还可以使用。【没有对象】
    3. 静态成员方法不能使用类内的非静态成员变量
    4. 静态成员方法不能使用类内的非静态成员方法
    5. 静态成员方法不能使用this关键字
        静态成员方法可以通过类名调用使用,但是this关键字不能表示类名
    6. 静态成员方法可以使用类内的其他静态成员变量和静态成员方法
        【难兄难弟】
 */
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() {
        // id = 10;
        // test();
        // this.id = 10;
        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};

        /*
        Arrays.toString();
            是将数组中的每一个元素组合完成一个String类型的字符串返回
            所有的数据使用[]包含,每一个元素之间使用, + ' '隔开
         */
        System.out.println(Arrays.toString(arr));

        /*
        由三个作者优化的符合Java特征的,二进制XXXX优化的
        快速排序。突出一个字。快!!!
         */
        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();
    }
}
/*
执行流程是什么???
	第一个执行:
		static Demo demo1 = new Demo();
		结果
			构造代码块
			构造方法
	第二个执行:
		static Demo demo2 = new Demo();
		结果:
			构造代码块
			构造方法
	第三个执行:
		 static {}
		 结果:
		 	静态代码块
	第四个执行:
		static void main()
		结果:
			构造代码块
			构造方法
*/
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修饰方法,默认方法
    default void testDefault() {
        System.out.println("使用default修饰的方法可以有方法体");
    }
}

class TypeC implements C {

    @Override
    public void test() {

    }
}

public class Demo3 {
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值