static interface 和生活案例
1. static
1.1 static 修饰静态代码快
1.1.1 代码块问题
什么是代码块
{} 只有大括号,里面的内容就是代码块内容
1. 构造代码块
定义在类内
2. 局部代码块
定义在方法内
//构造代码块案例
public class Person {
private int id;
private String name;
private int age;
/*
* 这就是构造代码块
* 构造代码块在成员变量之后,构造方法之前
*
* 通过代码运行可以的看到
* 1. 构造代码块在调用执行构造方法时一定执行
* 2. 构造代码块在调用执行构造方法时,首先执行
*
*
* 构造代码块内容会在 Java 编译器编译,直接给所有当前类的构造方法提供
* 并且在所有构造方法的【第一行 first statement】
*
* 可以将构造方法相同功能模块,使用构造代码块封装/归纳/总结
* 并且可以提供所有的构造方法使用
* */
{
System.out.println("构造代码块执行");
}
public Person(int id) {
this.id = id;
System.out.println("构造方法");
}
public Person(int id, String name) {
this.id = id;
this.name = name;
System.out.println("构造方法");
}
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
System.out.println("构造方法");
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Demo2 {
public static void main(String[] args) {
int num = 10;
/*
*局部代码块,可以优化变量占用的时间,
*提升代码内存效率,降低内存占用
* */
{
int num2 = 20;
}
System.out.println(num);
//System.out.println(num2);
}
}
1.1.2 static 修饰静态代码块特征
//静态代码块要求在 class 大括号以内
static {
}
package com.qf.edu;
class SingleDog {
public int num = 10;
public static String test = "ssss";
/*
* 静态代码块
* 在类文件加载阶段执行,有且只执行一次,因为 Java 中所有类型都是在
* 执行之前加载一次,不会重新加载
*
* */
static {
/*
* static 修饰的静态代码块可以认为是一个静态区域,无法直接使用类内的非静态成员变量,因为【没有对象】
* */
//System.out.println(num);
/*
*
* static 修饰的静态代码块,可以直接使用类内的静态成员变量,因为【没有对象,难兄难弟,互不嫌弃】
* */
System.out.println(test);
/*
* static 修饰的静态代码块,可以直接使用类内的静态成员变量,因为【没有对象,难兄难弟,互不嫌弃】
* */
testStaticMethod();
/*
* static 修饰的静态代码块可以认为是一个静态区域,无法直接使用类内的非静态成员变量,因为【没有对象】
* */
//test();
System.out.println("静态代码块");
}
public void test() {
System.out.println("非静态成员方法");
}
public static void testStaticMethod() {
System.out.println("静态成员方法");
}
}
public class Demo3 {
public static void main(String[] args) {
System.out.println("测试");
SingleDog singleDog = new SingleDog();
SingleDog singleDog1 = new SingleDog();
SingleDog singleDog2 = new SingleDog();
SingleDog singleDog3 = new SingleDog();
}
}
1.1.3 静态代码块特征
1. static 修饰静态代码块,在程序加载阶段一定执行,有且只执行一次
2. static 修饰静态代码块,不能直接使用类内的非静态成员变量/方法,因为【没有对象】
3. static 修饰静态代码块,可以直接使用类内的静态成员变量/方法,因为【没有对象】
4. static 修饰静态代码块,用于项目启动过程中的初始化操作
可以利用 static 代码加载尖端执行的特征,将一些项目执行所需的配置操作前置
用于 读取配置文件,加载相关驱动,加载第三方资源。。。。。。
1.2 static 面试题
class Demo {
public static Demo d1 = new Demo();
public static Demo d2 = new Demo();
static {
System.out.println("静态代码块");
}
{
System.out.println("构造代码块");
}
public Demo() {
System.out.println("构造方法");
}
public static void main(String[] args) {
Demo d = new Demo();
}
}
/*
以上代码执行流程:
*/
-
interface 接口
2.1 生活中的接口
生活中的接口 USB 网线接口RJ45 Type-C Ligthing USB-C HDMI VGA PCI-E minidp SATA 3.5MM mircoUSB 电源(国标/英标/美标) 接口有什么用? USB-B 连接鼠标/键盘/声卡/麦克风/耳机/充电/传输数据/U盘/移动硬盘 USB 1.指定的尺寸规范,并且不可修改 宽度、高度、长度、引脚规范、电压、电流 2. 规范了连接标准版,但是最终设备的功能由设备本身决定。 例如鼠标连接 USB控制光标 键盘谅解 USB 输入设备 声卡连接 USB 声音控制 USB 是一个接口,是用来连接USB 设备,从而增强拓展当前 PC/电脑/笔记本!
2.2 Java 中定义接口的格式
当前阶段要求掌握接口的基本语法,格式规范,和使用要求
后期学习具体案例,特殊用法,架构设计
关键字: interface 格式: interface 接口名 { 成员变量 成员方法 } 1. 接口是一个特殊的类,也是一个数据类型 2. 接口名要求符合命名规则,见明知意,大驼峰命名法 3. 接口类型变量也是一个引用数据类型变量
interface A { //成员变量 /* * The blank final field num may not have been initialized * final 修饰的 num 可能尚未初始化 * * final 从何而来 斜体因为何事?? * * 接口中成员变量【缺省属性、默认属性】 public static final * public 表述数据公开,任何位置都可以使用 * * static 静态修饰,独一份 == > USB 相关数据独一份 ,大家都需要遵守 * final 最终修饰、不可以修改修饰 ,常量 == > USB 接口数据不可以修改 * 【带有名称的常量】 ==> 下划线命名法处理,所有字母全部大写,不同英文单词之间使用——下划线分割 * */ int NUM = 10; /* * Abstract methods do not specify a body * abstract 修饰的方法没有方法体 * 接口中的成员方法【缺省、默认属性】public abstract * * public 表示方法公开,标志公开 ==> USB 接口需要公开连接规则,连接方式、连接要求 * abstract 修饰没有方法体 ==> USB 接口仅定制方法要求,具体实现看对应设备,USB ==> 鼠标,键盘.... * USB 接口具体做什么,不是USB接口本身决定,是由USB 接口连接的设备决定 * */ void test(); }
2.3 遵从接口
类遵从接口 关键字: implements 格式 class 类名 implements 接口名 { }
/* * * 一个非 abstract 修饰类【遵从】接口,要求实现接口中所有缺省属性为 * public abstract 修饰方法 * * */ class TypeA implements A { @Override public void test() { // TODO Auto-generated method stub System.out.println("TypeA 类遵从接口 A 实现test 方法"); } }
2.4 接口的特殊用法
2.4.1 类可以遵从多个接口
interface B { void testB(); void test(); } interface C { void testC(); void test(); } /* * TypeB 类可以同时遵从两个接口,分别是 interface B 和 interface C * 不同的接口直接使用, + 空格隔开 * * 语法要求: * 1.遵从多个接口的类,要求分别实现各个接口中的方法要求 * 2.如果出现多个接口中存在完全相同的方法声明,实现类中有且只实现一个方法即可。 * * */ class TypeB implements B, C { @Override public void testC() { // TODO Auto-generated method stub System.out.println("Type 类遵从接口C testC方法"); } @Override public void testB() { // TODO Auto-generated method stub System.out.println("Type 类遵从接口B testB方法"); } @Override public void test() { // TODO Auto-generated method stub System.out.println("TypeB 遵从接口B 和接口 C 实现的两个接口中同规则方法"); } } public class Demo2 { public static void main(String[] args) { TypeB typeB = new TypeB(); typeB.testB(); typeB.testC(); typeB.test(); } }
2.4.2 类可以继承父类且遵从接口
class SuperClass { public void testA() { System.out.println("父类成员方法"); } } interface D { void testD(); } class TypeC extends SuperClass implements D { /* * * 紫色空心箭头 ---> 实现接口中的方法 * * */ @Override public void testD() { // TODO Auto-generated method stub System.out.println("TypeC 遵从接口D 实现的testD 方法"); } /* * * 绿色是实心箭头 ---> 重写父类继承到子类的方法 * */ @Override public void testA() { System.out.println("子类重写父类方法"); } } public class Demo3 { public static void main(String[] args) { TypeC typeC = new TypeC(); typeC.testA(); typeC.testD(); } }
2.4.3 接口可以继承其它接口,并且可以多继承
interface USB1_0 { void usb1_0Counnect(); } interface USB2_0 { void usb2_0Counnect(); } /* * * 接口可以继承其它接口,同时允许多继承 * */ interface USB3_0 extends USB1_0, USB2_0{ void usb3_0Counect(); } /* * * 类遵从接口,要求实现接口中所有的缺省属性/默认属性 public abstract 修饰方法 * 包括当前接口父接口要求的方法 * * */ class TypeD implements USB3_0 { @Override public void usb1_0Counnect() { // TODO Auto-generated method stub System.out.println("USB 1.0 协议规定方法"); } @Override public void usb2_0Counnect() { // TODO Auto-generated method stub System.out.println("USB 2.0 协议规定方法"); } @Override public void usb3_0Counect() { // TODO Auto-generated method stub System.out.println("USB 3.0 协议规定方法"); } } public class Demo4 { public static void main(String[] args) { TypeD typeD = new TypeD(); typeD.usb1_0Counnect(); typeD.usb2_0Counnect(); typeD.usb3_0Counect(); } }
2.4.4 JDK 1.8以上版本特征
允许在接口中使用 default 关键字修饰方法,修饰的方法为默认方法允许有方法体
interface E { void test(); default void testDefaultMethod() { System.out.println("JDK 1.8以上版本允许默认方法 default 修饰"); } } class TypeE implements E { @Override public void test() { // TODO Auto-generated method stub System.out.println("TypeD 类有且只需要完成即可 E 中的缺省属性 public abstract 对应方法"); } /* * 重写接口中的 default 关键字修饰的方法 * */ @Override public void testDefaultMethod() { System.out.println("重写接口中 default 关键字修饰的默认成员方法"); } } public class Demo5 { public static void main(String[] args) { TypeE typeE = new TypeE(); typeE.test(); typeE.testDefaultMethod(); } }
2.4.5 接口语法细节
接口中是否可以用 static 修饰的静态成员方法? 可以 static 修饰的方法直接通过该接口名调用 一个方法是否可以同时使用 abstract 和 static 关键字修饰? abstract 关键字修饰的方法没方法体 static 修的方法是在类加载阶段已经准备就绪,已具备执行能力,必须明确所有和执行相关的内容,权限修饰符,返回值类型,方法名,形式参数列表和方法体 【static 修饰方法必须有方法体】 【abstract 修饰的方法必须没有方法体】 两者无法合作
3. 生活案例
3.1 动物园
动物 ==> 动物类 猴子 ==> 猴子类 ==> 动物类子类 老虎 ==> 老虎类 ==> 动物类子类 狮子 ==> 狮子类 ==> 动物类子类 饲养员需要去喂动物吃饭 ===> 吃饭 该方法所属参数类型: 动物类型 饲养员今天去喂动物,不管是老虎,狮子还是猴子都算是动物
3.2 USB 接口