二、重写(覆盖)原则 1.相同的方法名,参数列表、返回类型 2.访问权限不能更小3.抛出异常不能更大 4.方法的重写只能发生在父子之间,同一个类里方法只能重载 5.父类的静态方法不能被子类覆盖为非静态的方法 6.子类可以定义与父类静态方法同名的静态方法,以便在子类中隐藏父类的静态方法 7.父类的非静态方法不能被子类覆盖为静态的方法 8.父类的私有方法不能被子类覆盖,因为父类的私有方法不能被子类继承。所以不存在 覆盖的概念 静态的方法调用的时候与引用类型绑定。普通非静态的方法调用的时候与对象类型绑定 =============================================================================== 三、多态 polymorphism 一个名字多种形态 1、基本类型的多态2、方法多态3、类(接口)多态4、参数的多态(1+3) 发生类多态的情况: 父类的指针指向子类的时候会发生类多态 Person p = new Student();类多态 类多态:父类变量指向子类对象,发生了类多态,此时: 1.只能使用父类中定义的属性/方法,子类中扩展的属性和方法存在,但是不能直接使用子 类中定义的,除非进行类型转换 2.如果调用重写的方法,实际调用的是子类的重写后的方法,覆盖掉了父类中的非静态的该 方法 3.如果没有继承,就没有重写,如果在父类中把方法设为 private ,那showName()方法就 不能重写,也就会报错,如果想要使用子类的showName()方法,可以把 @Override 去掉,使子类中的showName()成为一个新方法 public static void main(String[] args) { Person p = new Teacher();//类多态 //发生多态时就是把子类对象当父类来用 p.setAge(23);//调用的 p.setName("yang");//该方法是被重写后的。她调用的是子类的 //p.setId(1);这里的方法是子类扩展的。发生多态时是不能用的 //多态就是把对象看成两种状态 // 编译是父类,运行时是子类 Teacher t=new Teacher(); t.setId(1);//这里是合法的,因为没有发生多态 } 引用类型的类型转换:(本质上是一种还原操作) 引用类型指的是等号前面声明的类型 格式:(类名) 变量名 例子:Animal animal=new Dog(); Dog d=(Dog)animal; 转换的条件: 1.发生在父类与子类之间 2.曾经发生多态 3.由父类向子类转(向下转) public static void main(String[] args) { Person p = new Teacher();//类多态 //发生多态时就是把子类对象当父类来用 p.setName("yang");//该方法是被重写后的。她调用的是子类的 //p.setId(1);这里的方法是子类扩展的。发生多态时是不能用的 if(p instanceof Teacher){ Teacher t1=(Teacher)p; t1.setId(1);//强制类型转换后就可以调用了 t1.getAge(); } } instanceof 用来判断类型,他是向父类兼容的。无法用于确定对象的确切类型 例如:(t instanceof Person)=true instanceof 判断的是它指向的类型,如上例子所示
java课堂笔记7
最新推荐文章于 2024-04-26 09:31:43 发布