函数重写
class A
{
public void f()
{
System.out.printf("AAAA\n");
}
// public void f(int i)
// {
// System.out.printf("哈哈\n");
// }
}
class B extends A
{
void f()
{
// super.f(); //调用从父类继承过来的f方法
// f(10);
System.out.printf("BBBB\n");
}
}
class M
{
public static void main(String[] args)
{
// B bb = new B();
// bb.f();
}
}
程序运行示例:
——————————————————————————————
M.java:15: 错误: B中的f()无法覆盖A中的f()
void f()
^
正在尝试分配更低的访问权限; 以前为public
1 个错误
————————————————————————————————
方法重写
- 方法重写
- 指在子类中重新定义父类中已有的方法
- 重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型
- 子类中不允许出现与父类同名同参但不同返回类型的方法,如果出现了,编译时会报错
- 重写方法时,不能使用比父类中的方法更严格的访问权限(原因等我们讲到多态时再讲)
class A
{
public int f(int i)
{
System.out.printf("AAAA\n");
return 10;
}
}
class B extends A
{
public int f(int i)
{
System.out.printf("BBBB\b");
return 10;
}
}
class M
{
public static void main(String[] args)
{
B bb = new B();
// System.out.printf
bb.f(10); 因为f()已经被重写了,所以此处应该自动调用B类中重写的f()函数
}
}
程序运行示例:
——————————————————————————————
BBBB
————————————————————————————————
重写的意义
- 如果子类对继承自父类的方法不满意,就应该重写父类的方法
重写方法示例:
class Human
{
private String name;
private int age;
public Human()
{
}
public Human(String name,int age)
{
this.name = name;
this.age = age;
}
public void setName()
{
this.name = name;
}
public void setAge(int age)
{
this.age = age;
}
public String getInfor()
{
String strInf = name + ": " + age;
return strInf;
}
}
class Student extends Human
{
public String school;
public Student()
{
}
public Student(String name,int age,String school)
{
super(name,age);
// this.name = name; //error 因为name是私有的
// this.age = age; //error 同山
this.school = school;
}
public void setSchool(String school)
{
this.school = school;
}
public String getInfor()
{
// String strInf = name + ": " + age + ": " + school;//error name是私有的
String strInf = super.getInfor() +": " + school;
return strInf;
}
}
public class M
{
public static void main(String[] args)
{
Student st1 = new Student("彭晨",22,"通达");
System.out.printf("%s\n",st1.getInfor());
}
}
程序运行示例:
——————————————————————————————
彭晨: 22: 通达
————————————————————————————————