`

继承修饰符的问题

SUN 
阅读更多

=========修饰符回顾==========

  java类的成员变量通常有以下几种访问修饰符:

  public、private、protected或者缺省,

  例如在package first 中如果有一个类FirstClass有四个变量:

  public int pp;

  private int xiaopp;

  protected int dd;

  int xiaodd;

  如果在package first 中有另一个类SecondClass继承了FirstClass:

  那么他将继承FirstClass中的三个变量,分别是:

  public int pp;

  protected int dd;

  int xiaodd;

  如果在另一个package second中有一个类ThirdClass 继承了FirstClass,

  那么他将继承FirstClass中的两个变量:

  public int pp;

  protected int dd;

  从上面的例子我们可以看出访问修饰符被继承的关系:

  public 可以被任何子类继承;

  protected 虽然他会阻止包外的类访问,但他不会阻止包外的类继承;

  缺省访问修饰符 不但只能被相同包内的类访问,而且还只能被相同包的子类继承;

  private 访问局限在同一个类内,并且不可以被继承。

===================

 

本文仅讨论子类能否重写父类的方法,一旦重写成功,子类调用的时候是会覆盖父类的方法的。

子类重写父类方法的时候有两个考虑:

1.父类的方法不能降级,同级的话就要覆盖,例如public方法不能在子类中被声明为protected或者private(子类重载除外),否则会有

Cannot reduce the visibility of the inherited method from Father的编译错误。

2.父类的方法可以任意升级,但升级只有两种方式,要么覆盖,要么重载,覆盖就是方法体完全一样,重载则是参数必须改变,方法名称不变。

Java代码 复制代码
  1. import java.lang.reflect.Method;   
  2.   
  3. class Father{   
  4.     int a;   
  5.     protected int b = 5;   
  6.     protected void funcpro(){   
  7.         //父类的保护方法,子类能够访问,但子类自身没有   
  8.         System.out.println("father funcpro");   
  9.     }   
  10.     public void funcpub(){   
  11.         //父类公有方法,子类直接继承   
  12.     }   
  13.     private void funcpri(){   
  14.         //父类私有方法,子类不可见   
  15.     }   
  16. }   
  17. public class TestOveride extends Father {   
  18.   
  19.     /**  
  20.      * @param args  
  21.      */  
  22.     //父类保护方法的重写   
  23. //  public void funcpro(){   
  24. //      //子类自己可以这样定义,将会覆盖父类protected方法   
  25. //      System.out.println("子类的func方法");   
  26. //  }   
  27.   
  28. //  protected void funcpro(){   
  29. //  //ok   
  30. //}   
  31.        
  32. //  public short funcpro(){   
  33. //      //illegal    父类的protected和public方法在子类中是可见的,试想一下,如果编译器认为这个方法体正确,   
  34.         //那么子类调用funcpro的时候究竟调用哪个呢?这样没有能构成重载   
  35. //  }   
  36.   
  37. //  private void funcpro(){   
  38. //      //illegal   
  39. //  }   
  40.      
  41.     private void funcpro(int a){   
  42.         //这是方法重载,不会报错   
  43.         System.out.println("sun funcpro");   
  44.     }   
  45.   
  46.     //父类公有方法的重写   
  47.   
  48. //  private void funcpub(){   
  49. //      //illegal:Cannot reduce the visibility of the inherited method from Father    
  50. //  }   
  51.        
  52. //  protected void funcpub(){   
  53. //      //illegal  Cannot reduce the visibility of the inherited method from Father   
  54. //  }   
  55.        
  56. //  public void funcpub(){   
  57. //      //ok   
  58. //  }   
  59.        
  60. //  public int funcpub(){   
  61. //      //illegal 和父类的返回值不匹配   
  62. //  }   
  63.   
  64. //  public int funcpub(int i){   
  65. //      //ok 子类构成重载   
  66. //      return 1;   
  67. //  }   
  68.   
  69.     //父类私有方法的重写   
  70.   
  71. //  public void funcpri(){   
  72. //      //ok   
  73. //  }   
  74.        
  75. //  protected void funcpri(){   
  76. //      //ok   
  77. //  }   
  78.   
  79. //  private void funcpri(){   
  80. //      //ok   
  81. //  }   
  82.        
  83.     public static void main(String[] args) {   
  84.         // TODO Auto-generated method stub   
  85.         TestOveride testOveride = new TestOveride();   
  86.         Class class1 = testOveride.getClass();         
  87.         try {   
  88.             Method[] methods = class1.getMethods();   
  89.             System.out.println("子类中的所有方法:");  //可以看到,并没有父类的funcpro方法   
  90.             for(Method m:methods){   
  91.                 System.out.println(m);   
  92.             }   
  93.             System.out.println("子类调用父类的protected 方法:");   
  94.             testOveride.funcpro();   
  95.             System.out.println("子类调用自己的func方法:");   
  96.             testOveride.funcpro(1);   
  97.             System.out.println("子类调用父类的字段");   
  98.             System.out.println(testOveride.b);   
  99.         }catch(Exception e){   
  100.             e.printStackTrace();   
  101.         }   
  102.   
  103.     }   
  104.   
  105. }
分享到:
评论

相关推荐

    Java访问修饰符

    final 访问修饰符表示使用此修饰符的类不能够被继承。final 变量的值只能被分配一次,不能更改。 abstract 访问修饰符 abstract 访问修饰符表示抽象类,抽象类不能被实例化。抽象类中可以定义抽象方法,抽象方法是...

    Java修饰符使用整理(含实例)

    Java 修饰符是 Java 语言中的一种基本语法元素,用于控制访问权限、继承关系、抽象类和静态成员变量等方面。Java 修饰符可以分为两大类:访问修饰符和非访问修饰符。访问修饰符包括 public、protected、default 和 ...

    C#学习之路--访问修饰符

    C#学习之路--访问修饰符 访问修饰符是C#语言中的一种机制,用于控制对象的访问权限。在C#中,访问修饰符有五种...此外,访问修饰符还可以帮助我们实现继承和多态性,例如,使用protected修饰符可以实现继承和多态性。

    继承与访问修饰符知识点

    继承与访问修饰符是面向对象编程中的核心概念,它们在定义类的结构和关系时起着至关重要的作用。本文将详细探讨这两个主题,以便更好地理解它们如何影响代码的可访问性和可扩展性。 首先,访问修饰符是用来控制类的...

    day01-继承&修饰符&多态&抽象类.pdf

    继承实现了代码的复用与维护,修饰符控制了类和成员的访问权限,多态使得程序更加灵活,而抽象类为子类提供了一个共同的模板和抽象方法实现的要求。理解和掌握这些知识点对于学习和应用Java面向对象编程至关重要。

    理解java中的类的各种权限修饰符

    ### 理解Java中的类的各种权限修饰符 在Java编程语言中,权限修饰符用于控制类、方法、变量等成员的访问级别。这有助于提高代码的安全性和封装性。本文将详细探讨Java中的五种权限修饰符:`public`、`protected`、`...

    C#访问修饰符的简介

    在C#编程语言中,访问修饰符是用来控制类、接口、结构、枚举以及它们的成员(如字段、方法、属性等)的可访问性的关键元素。这些修饰符定义了哪些代码可以访问特定的类型或成员,从而确保了代码的封装性和安全性。...

    java修饰符介绍

    在Java编程语言中,修饰符是用来限制或指定代码元素(如类、方法、变量)的访问权限、特性或行为的关键词。以下是对标题和描述中提及的Java修饰符及其相关知识点的详细介绍: 1. 类的访问控制修饰符: - **public*...

    java常用的修饰符

    - **final**: 最终类修饰符,防止类被继承。通常用于创建不可变类或工具类。 - **default**: 缺省访问控制符,没有明确指定访问级别的类或接口,只允许同一包内的访问。 2. **域的控制修饰符** - **public**: ...

    c#的访问修饰符

    C#的访问修饰符 C#语言中提供了多种访问修饰符,以控制类、成员变量和成员方法的访问权限。这些修饰符可以分为两类:访问修饰符和非访问修饰符。 访问修饰符包括public、private、protected、internal、protected ...

    java 三个修饰符习题.zip

    这三个修饰符在类继承和包管理中起着关键作用。在设计类的继承结构时,通常会使用`private`来隐藏实现细节,`protected`来允许子类进行必要的扩展,而`public`则用于提供公共的接口供其他类调用。 在提供的压缩包...

    类修饰符,用于对类的特性

    - **定义**:`protected internal`修饰符结合了`protected`和`internal`的特点,允许类在同一程序集中或者通过继承关系被访问。 - **应用场景**: - 当需要同时满足内部程序集访问和继承体系内访问的需求时。 - 在...

    C#类修饰符大全

    当子类中有一个与父类相同的成员名称时,可以使用new修饰符来明确指出是新的成员,而不是继承自父类的。 - **static**构造函数用于初始化静态成员,不能接收任何参数,也不能对非静态成员进行初始化。它会在第一次...

    JAVA访问修饰符大归纳

    根据 JAVA 访问修饰符的特性和使用范围,我们可以将其分为三类:修饰符类的访问修饰符、属性的访问修饰符和方法的修饰符。 一、修饰符类的访问修饰符 修饰符类的访问修飾符共有四种:默认、public、abstract 和...

    C#修饰符总结

    - `protected`:受保护访问修饰符,允许同一类及继承类访问。 - `internal`:程序集内访问,只允许在同一程序集内的类访问。 - `protected internal`:受保护和内部,允许同程序集或继承类访问。 - `private ...

    继承和接口和java访问权限修饰符总结.doc

    继承和接口和java访问权限修饰符总结 本文总结了 Java 中的继承、接口和访问权限修饰符的概念和使用。继承是 Java 中的一种机制,允许子类继承父类的属性和方法,並且可以对父类的方法进行重写或重载。动态绑定是指...

    day01-继承&修饰符

    day01-继承&修饰符

    第6章 Java语言中的修饰符.ppt

    Java语言中的修饰符是编程语法中的重要组成部分,它们用于定义类、接口、变量和方法的特性,从而控制访问权限、实现抽象概念、确保不可变性以及优化代码结构。本章将详细阐述Java中的主要修饰符。 首先,我们讨论...

    java修饰符

    访问控制修饰符和非访问控制修饰符共同作用,不仅实现了封装、继承和多态等面向对象编程的基本特征,还提供了更高级的功能,如线程安全、不可变性和代码优化等,使Java程序具备了强大的灵活性和适应性。

Global site tag (gtag.js) - Google Analytics