包
导包
Final
不能被改变的,修饰方法 类 变量
方法不能被重写
类不能被继承
变量,赋值一次,变成常量,不能再被赋值
final修饰引用数据类型,地址值不能变,里面的内容可以变
字符串是不可变的
源码中使用了private 和 final来修饰
Final修饰value使其中所存的string的地址值不能发生改变
再用private使得外界无法访问这个地址值,也就无法修改地址值
所以string里面的内容就是不能改变的
权限修饰符
代码块
局部代码块
构造代码块
这两种代码块渐渐被淘汰,不够灵活
怎么改?
- 直接调用有参构造
- 直接把重复的代码写成一个方法,直接调用
静态代码块
数据初始化的时候用
创建第一个student类时就会执行一次
创建第二个student类时机不会执行
抽象类 abstract
注意抽象方法定义没有大括号
抽象类不能创建对象
既然不能创建对象,那写构造方法有什么用?
A:当创建子类对象时,给属性进行赋值的
统一代码格式
接口 interface
定义规则
Implement
注意接口里swim是抽象方法
一个类implement一个接口后,就成了这个接口的子类,叫做实现类
接口中成员的特点
成员变量只能是常量
没有构造方法
只有抽象方法
多个接口有同名的抽象方法,则实现类中只需重写一次抽象方法,相当于重写了所有接口里的同名抽象方法。
接口继承之后,实现类里要重写所有父接口和子接口的抽象方法
JDK8后接口新增的方法
默认方法 带方法体的
加default,如果省略了default,就会被当成一个抽象方法
出现多个相同名字的默认方法,就必须要重写
静态方法 不能被重写
通过接口名.静态方法调用
JDK9之后,接口中加入私有方法
有static,只能用在静态方法中
没有static,用在默认default默认方法中
抽象方法都没有方法体,所以这些私有方法抽象方法都用不了
接口的应用
适配器设计模式 class,也是一个类
在实现类和接口之间的中间类,让实现类继承extends中间类
里面重写所有接口的抽象方法,不过是空实现
适配器写成抽象类abstract,防止被外界创建对象
内部类
为什么外部类访问内部类成员必须要创建对象?
A:因为在测试类中调用外部类的成员方法时,成员方法的形参中会有一个隐藏的this要表示调用者,如果直接使用内部类的方法,这个this调用者就没办法调用,必须先创建一个内部类的对象,通过这个内部类对象才能调用内部类的方法。
内部类的分类
成员内部类
Private:只能在本类中使用,在外界不能用
默认:只能在本包当中用,其他包用不了
Protected:只能在本包中其他类中使用或者是其他包的子类也能用
Public:所有地方都能创建对象
Static:叫做静态内部类
Private:方式一适用,方式二不适用
其他基本都用方式二
成员内部类如何获取外部类的成员变量
Outer.this.a?
内存方面解释
外部类和内部类的字节码文件是分别独立加载在方法区内存中的
内部类对象中会有一个隐藏的this记录外部类对象的地址值
Outer.this 就是获取外部类对象的地址值
总结
静态内部类 成员内部类的特殊情况 static修饰
Show1是静态内部类的非静态方法,show2是静态内部类的静态方法
局部内部类
匿名内部类 最重要!
隐藏了名字 java会帮我们起名字 叫做 (外部类类名$序号)
其实new出来的是一个对象,真正的匿名内部类是后面大括号里面的内容。
大括号里和前面的类名或是接口名是继承或实现的关系。
然后这个匿名内部类中就要重写前面的类名或是接口的所有的抽象方法
所以,把这个匿名内部类当做是一个不用起名字的子类/实现类 去用
同时,也可以起名字,即把它赋值给一个变量
还可以直接调用自己的方法