static修饰符
-
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
-
一旦使用了static修饰成员方法,那么这个就变成了静态方法,静态不属于对象,而是属于类
-
如果没有static关键字,那么调用方法必须创建对象,然后通过对象使用,如果有了static关键字,那么不需要创建对象,通过类名可以调用
-
静态不能访问非静态(因为在内存中是先加载静态内容,然后加载非静态)
-
静态方法中不能使用this(this代表当前对象,谁调用代表谁,this在静态内容之后加载所以不能使用)
-
static变量
- 一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量
- 两者区别:对于静态变量在内存中只有一个拷贝,jvm只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问,当然也可以通过对象来访问;对于实例变量,每创建一个实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响
-
静态方法
- 静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法,只能访问所属类的静态成员变量和成员方法
-
static代码块
-
格式
static{...}
-
特点:当第一次用到这个类的时候,静态代码块执行唯一的一次,静态的内容优于非静态的,所以静态代码块比构造方法先执行
-
用途:用来一次性对静态成员变量赋值
-
接口
-
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)
-
接口就是多个类的公共规范
-
接口是一种引用数据类型,最重要的内容:抽象方法
-
接口的特点:
- 接口指明了一个类必须要做什么和不能做什么,相当于类的蓝图
- 一个接口就是描述一种能力或规范,比如USB规范,键盘,鼠标,U盘等只要遵守了USB规范,就能连接USB硬件接口进行数据传输
-
不同的JDK版本,或许有些不一样
- 如果是JDK7,接口的内容只能有
- 常量
- 抽象方法
- 如果是JDK8,接口中的内容可以包含
- 默认方法
- 静态方法
- 如果是JDK9,接口中还可以有
- 私有方法
- 如果是JDK7,接口的内容只能有
-
格式:在class换成interface后,编译成的字节码文件仍然是.java->class
public interface 接口名称{ }
-
接口中所有的方法都必须只声明方法标识,而不要去声明具体的方法体,因为具体的方法体的实现是由继承该接口的类来实现的,接口中的属性默认是public static final,抽象方法默认是public abstract
public interface In1{//声明一个接口in1 int a=10;//public static final int a=10; void display();//public abstract void display(); }
//实现类去实现接口 class TestClass implements In1{ public void display(){ System.out.println("实现了接口中的display方法"); } }
//测试类利用Testclass实现接口 public ClassTest{ public static void main(String[] args){ TestClass t =new TestClass(); t.display(); System.out.println(a); } }
实现了接口中的display方法
10
-
接口的使用
- 和抽象类一样,不能直接创建对象
- 需要一个实现类来继承接口
- 接口的实现类是必须覆盖重写所有的抽象方法()
-
注意事项
- 接口中的抽象方法,修饰符必须是两个固定的关键字:public abstract
- 这两个可以省略(public abstract)
- 方法的三要素可以随意定义(方法名,参数列表,返回值)
-
接口中的方法,
- 接口中的默认方法:可以通过接口实现类对象直接调用
- 接口中的默认方法:也可以被接口实现类进行覆盖重写
- 接口中的抽象方法:可以被实现类重写并用对象调用
-
使用接口时注意
- 接口中没有静态代码块
- 接口中没有构造方法
- 一个类可以实现多个接口
- 如果实现多个接口有重名的默认方法,必须重写
- 一个类继承一个直接父类,实现了一个接口,其中的方法产生冲突,会优先使用父类的方法
-
类和接口的继承以及实现
-
类和类之间是单继承的,但是可以多重继承
-
类和接口是可以多实现,一个类可以实现多个接口
-
接口和接口之间是可以多继承的
-
-
举例
-
如果某个设备需要向电脑中读取或者写入东西,这些设备一般都是采用USB的规范与电脑连接的,只要带有USB功能的设备就可以插入电脑中使用,那么我们可以认为USB就是一种功能,这种功能能够做出很多的事情,其实USB就可以看做是一种标准,一种接口,只要实现了USB标准的设备我就认为你已经拥有了USB这种功能
-
声明USB接口
public interface Usb{ void read(); void write(); }
-
写一个U盘类和键盘类,去实现usb接口
class Upan implements Usb{ @override public void read(){ System.out.println("U盘正在通过usb功能读取数据"); } @override public void write(){ System.out.println("U盘正在通过usb功能写入数据"); } }
class Jpan implements Usb{ @override public void read(){ System.out.println("键盘正在通过usb功能读取数据"); } @override public void write(){ System.out.println("键盘正在通过usb功能写入数据"); } }
-
定义一个测试类
public class MainTest{ public static void main(String[] args){ Upan upan=new Upan();//定义一个Upan的对象 upan.read();//通过upan对象调用成员方法以实现接口方法 upan.write();//实现write()方法 Jpan jpan=new Jpan(); jpan.read(); jpam.write(); } }
U盘正在通过usb功能读取数据
U盘正在通过usb功能写入数据
键盘盘正在通过usb功能读取数据
键盘盘正在通过usb功能写入数据
-
重点 我们不能直接去实例化一个接口,因为接口中的方法都是抽象的,是没有方法体的;但是,我们可以使用接口类型的引用指向一个实现了该接口的对象,并且可以调用这个接口中的方法
//通过向上转型的方法 public class MainTest{ public static void main(String[] args){ Usb upan=new Upan();//Usb接口类引用可以指向一个实现了Usb接口的对象 upan.read();//通过upan对象调用成员方法以实现接口方法 upan.write();//实现write()方法 Usb jpan=new Jpan(); jpan.read(); jpam.write(); } }
U盘正在通过usb功能读取数据
U盘正在通过usb功能写入数据
键盘盘正在通过usb功能读取数据
键盘盘正在通过usb功能写入数据
-