接口
接口定义关键字:interface 接口实现关键字:implements
- 接口就是like a :“像” 我中的一种,世纪城体系之外的,用于功能扩展;
- 就扣规定实现类的行为(方法);
- 接口和接口之间是继承关系;
- 子类实现接口时接口里面的方法必须实现;
- 接口不能有构造器;
- 具体类可以同时实现多个接口,就是多继承现象;
- 一个类在继承的同时也可以实现接口:class A extends B implements C,D (C、D是接口);
接口的好处:让程序的解耦性更强,接口是一个特殊的抽象类(理解为一个抽象类,但接口不是类)
耦合:不同模块不同功能相互之间的关联度;
解耦:降低耦合度;
接口不能实例化:可以有静态常量、抽象方法、静态方法、默认方法;不能有普通方法和构造器;
抽象类和接口的区别:
1)抽象类继承于Object,接口不继承Object;
2)抽象类有构造器,接口中不能有构造器;
3)抽象类中可以有普通成员变量和常量,接口中只能有常量而且只能是public static final修饰,不写默认存在;
4)抽象类中可以有final修饰的方法,接口里面不能有;
5)抽象类只能单继承、多实现,接口是可以多继承其他接口,但是不能实现其他接口后继承其他类;
函数式接口
只有一个抽象方法的接口叫函数式接口(可以分为4个)
Function:功能型接口;predicate:断言型接口;
supplier:供给型接口;consumer:消费型接口
ps:这个不太了解,弄懂了在补;
static
静态的,只能在类内部使用,可以修饰:属性,方法,内部类、代码块,在类加载期间初始化,存在方法区中;
- 静态成员随着类的加载而加载,加载与方法区中,且有优先于对象存在;
- 静态修饰的成员:属于类级别的成员,是全体类实例(所有对象)所共享;
- 使用类名访问静态变量,以及类名直接调用方法,不需要创建对象;
- 静态方法只能访问静态成员(属性和方法),非静态方法既可以访问静态方法也可以访问非静态;
- 静态方法中没有隐含参数this,因此不能访问当前对象资源,也不能定义this和super关键字,因为静态优先于对象存在;
- 静态代码块:随着类的加载而执行(用到类的内容才叫类加载,只有引用是不加载的)且只执行一次,优先于主函数给类初始化;
final
最终的,可以修饰:类、方法、变量(成员变量和局部变量);
- final修饰的类:不能继承;
- final修饰的方法:不能重写;
- final修饰的变量:只能初始化一次(赋值一次,且方法中不能有给final变量赋值的语句,因为该方法可能被调用多次),不能修改;
- 企业级开发中不允许使用final的方法和类;
对象的创建过程及顺序
Person p = new Person("age",23);这句话做了什么事;
- 因为“new” 用到了Person.class,所以会先找到Person.class文件加载到内存中;
- 执行该类中的static代码块(如果有的话),给Person类初始化;
- 在堆内存中开辟空间,分配内存地址,栈内存中开辟空间;
- 在堆内存中建立对象的特有属性,并进行默认初始化;
- 对属性进行显示初始化;
- 对对象进行构造代码块初始化;
- 对对象进行对应的构造器初始化;
- 将内存地址赋给栈内存中的p变量;
内部类
当描述事物时,事物的内部还有事物,该事物就是用内部类来描述。因为内部事物在使用外部事物的内容;
在类内部定义的类称为成员内部类;方法定定义的类为局部内部类,被static修饰的为静态内部类,一个类中可以有多个内部类;
1)内部类主要用于,封装一个类的声明的地步,减少类的暴露;
2)内部类的实例化:实例化是不需要写出对象,非要写的话为:new 外部类名.内部类名(),而不是外部类名.new内部类名);
3)内部类的访问规则:内部类可以直接访问外部类中的成员,包括私有;
4)当内部类定义在外部类的成员位置上,而且非私有,则在外部其他类中可以直接建立内部类对象,
格式:外部类名.内部类名 变量名 = 外部类对象.内部类对象;
注意事项
1)Java文件规则:
一个Java源文件中可以有多个类,但只能有一个共有类,其他类只能是默认类(包中类)而且Java的文件夹一定与共有类类名一致,如果没有共有类,可以和任何一个文件名一致;(一般建议一个文件一个共有类,一般不在一个文件中写多个类)
2)JVM内存结构堆、栈和方法区分别存储的内容:
JVM会在其内存空间开辟一个称为“堆”的存储空间,这部分空间用于存储使用new关键字创建的对象;
栈用于存放程序运行过程当中所有的局部变量,一个运行的Java程序从开始到结束会有多次方法的调用,JVM会为每一个方法的调用在栈中分配一个对应的空间,这个空间称为该方法的栈帧,一个栈帧对应一个正在调用中的方法,栈帧中存储了该方法的参数、局部变量等数据,当某一个方法调用完成后,其对应的栈帧将会被清除。
方法区该空间用于存放类的信息,Java程序运行时,首先会通过类装载器载入类文件的字节码信息,经过解析后将其装入方法区,类的各种信息都放在方法区保护;