如何在实例化对象时实现对其属性进行赋值?
重写其构造方法
手动写的有参构造方法会把原本的默认无参构造方法覆盖 ------>重新写一个无参构造方法(方法重载) 可以解决子类报错问题 因为子类继承父类会默认调用父类的无参构造方法 (继承无法继承父类的构造方法)
在子类构造方法中也可以手动调用父类的有参构造方法 -------------->super(属性1,属性2,属性3);
向上转型与向下转型
向上转型(自动类型转换)
Person p1 = new Student(属性1,属性2,属性3); //Person 父类 Student 子类
父类类型接受子类对象,只能调用到父类和子类共有的公开的(public)属性和方法,子类独有的属性和方法是无用调用到的( . 不出来)
向下转型(强制类型转换)
Person p1 =new Student(属性1,属性2,属性3);
Student s1 = (Student) p1;
安全的向下转型是先把子类对象向上转型为父类,再将该父类强转为子类
当多个子类时可以使用instanceof进行数据类型判断
if(p1 instanceof Student1){
Student1 stu1 = (Student) p1;
}else if(ps instsnceof Student2){
Student2 stu2 = (Student) p1;
} ..........
方法重写与方法重载
方法重载
在同一个类中,对某一方法进行重写,方法的名字相同,参数不同(个数不同,数据类型不同),与访问修饰符无关 -----最常用的是对构造器的重写
1.被重载的必须改变参数列表(数据参数或个数不同)
2.重载的方法可以声明新的或者更广的检查异常
3.方法能够在同一个类中或者在一个子类被重载
方法重写
1.在子类和父类中,子类重写父类的方法,方法名相同,参数相同(个数,数据类型),访问修饰符和返回值类型不能严于父类,一般情况下也是相同 ----返回值类型可以不同但必须是父类返回值的派生类(java5以前要求一样,java7或更高版本可以不同)
2.在子类中重写父类方法 实现输出子类特有属性 -----在测试类的实例化对象中 会调用子类重写后的方法因为此时的p1(实例化出来的对象)在内存中指向的是子类的对象
3.生命为final的方法不能被重写 声明为static的方法不能被重写,但是能够被再次声明。
4.子类和父类在同一个包中,那么子类可以重写父类所有方法,除了可声明为private和final的方法。子类和父类不在同一个包中,那么子类只能重写父类声明为public和protected的非final方法
5.构造方法不能被重写。
重写即子类对父类允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。即外壳不变,核心重写! 根据子类的需要定义自己的特定行为。
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,抛出 IOException 异常或者 IOException 的子类异常。(访问修饰符和返回值类型不能严于父类 包括抛出的异常信息)
在面向对象原则里,重写意味着可以重写任何现有方法。
方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
重写与重载之间的区别
| 区别点 | 重载方法 | 重写方法 |
|---|---|---|
| 参数列表 | 必须修改 | 一定不能修改 |
| 返回类型 | 可以修改 | 一定不能修改 |
| 异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
| 访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |



浙公网安备 33010602011771号