现在的位置: 首页 > 综合 > 正文

关于Java父类子类那点事

2014年03月22日 ⁄ 综合 ⁄ 共 1886字 ⁄ 字号 评论关闭

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();
 }
}
上面红色字体标注了会报出来的错误。

抱歉!评论已关闭.