java篇 之 多态
2018-9-28
多态:
重载也称为静态多态(静态在编译阶段就能确定)(动态是跟运行时挂钩)
尽量去选择关系轻的,降低耦合度(紧密度)
内聚:
减少与外界的联系,降低与其他对象和类的联系
对象与对象的关系:高内聚,低耦合
继承本身就是打破封装的(因为它要调用外界的东西)(封装是内敛的,阻止访问)(封装与继承是相互冲突的)
重写规则:
- 发生在有继承关系的类之间(同一类就是重载了)
- 相同的方法名,参数列表,返回类型
- 可见性(public,protected,private)不能被缩小
- 异常不能被放大
- 规则与c++中不一样
- 静态类型不能被重写
类型转换:
都是按地址空间大小解析
子类-->父类(隐式转换,自动截取,按父类地址空间大小解析,多出的部分截取不解析,但是当Person p = new Lawyer(“kb”,2);再转回子类时不会出错,但还是要instanceof语句)
经常用父类引用去引用子类对象!!!(左边是引用(p),右边是对象(lawyer))
父类-->子类(可能会有错,必须强制转换,按子类空间大小解析,(少的部分用乱码解析给子类,会有错),使用者自己承担问题,用instanceof语句)
if(p instanceof Lawyer)(可以转才执行下一句)
静态类型(永远不会变化)决定编译能否通过
动态类型,实际指向的类型(执行的时候可变)由动态类型决定的方法调用称之为多态
Byte b = (byte) 10;
b--- byte(静态类型永不会变)
10 ----int(动态类型)
多态:
同一类域,不同对象,相同行为,不同表现形式
成为多态的语法前提:
- 有继承层次(子类extends 父类 )
- 方法重写
- 等号左边的引用要一致,父类声明的变量去引用子类的对象
this:指向当前调用者(本身)谁用就是谁
方法重载的要求是什么?
方法名相同
参数列表不同(参数类型不同或者参数个数不同)
public class A{
public void test1(){
System.out.println("A test1");
}
}
public class B extends A{
public void test1(){
System.out.println("B test1");
}
public void test2(){
System.out.println("B test2");
}
public static void main(String[] args){
A a = new B();
a.test1();
a.test2(); //a的静态类型没有test2方法,所以编译不能通过,必须有, //b中才能重写,调用
}
}
编译运行后的结果是什么?为什么?
编译报错,变量a是A类型的,无法调用到test2方法,因为test2方法是B类中独有的
分析:a的静态类型是A,动态类型是B,首先静态编译,有test1方法,然后动态调用B中的test1,但是A中没有test2,编译报错