对于父类中的static 方法,子类可以:继承,方法重载,方法隐藏(不是方法重写)。
方法隐藏的含义与数据成员的隐藏的含义是一样的:
对于你的例子代码:
若去掉红色的代码,则是子类继承了父类的printa()方法。若加上红色代码,则是子类自己的printa()隐藏了父类的printa()。若子类加上代码printa(int i),则是子类重载了父类的
printa()。
1.子类可以继承父类的静态方法,但是不能被重写。
2.一个类中的静态方法,系统都默认在static前面加一final关键字。
3.当一个被修饰成final的方法,那么这个方法是不能被重写的,所以静态方法不能被重写。
4.当你在子类里看到有一个static方法和父类的某个static方法一样(指访问权限,返回类型,参数表(参数个数,参数的类型,参数的排列顺序)一样),但是方法体不一样,别以为是子
类继承并重写了父类的那个方法,其实不然,子类的这个方法将被认为是子类自己新增加的方法,也就是说这个方法和父类没一点关系。
class A {
public static void print() {
System.out.println("我是A的方法");//这是A的方法。
}
public void ac() {
System.out.println("---b---");
}
}
class B extends A {
public static void print() {
System.out.println("我是B的方法");
}//这是B自己新增加的方法, 这个方法和父类没有任何关系。(这个方法也就是你们认为重写的方法)
public void ac() {
System.out.println("---a---");
}//这是重写的方法。
}
public class TestExtends {
public static void main(String[] args){
B b = new B();
b.print();//调用自己新增的方法。看清楚,这里是B自己的对象b.输出:我是B的方法
b.ac();//调用重写的方法。输出:---a---
A a = new B();
a.print();/*编译可以通过,要是输出:我是B的方法 那么就表示可以继承并重写父类static方法。
要是输出的是:我是A的方法 那么表示它调用的是父类的方法,并没有调用你们所认为的
那个重写的方法(即我说的子类自己新增加的方法)。动手试试!
问题的关键也是在这里,为什么不输出:我是B的方法 希望你能想明白*/
a.ac();//调用的是重写的方法。输出---a---
}
}
方法隐藏的含义与数据成员的隐藏的含义是一样的:
对于你的例子代码:
若去掉红色的代码,则是子类继承了父类的printa()方法。若加上红色代码,则是子类自己的printa()隐藏了父类的printa()。若子类加上代码printa(int i),则是子类重载了父类的
printa()。
1.子类可以继承父类的静态方法,但是不能被重写。
2.一个类中的静态方法,系统都默认在static前面加一final关键字。
3.当一个被修饰成final的方法,那么这个方法是不能被重写的,所以静态方法不能被重写。
4.当你在子类里看到有一个static方法和父类的某个static方法一样(指访问权限,返回类型,参数表(参数个数,参数的类型,参数的排列顺序)一样),但是方法体不一样,别以为是子
类继承并重写了父类的那个方法,其实不然,子类的这个方法将被认为是子类自己新增加的方法,也就是说这个方法和父类没一点关系。
class A {
public static void print() {
System.out.println("我是A的方法");//这是A的方法。
}
public void ac() {
System.out.println("---b---");
}
}
class B extends A {
public static void print() {
System.out.println("我是B的方法");
}//这是B自己新增加的方法, 这个方法和父类没有任何关系。(这个方法也就是你们认为重写的方法)
public void ac() {
System.out.println("---a---");
}//这是重写的方法。
}
public class TestExtends {
public static void main(String[] args){
B b = new B();
b.print();//调用自己新增的方法。看清楚,这里是B自己的对象b.输出:我是B的方法
b.ac();//调用重写的方法。输出:---a---
A a = new B();
a.print();/*编译可以通过,要是输出:我是B的方法 那么就表示可以继承并重写父类static方法。
要是输出的是:我是A的方法 那么表示它调用的是父类的方法,并没有调用你们所认为的
那个重写的方法(即我说的子类自己新增加的方法)。动手试试!
问题的关键也是在这里,为什么不输出:我是B的方法 希望你能想明白*/
a.ac();//调用的是重写的方法。输出---a---
}
}