java父类不能代替子类_关于Java父类子类那点事

1、父类中private的方法,可以被重写,但是不能被继承。如果被重写了,那么:父类 a=new 子类(),运行的时候,调用的是子类的private方法。测试代码如下:

package static_;

public class M {

public static void test() {

System.out.println("in m");

}

private void testPrivate() {

System.out.println("private in m");

}

}

class T extends M {

public static void test() {

System.out.println("in t");

}

//

// private void testPrivate() {

//  System.out.println("private in t");

// }

public void testP(){

testPrivate();

}

}

下面是main函数所在:

package static_;

public class Snippet {

public static void main(String ss[]) {

T m = new T();

m.testP();

// M m = new T();

// m.test();

// M.test();

// T.test();

}

}

上面代码输出是:private in t,说明调用了子类的private方法【代码中的private方法被注释掉了,请取消注释】。

2、static方法可以被继承,但是不能被覆盖。覆盖的含义是:父类 a= new 子类(),在a调用方法的时候,如果调用的是子类的方法,那么说明父类的方法被覆盖了。但是,看下面的代码。

测试代码如下:

package static_;

public class M {

public static void test() {

System.out.println("in m");

}

public void testPublic() {

System.out.println("public in m");

}

}

class T extends M {

public static void test() {

System.out.println("in t");

}

public void testPublic() {

System.out.println("public in t1");

}

}

package static_;

public class Snippet {

public static void main(String ss[]) throws Exception {

M m=new T();

m.testPublic();

m.test();

}

}

代码输出是:

public in t1

in m

说明,父类的public方法被覆盖了。但是static方法调用的还是父类的。说明父类的方法不能被覆盖。即使被重写了,调用的时候还是会去调用父类的方法。除非直接T.test()指明调用子类的方法。

【这里其实很明确会调用父类的static方法。因为M m=new T();,是以父类的形式调用的,而静态方法是属于类的,所以是调用的父类的static方法。如果T m=new T();,那么调用的就必然是子类的static方法了。】

3、final方法不能被继承,不能被覆盖

package static_;

public class M {

public static void test() {

System.out.println("in m");

}

private void testPrivate() {

System.out.println("private in m");

}

public final void testFinal(){

System.out.println("final in m");

}

}

class T extends M {

public static void testtttttt() {

test();

System.out.println("in t");

}

private void testPrivate() {

System.out.println("private in t");

}

public final void testFinal(){//Cannot override the final method from M   System.out.println("final in m");  }    public void testP(){   testPrivate();  } } 上面红色字体标注了会报出来的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值