继承与多态
- 在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式:
- 直接通过子类对象访问成员变量:等号左边是谁,就优先用谁,没有则向上找
- 间接通过成员方法访问成员变量:该方法属于谁,就优先用谁,没有则向上找
- 从Java 8 开始,接口里允许定义默认方法
格式
public default 返回值类型 方法名称(参数列表){ 方法体 }
备注:接口当中的默认方法,可以解决接口升级的问题
从Java 9 开始,接口中允许定义私有方法
- 多态的代码中,成员变量和成员方法的访问规则
- 成员变量:编译看左边,运行还看左边
- 成员方法:编译看左边,运行看右边
多态
体现多态性:父类引用指向子类对象
好处:无论右边new的时候换成哪个子类对象,等号左边调用方法都不会变化
内部类
成员内部类
内用外,随意访问;外用内,需要内部类对象
使用方式:
- 间接方式:在外部类的方式当中,使用内部类;然后调用外部类的方法
直接方式,公式:
【外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();】
局部内部类(包含匿名内部类)
要访问所在方法的局部变量,那么这个局部变量必须是【有效final】的。
从Java 8 开始,只要局部变量事实不变,那么final关键字可以省略
- 权限修饰符规则:
- 外部类:public、(default)
- 成员内部类:public、protected、(default)、private
- 局部内部类:什么都不写
常用API
String
String和int相互转换
int--->String
num + ""
低效String.valueOf(num)
Integer.toString(num)
String--->int
Integer.parseInt(str)
Integer.valueOf(str).intValue()
- 双引号直接写的字符串在常量池当中,new出来的不在池中
- 常量.equals字符串时建议把常量放前面,避免因字符串为空导致的空指针异常
- 分割字符串的
split()
方法的参数是一个正则表达式,以"."分割是要写成"\\.
" 输出一维数组:
Arrays.toString(arr)
输出二维数组:
Arrays.deepToString(str)
String 为什么是 final 的
实现字符串池:不可变才能实现字符串池,如果字符串是可变的,那么一个引用操作改变了对象的值,对其他引用会有影响
安全性:这些核心类的内部方法的实现并不是Java本身编写的,好多都是调用的操作系统本地的API,如果String可以被继承重写,就有可能被恶意的重写其中的方法,造成安全隐患;同时因为不可变,使得String是多线程安全的
效率:如果已经存在这个字符串常量便不会再创建,直接拿来用