这个知识点你会弄错。
重写:两个方法有相同的名称和相同的参数,其中一个方法位于子类,另一个方法位于这个子类的父类中。重写让子类可以在父类的基础上实现跟你更多的功能,或者实现自己的功能。
多说两句,重写是针对方法的,针对成员变量的重写有试过吗?
案例
看一下下面的代码,猜一下运行的结果是什么。
class Super {
String s = "老子";
public String bark(){
return s;
}
}
class Sub extends Super {
String s = "儿子";
@Override
public String bark() {
return s;
}
}
public class FieldOverriding {
public static void main(String[] args) {
Sub c1 = new Sub();
System.out.println(c1.s);
System.out.println(c1.bark());
Super c2 = new Sub();
System.out.println(c2.s);
System.out.println(c2.bark());
}
}
定义:在一个类中,成员变量的名称和父类相同的时候会隐藏父类的成员比那里,尽管类型不同。在子类中,父类的成员变量不能通过变量名字来引用。只能,通过它的父类来访问。
最后:我们不建议这么做,这样会让代码阅读变得困难。
运行结果:
儿子 // c1.s
儿子 // c1.bark()
老子 // c2.s
儿子 // c2.bark
分析
c1和c2是相同的对象,也就是相同的class,但是c2.s为父类的内容,意味着父类和子类的成员变量都是存在的。
我们也可以这样访问:
((Super) c2).s //注意这里的Super不是Java的关键字。
额外
重写和重载都会放在一起呗提到,初学者也经常弄混淆两者的概念。
重载:两个或更多个有相同的名称,但是有不同的参数。(参数个数不同,参数类型不同),与方法的返回值无关,与权限修饰符无关。类型,个数,顺序
最后
这个概念在Java的官方文档中有提到,想把Java搞明白,还是要阅读官方文档,最一手的资料。
有没有觉得这个知识点很偏呢...
下面这个程序运行结果是什么?
public class Base
{
private String baseName = "base";
public Base()
{
callName();
}
public void callName()
{
System. out. println(baseName);
}
static class Sub extends Base
{
private String baseName = "sub";
@Override
public void callName()
{
System. out. println (baseName) ;
}
}
public static void main(String[] args)
{
Base b = new Sub();
}
}
答案解析:
new Sub();在创造派生类的过程中首先创建基类对象,然后才能创建派生类。
创建基类即默认调用Base()方法,在方法中调用callName()方法,由于派生类中存在此方法,则被调用的callName()方法是派生类中的方法,此时派生类还未构造,所以变量baseName的值为null