`

修饰关键词和protected

F# 
阅读更多

作用域       当前类       同一package       子孙类       其他package    
   
  public         √               √                           √               √    
   
  protected   √               √                           √               ×    
   
  friendly     √               √                           ×               ×    
   
  private       √               ×                           ×               ×    
   
  不写时默认为friendly    
  子孙类可以在同一包,也可以不一个包,此时以最大权限为准。

 

构造函数时同样适用

 

下面介绍protected

 

注:protected 既包括protected 域,又包括protected 方法,以下统称为protected!

 

      看到protected,我们想到的可能是:protected 既提供包访问权限,同时对继承自该类的所有子类(或子类的下级子类)提供访问权限 !这句话是没有错的,不管子类与父类是否位于同一包中,子类的对象都可以访问protected成员,因为这些成员已经带到子类中来了!

     本文之所以要对protected单独作出讨论,是因为protected并不是上面所提到的那么简单,还有许多情况是我们没碰到过的,这其中包含着陷阱,一不小心,就会触发异常!

     我们可以把对protected成员的访问分成两种情况,一种是创建子类对象,并且用该子类对象来访问protected成员,这个在本文第一段已提到 !
      这里,我们来讨论另一种特殊的情况:当子类与父类位于不同包中,在子类中创建父类对象,并用此父类对象来访问protected成员时,就会抛出一个异常!正如以下程序中看到的:

package A;       //父类所在的包

public class Father {  
      protected int i = 5;            //父类中的protected 域
      protected void test() {         //父类中的protected方法
       System.out.println(this.i);
      }
    
}
==================================================================================
package B;      //子类与父类位于不同的包中
import A.Father;    //导入父类

public class Son extends Father {
public static void main(String[] args) {
    Father f = new Father();     //创建父类对象
    System.out.println(f.i);     //此处会抛出错误
    f.test();      //此处也会抛出同样的错误
}
}
  

我们看到上面的程序会抛出两个错误,原因就在于:当子类与父类位于不同包中时,父类中的protected成员,对于父类本身是不可访问的,只有子类对象才可以访问!上面的程序我们可以把会出错的那两句改成:   

        Son t = new Son();
        System.out.println(t.i);
        t.test();  
这样就不会出错!

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

在上面的例子上,再做一点修改,把Father 中的test()改为protected static void test()

然后在Son类中创建Father f = new Father();

此时,f 仍然不能访问f.i,但是f却可以访问test(),即用f.test()时,不会出错,原因是:

因为test() 是static Method , static method 调用 不需要通过对象的实例,跟写成 Son.test() 是一样的效果 !

 

===========================总结======================================
     当父类与子类位于同一包中时,不管是子类对象还是父类对象都可以访问protected,但是它们的意义是不一样的;对于子类对象,之所以可以访问是因为:子类从父类继承了protected成员,理所当然可以访问;父类对象(在子类中创建的)之所以可以访问是因为protected提供了包访问极限!


    当父类与子类位于不同包中时,protected成员就只能通过子类对象来访问(因为protected对于子类是可见的),而父类对象不再可以访问!不过,可以访问static 成员(因为protected的包访问极限已失去作用)

 

分享到:
评论

相关推荐

    C#中类成员的定义的修饰关键词知识点总结

    C#中类成员的定义的修饰关键词是指在类中定义成员时使用的关键词,以确定成员的访问权限和行为。这些关键词可以分为两大类:访问修饰符和特殊修饰符。 访问修饰符包括public、private、internal和protected等关键词...

    Java 基础之修饰符关键词整理

    主要有四种:public、private、protected和默认(无修饰符)。 1. public:公共访问修饰符,表示该成员对所有类都是可见的。无论在哪个包内,都可以访问public类、接口、方法或变量。 2. private:私有访问修饰符...

    java修饰符介绍

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

    类的封装(访问修饰符)

    在编程领域,类的封装是...合理使用public、private、protected和默认访问级别,能够有效控制类的接口暴露程度,增强软件的健壮性和可扩展性。在实际编程中,应根据需求灵活运用这些访问修饰符,以实现最佳的封装效果。

    PHP中Private修饰符与Constructor.pdf

    在 PHP 中,访问控制修饰符有三种,即 public、protected 和 private。private 修饰符是访问控制最严格的,修饰的类中成员属性或方法只能在该类的内部访问。 Private 修饰符的作用范围只能是类的内部,对类外面的...

    java关键词打字练习.rar

    3. `protected`: 受保护的访问修饰符,允许同一包内的类以及所有子类访问。 4. `class`: 用于声明类,是面向对象编程的核心。 5. `interface`: 定义接口,提供了一种实现多继承的方式。 6. `void`: 指定方法不返回...

    50个关键字_3个直接量_JAVA的五十个关键词_.zip.zip

    34. `protected` - 访问修饰符,允许子类和同一包内的类访问。 35. `public` - 公共访问修饰符,所有类都能访问。 36. `return` - 从方法中返回值。 37. `short` - 数据类型,表示16位整数。 38. `static` - 修饰符...

    Java中常用修饰符的使用方法汇总

    在Java编程语言中,修饰符是用来控制访问权限和指定类、方法、变量特性的关键词。以下是对Java中常用修饰符的详细解释: 1. **访问修饰符**: - `public`:公共访问修饰符,可以被任何地方的任何代码访问。 - `...

    学习Java时自己整理的知识点_2

    - Java提供了四种访问级别:`public`、`protected`、`default`(也称为包访问)和`private`,用于限制类、变量、方法和构造器的可见性和可访问性。 #### 6. public修饰符 - **可见性**:`public`修饰的成员可以在...

    【SCJP 閱讀筆記 】.doc

    - 也有如`public`、`private`、`static`等访问修饰符,以及`final`、`abstract`等修饰类和方法的关键词。 4. 数据类型及其范围: - 基本数据类型包括`boolean`、`char`、`byte`、`short`、`int`、`long`、`float`...

    50个关键字_3个直接量_JAVA的五十个关键词_

    34. `protected`:受保护访问修饰符,允许子类和同包访问。 35. `public`:公共访问修饰符,允许所有类访问。 36. `return`:从方法返回值,结束方法执行。 37. `short`:定义短整型变量,用于存储小整数。 38. `...

    修饰符

    在编程语言中,修饰符是用于定义类、接口、变量和方法等元素特性的关键词或标识符。在Java中,修饰符起着至关重要的作用,它们帮助开发者控制代码的访问级别、实现多态性以及规范类和方法的行为。本文将深入探讨Java...

    java关键字大全及解释

    32. `protected`: 访问修饰符,允许子类和同一包内的类访问。 33. `public`: 访问修饰符,使得类、接口和成员可以被所有其他代码访问。 34. `return`: 从方法中返回一个值,结束方法执行。 35. `short`: 基本数据...

    第9章作业提交1

    在编程语言中,修饰符是用于控制类、方法或变量的访问权限和特性的关键词。在Java等面向对象的语言中,这些修饰符至关重要,因为它们决定了代码的组织和可访问性。以下是根据提供的标题、描述和部分内容所涵盖的知识...

    java实验报告7.doc

    实验目的是为了让学生掌握类的继承、派生类的定义、方法的重定义以及super和protected关键词的使用。实验环境中,要求每名学生配备装有JDK和Jcreator的电脑。 在实验内容中,首先从已有的Student类为基础,创建了一...

    java面试题总结

    Java中的访问修饰符包括`public`、`private`、`protected`以及默认修饰符,它们用于控制类成员的可见性。 - **public**:表示公开,可以在任何地方访问,无论是在同一包内还是不同包之间。 - **protected**:表示受...

    (完整版)面向对象程序设计试卷及答案.doc

    答:public修饰符的成员可以被所有的类访问,protected修饰符的成员可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问,private修饰符的成员只能被这个类本身访问,...

    C#2008 Keywords

    C# 2008是该语言的一个版本,其关键词对于理解和编写有效的C#代码至关重要。 ### C# 2008 关键词概述 C# 2008 的关键词是指那些由语言本身定义并具有特殊意义的保留字。这些关键词不能用作标识符(如变量名或函数...

    Java:Java 的基础语法

    Java提供了不同类型的修饰符,如访问控制修饰符(default, public, protected, private)和非访问控制修饰符(final, abstract, static, synchronized),这些修饰符用于控制类、方法和变量的访问权限及特性。...

Global site tag (gtag.js) - Google Analytics