多态
同类的对象,执行同一个行为,会表现出不同的行为特征
//多态的常见形式
父类类型 对象名=new 子类构造器
接口 对象名称=new 实现类构造器
成员访问特点
方法调用:编译看左边,运行看右边
变量调用:编译看左边,运行看左边(多态侧重行为多态)
多态的前提
有继承/实现关系;有父类引用指向子类对象;有方法重写
多态的优势
在多态形式下,右边对象可以实现解耦合,便于扩展和维护
定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的一切子类对象,体现出多态的扩展性与便利
多态下会产生一个问题:
多态下不能使用子类的独有功能
多态下引用数据类型的类型转换
自动类型转换(从子到父):子类对象赋值给父类类型的变量指向
强制类型转换(从父到子)
此时必须进行强制类型转换:子类 对象变量=(子类)父类类型的变量
作用:可以解决多态下的劣势,可以实现调用子类独有的功能
注意:如果转型后的类型和对象真实类型不是同一类型,那么在转换的时候会出现ClassCastException
java建议强制转换前使用instanceof判断当前对象的真实类型,再进行强制转换
变量名 instanceof 真实类型
判断关键字左边的变量指向的对象的真实类型,是否是右边的类型或其子类型,是则返回true
内部类
定义在一个类里面的类
public class People{
//内部类
public class Heart{
}
}
内部类的使用场景、作用
当一个事物的内部,还有一部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构可以选择使用内部类来设计
内部类通常可以方便访问外部类的成员,包括私有成员
内部类提供了更好的封装性,内部类本身就可以用private、protected等修饰,封装性可以做更多控制
分为静态内部类、成员内部类、局部内部类、匿名内部类(重点)
静态内部类
有static修饰,属于外部类本身
它的特点和使用与普通类是完全一样的,类有的成分它都有,只是位置在别人里面而已
public class Outer{
//静态成员内部类
public static class Inner{
}
}
//静态内部类创建对象的格式
格式:外部类名.内部类名 对象名 = new 外部类名.内部类构造器();
Outer.Inner in=new Outer.Inner();
成员内部类
无static修饰,属于外部类对象
JDK16之前,成员内部类中不能定义静态成员,JDK16开始可以定义静态成员了
public class Outer{
//静态成员内部类
public class Inner{
}
}
//格式
外部类名.内部类名 对象名=new 外部类构造器.new 内部类构造器();
Outer.Inner in=new Outer().new Inner();
注意:在成员内部类中访问所在外部类对象
格式:外部类名.this
局部内部类
放在方法、代码块、构造器等执行体中
文件名为:外部类$N内部类.class
匿名内部类
本质上是一个没有名字的局部内部类,定义在方法、代码块中等。
作用:方便创建子类对象,最终目的为了简化代码编写
//格式
new 类/抽象类名/接口名(){
//重写方法;
};
Employee a=new Employee(){
public void work(){
}
};
a.work();
总结:
匿名内部类是一个没有名字的内部类
匿名内部类写出来就会产生一个匿名内部类的对象
匿名内部类的对象类型相当于是当前new的那个类型的子类类型
使用形式(了解即可)
匿名内部类可以作为方法的实际参数进行传输
使用总结
开发中不受我们主动去定义匿名内部类的,而是别人需要我们可以写的时候才会使用。匿名内部类的代码可以实现代码进一步的简化
Object类
作用一个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java中的祖宗类
Object类的方法是一切子类都可以直接使用的
方法名 | 说明 |
---|---|
public String toString() | 默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址 |
public Boolean equals(Object o) | 默认是比较当前对象与另一个对象的地址是否相同,相同返回true,不同返回false |
Object中toString方法的作用?
默认是打印当前对象的地址
让子类重写,以便返回子类对象的内容
直接比较两个对象的地址是否相同完全可以用 == 替代equals
equals的意义
父类equals方法存在的意思是为了被子类重写,以便子类自己来定制比较规则
Objects概述
利用Objects更安全
Objects常用方法
方法名 | 说明 |
---|---|
public static boolean equals(Object a,Object b) | 比较两个对象的,底层会先进行非空判断,从而可避免空指针异常。再进行euqals比较 |
public static boolean isNull(Object obj) | 判断变量是否为null,为null返回true,反之 |
StringBuilder概述
是一个可变的字符串类,我们可以把它看成是一个对象容器。
作用:提高字符串的操作效率,如拼接,修改等
StringBuilder构造器
名称 | 说明 |
---|---|
public StringBuilder() | 创建一个空白的可变的字符串对象,不包含任何内容 |
public StringBuilder(String str) | 创建一个指定字符串内容的可变字符串对象 |
StringBuilder常用方法
方法名称 | 说明 |
---|---|
public StringBuilder append(任意类型) | 添加数据并返回StringBuilder对象本身 |
public StringBuilder reverse() | 将对象的内容反转 |
public int length() | 返回对象内容长度 |
public String toString() | 通过toString()就可以实现把StringBuilder转换为String |
总结
当作工具来用,最终目的还是要转成String
Math类
包含指向基本数字运算的方法,Math类没有提供公开的构造器
如何使用类中的成员?
看类的成员是否是static修饰,如果是,通过类名直接调用
//扩展 3-9直接的随机数 0-6+3
int data=(int)(Math.random()*7)+3;
System类
功能是通用的,不需要通过实例,直接调用即可
BigDecima作用
用于解决浮点型运算精度失真的问题
BigDecimal a1=BigDecimal.valueof(a);