多态:
格式:
父类名称 对象名称 = new 子类构造器;
接口名称 对象名称 = new 实现类构造器;
概念:同一个类型的对象,执行同一个行为,在不同的状态下会表现出不同的行为特征。
多态识别技巧:
对于方法的调用:编译看左边,运行看右边。
对于变量的调用:编译看左边,运行也看左边。
(左边是父类,右边是子类)
使用前提:
1.必须存在继承和实现关系
2.必须存在父类类型的变量引用子类类型的对象
3.需要存在方法重写
多态的优势:
1.右边可以实现组件化切换,业务功能也随之切换,便于维护和扩展,可实现类与类之间的解耦
2.实际开发过程中,父类类型作为方法形式参数,传递子类对象给方法,可以传递一切子类对象进行方法的调用,更能体现出多态的扩展性和便利
劣势:
当子类想调用自己独有的方法时,编译看左边,说明父类中必须要有此方法,不然编译阶段就报错。
如何解决劣势:
使用引用类型的强制类型转换。大范围转小范围需要强制转换。由父类类型转为子类类型需要强转。
有继承/实现关系的两个类型就可以实现类型转换,编译阶段一定不会报错,但运行阶段可能报ClassCastException
建议在转换之前先判断变量的真实类型,语法:变量 instanceof 类型
前者是后者的类型或者其子类类型才会返回true
内部类:
静态内部类:
用static修饰的内部类,在外部类里面。内部类和外部类成员一样的。可以在内部类访问外部类的静态成员,但不能直接访问实例成员,需要用外部类的对象来访问。
Outter.Inner in = new Outter.Inner(); //属于外部类本身。
成员内部类:
与普通类一样,无static修饰,但是不能在成员内部类里定义静态成员,但可以定义常量。
Outter.Inner in = new Outter.new Inner(); //属于外部类对象的,需要先创建外部类对象才能创建内部类对象。可以在成员内部类访问外部类的静态成员,也能直接访问实例成员,因为成员内部类是属于外部类对象的。
局部内部类:
可在类里面的方法、构造器、代码块、for循环里定义类,只能定义实例成员,不能定义静态成员,可以定义常量。
匿名内部类:
无名字的内部类,为了简化代码。
格式:
new 类名|抽象类|接口(形参){
方法重写。
};
特点:1.无名字的内部类
2.匿名内部类一旦写出来,就会立即创建一个匿名内部类的对象返回
权限修饰符:
Object类:
equals()方法比较两个对象的地址,不相同返回false,但比较地址通常使用 == ,通常比较两个对象的内容需要按照自己要求重写此方法。
a.equals(b)和Objects.equals(a,b):后者可以防止a对象为空的情况,前者如果a对象为null会报空指针异常,后者更严谨。jdk1.7开始有Objects类。