方法重写
- 方法重写是在继承的基础上,父类的某一个方法并不能满足子类的需求时,子类可以重新定义该方法的内容与功能来满足子类的需求的一种操作。
- 子类的方法名,参数列表,必须和父类一样,子类返回值类型<=父类返回值类型,且子类方法的访问权限>=父类方法访问权限,才构成方法重写。
- 父类方法是静态方法子类重写的方法也必须是静态方法,父类方法是非静态方法子类重写的方法也必须是非静态方法
- 子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(静态方法中不能使用super)
- 父类的私有方法不能被子类重写
- 不能抛出被父类方法更多的异常
重写与重载
方法重写vs方法重载
比较项 位置 方法名 参数表 返回值 访问修饰符
方法重写 子类 相同 相同 相同或是其子类 不能比父类更严格
方法重载 同类 相同 不相同 无关 无关
- 重写与重载的区别:方法重载是在同一个类中,方法名相同,参数列表不一致,且与返回值无关的多个方法;方法重写是在继承关系中,子类重写父类的方法,子类的方法名,参数列表,必须和父类一样,子类返回值类型<=父类返回值类型,才构成方法重写;且子类方法的访问权限>=父类方法访问权限。
- 方法重写后,子类的方法会将父类的方法覆盖掉,子类对象调用子类的该方法时,只会执行子类的该方法,不会执行父类的方法。
父类
public class People {
private int age;
private double height;
private double weight;
private String name;
public People(int age, double height, double weight, String name) {
super();
this.age = age;
this.height = height;
this.weight = weight;
this.name = name;
}
public People() {
super();
// TODO Auto-generated constructor stub
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getWeight() {
return weight;
}
public void setWeight(double weighet) {
this.weight = weighet;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//show方法
public void show() {
System.out.println("我是一个人,我的姓名是:"+name+" 年龄:"+age+" 身高:"+height+" 体重:"+weight);
}
}
子类
public class Student extends People{
private int id;//学号
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
//由于父类的show方法中没有加入子类中的id属性,而子类必须要把id通过show方法展示出来,此时就需要重写show方法
public void show() {
System.out.println("我是一个学生,我的姓名是:"+this.getName()+" 学号"+id+" 年龄:"+this.getAge()+" 身高:"+this.getHeight()+" 体重:"+this.getWeight());
}
}
测试
public class test111 {
public static void main(String[] args) {
Student stu = new Student();
stu.setName("鲁班");
stu.setAge(19);
stu.setWeight(45.0);
stu.setHeight(100);
stu.setId(10001);
stu.show();
}
}
输出结果:我是一个学生,我的姓名是:鲁班 学号10001 年龄:19 身高:100.0 体重:45.0
toString方法
- 每个类都直接或间接是Object类的子类,如果一个类没有指定继承哪个父类,Java就会默Object是这个类的父类
- 比如上面所测试的两个类,People和Student;Student是People的子类,而People就是Object类的子类
- Object类中有toString方法,可以输出对象在内存中的地址
//创建子类对象
Student stu = new Student();
//打印父类toString方法的返回值
System.out.println(stu.toString());
输出结果:ObjectOriented.Student@15db9742
即返回值是:包名.类名@地址
- toString方法可以被重写
- 快捷键 :右键–>source—>Genarate toString()
- 重写后的toString方法可以以字符串的形式返回对象的属性
//重写toString方法
@Override
public String toString() {
return "People [age=" + age + ", height=" + height + ", weight=" + weight + ", name=" + name + "]";
}