作用域 当前类 同一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#中类成员的定义的修饰关键词是指在类中定义成员时使用的关键词,以确定成员的访问权限和行为。这些关键词可以分为两大类:访问修饰符和特殊修饰符。 访问修饰符包括public、private、internal和protected等关键词...
主要有四种:public、private、protected和默认(无修饰符)。 1. public:公共访问修饰符,表示该成员对所有类都是可见的。无论在哪个包内,都可以访问public类、接口、方法或变量。 2. private:私有访问修饰符...
在Java编程语言中,修饰符是用来限制或指定代码元素(如类、方法、变量)的访问权限、特性或行为的关键词。以下是对标题和描述中提及的Java修饰符及其相关知识点的详细介绍: 1. 类的访问控制修饰符: - **public*...
在编程领域,类的封装是...合理使用public、private、protected和默认访问级别,能够有效控制类的接口暴露程度,增强软件的健壮性和可扩展性。在实际编程中,应根据需求灵活运用这些访问修饰符,以实现最佳的封装效果。
在 PHP 中,访问控制修饰符有三种,即 public、protected 和 private。private 修饰符是访问控制最严格的,修饰的类中成员属性或方法只能在该类的内部访问。 Private 修饰符的作用范围只能是类的内部,对类外面的...
3. `protected`: 受保护的访问修饰符,允许同一包内的类以及所有子类访问。 4. `class`: 用于声明类,是面向对象编程的核心。 5. `interface`: 定义接口,提供了一种实现多继承的方式。 6. `void`: 指定方法不返回...
34. `protected` - 访问修饰符,允许子类和同一包内的类访问。 35. `public` - 公共访问修饰符,所有类都能访问。 36. `return` - 从方法中返回值。 37. `short` - 数据类型,表示16位整数。 38. `static` - 修饰符...
在Java编程语言中,修饰符是用来控制访问权限和指定类、方法、变量特性的关键词。以下是对Java中常用修饰符的详细解释: 1. **访问修饰符**: - `public`:公共访问修饰符,可以被任何地方的任何代码访问。 - `...
- Java提供了四种访问级别:`public`、`protected`、`default`(也称为包访问)和`private`,用于限制类、变量、方法和构造器的可见性和可访问性。 #### 6. public修饰符 - **可见性**:`public`修饰的成员可以在...
- 也有如`public`、`private`、`static`等访问修饰符,以及`final`、`abstract`等修饰类和方法的关键词。 4. 数据类型及其范围: - 基本数据类型包括`boolean`、`char`、`byte`、`short`、`int`、`long`、`float`...
34. `protected`:受保护访问修饰符,允许子类和同包访问。 35. `public`:公共访问修饰符,允许所有类访问。 36. `return`:从方法返回值,结束方法执行。 37. `short`:定义短整型变量,用于存储小整数。 38. `...
在编程语言中,修饰符是用于定义类、接口、变量和方法等元素特性的关键词或标识符。在Java中,修饰符起着至关重要的作用,它们帮助开发者控制代码的访问级别、实现多态性以及规范类和方法的行为。本文将深入探讨Java...
32. `protected`: 访问修饰符,允许子类和同一包内的类访问。 33. `public`: 访问修饰符,使得类、接口和成员可以被所有其他代码访问。 34. `return`: 从方法中返回一个值,结束方法执行。 35. `short`: 基本数据...
在编程语言中,修饰符是用于控制类、方法或变量的访问权限和特性的关键词。在Java等面向对象的语言中,这些修饰符至关重要,因为它们决定了代码的组织和可访问性。以下是根据提供的标题、描述和部分内容所涵盖的知识...
实验目的是为了让学生掌握类的继承、派生类的定义、方法的重定义以及super和protected关键词的使用。实验环境中,要求每名学生配备装有JDK和Jcreator的电脑。 在实验内容中,首先从已有的Student类为基础,创建了一...
Java中的访问修饰符包括`public`、`private`、`protected`以及默认修饰符,它们用于控制类成员的可见性。 - **public**:表示公开,可以在任何地方访问,无论是在同一包内还是不同包之间。 - **protected**:表示受...
答:public修饰符的成员可以被所有的类访问,protected修饰符的成员可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问,private修饰符的成员只能被这个类本身访问,...
C# 2008是该语言的一个版本,其关键词对于理解和编写有效的C#代码至关重要。 ### C# 2008 关键词概述 C# 2008 的关键词是指那些由语言本身定义并具有特殊意义的保留字。这些关键词不能用作标识符(如变量名或函数...
Java提供了不同类型的修饰符,如访问控制修饰符(default, public, protected, private)和非访问控制修饰符(final, abstract, static, synchronized),这些修饰符用于控制类、方法和变量的访问权限及特性。...