多态
多态是java面向对象三大特性(封装、继承、多态)的最后一个,简单描述多态就是:父类型的引用指向子类型的对象
常用定义格式:父类类型 对象名称=new 子类类型()
在方法中,实参也可以是形参的子类对象,同样,实际返回的对象也可以是返回值类型的子类
多态方法重写使用注意事项:
返回值类型要相同,或是父类返回值类型的子类
访问权限不能低于父类
私有方法无法被重写
不能抛出比父类更大的异常(只能抛出父类抛出的异常或父类抛出异常的子类)
抽象类
抽象类用来描述某一类事物应该具备的基础属性和功能,但具体如何实现交给子类完成
抽象类可以理解为一个模板,规定了该类型的子类应该具备的功能和行为,但是没有对这些属性和行为做出具体描述,需要由子类去完成
//抽象类的定义
public abstract class AbsClass{//当类中有抽象方法时,类就必须声明为抽象类
public abstract void method();//抽象方法不能有方法体
public void method2(){
System.our.println("抽象类中也可以有普通方法");
}
}
//实现类
//当继承抽象类时,就必须重写抽象类中的全部抽象方法,否则该子类也要声明为抽象类
public class ImplAbsClass extends AbsClass{
@Override
public void method{
System.out.println("抽象方法被重写");
}
}
抽象类特点:无法直接创建实例化对象,当且仅当抽象类中的抽象方法被重写后才可以创建实例化对象
重写抽象方法有两种方式(也可以认为是一种)
1、创建抽象类的实现类,重写抽象方法
2、通过匿名内部类方式,创建抽象类对象的同时重写抽象方法
Object类常用方法
toString
/*这是Object类中toString方法的原码
可以看到返回的字符串由三部分拼接而成,
第一部分是全类名(getClass获取字节码文件 getName获取全类名)
第二部分拼接符@
第三部分是十六进制的地址值hashCode获取地址值,Integer.toHexString转为16进制*/
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public class Test{
private String name;
private int age;
/*在输出时,直接输出对象,都是输出对象的toString返回值
但是可以通过重写toString方法,改变输出结果
常用输出格式为:类名{属性名=属性值,...}
在IDEA中可以通过alt+insert快速生成*/
@Override
public String toString(){
return "Test{" +"name='" + name + '\'' +", age=" + age +'}';
}
}
equals
/*在未重写equals方法时,两个引用类型之间对比就是默认使用Object类中的equal方法
此时与直接==对比没有区别,都是比较两个对象的地址值是否相等*/
public boolean equals(Object obj) {
return (this == obj);
}
/*可以通过重写equals方法,定义比较对象的标准*/
public boolean equals(Object o) {
if (this == o) return true;//判断两个对象地址值相同直接返回true,提高效率
if (o == null || getClass() != o.getClass()) return false;//若传入对象为空或者不是同一类型对象则返回false
Test test = (Test) o;//判断为同以类型对象后,强制向下转型,也可以用instanceof替代
return age == test.age && Objects.equals(name, test.name);//定义年龄和姓名相同即认为是一个人
}
hashCode
获得对象的十进制地址值
getClass
获取字节码文件的三种方式之(Class.forName;类名.Class;对象名.getClass)一,反射部分详解