注: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的包访问极限已失去作用
)
转载地址:http://blog.csdn.net/smqjzzm1988/article/details/7564557
相关推荐
`protected`是Java中四种访问权限之一,它在类的封装和继承中扮演着重要的角色。本篇文章将深入探讨`protected`关键字的含义、用法以及它在实际开发中的应用。 1. `protected`的含义: `protected`是一种中级访问...
访问权限修饰符分为四种:public、protected、friendly 和 private。每种修饰符都有其特定的访问权限和使用场景。 一、public 访问权限修饰符 public 访问权限修饰符表明该成员变量和方法是共有的,能在任何情况下...
本文将详细讲解 Java 中的访问限定符,包括 public、private、protected 和默认访问权限的作用域。 public 访问权限 public 访问权限是最宽松的访问权限,表示该成员变量或方法可以被任何类访问,无论它在什么包中...
本文将深入探讨`private`、`public`、`default`(默认)和`protected`这四种访问权限,并通过代码示例来解析它们在实际编程中的应用。 1. `private`权限: `private`是最低级别的访问权限,它限制了成员只能在同一...
Java 中一共有四种访问权限控制,其权限控制的大小情况是这样的:public > protected > default(包访问权限)> private。 1. public 访问权限:所修饰的类、变量、方法,在内外包均具有访问权限。 public 权限是...
在Java编程语言中,访问权限控制是至关重要的一个部分,它确保了代码的封装性和安全性。本主题将深入探讨Java中的访问修饰符及其在源代码中的应用。 首先,Java提供了四种基本的访问权限控制修饰符: 1. **public*...
2. **protected**:受保护的访问权限,允许同一包内的类和所有子类访问。 3. **默认(无修饰符)**:默认访问权限,只允许同一包内的类访问。 4. **private**:私有访问权限,仅限于声明它的类内部访问。 **二、...
* protected:protected访问权限介于public和private之间,protected类、方法和变量可以被同一个包中的类和子类访问。 * default:default访问权限是缺省的,缺省访问权限介于public和protected之间,拥有缺省访问...
protected 访问权限介于两者之间,能够被当前类和其子类访问。default 访问权限是缺省的,能够被当前类和同一个包中的其他类访问。 Java 静态变量 在 Java 中,静态变量是属于类的,而不是对象的。静态变量可以被...
1. protected权限:成员具有protected访问权限,仅能被类本身和其派生类的成员函数访问。在没有派生类的情况下,protected和private成员具有相同的访问属性。 2. 示例4-1展示了protected成员在继承中的访问权限。在...
protected访问权限:在当前类和派生类中可以访问。 public访问权限:在任何地方都可以访问。 internal访问权限:在当前程序集中可以访问。 3. 列举ASP.NET页面之间传递值的几种方式。 ASP.NET页面之间传递值的...
在C++中,类的成员访问权限通常分为三种:`public`(公有)、`protected`(受保护)和`private`(私有)。然而,当涉及到类的继承时,实际上存在第四种访问权限的概念——即所谓的“superprivate”(超私有),虽然...
protected 访问权限表示该成员可以在同一个包或子类中访问,例如 `protected int age;`。public 访问权限表示该成员可以在任何地方访问,例如 `public int age;`。 多个对象的创建 在 Java 中,可以创建多个对象,...
编写一个People类.该类的数据成员有年龄age,身高height,...假设年龄的单位为岁,身高的单位厘米,体重的单位斤,要求所有数据成员为protected访问权限,所有成员函数为public,在主函数中通过对象直接访问类的所有成员函数.
4. protected:protected访问权限介于default和public之间。它允许同一包内的访问,同时也允许不同包中该类的子类访问。这在设计继承结构时非常有用,因为子类可能需要访问或重写父类的某些受保护成员。 在类的成员...
本篇文章将详细探讨`@public`, `@package`, `@private`, 和 `@protected` 这四种访问权限修饰符。 1. **@public** `@public` 访问修饰符表示最高的访问级别,允许任何地方的代码访问该成员,无论是同一个类、子类...
9. protected 访问权限是指只有定义该类所在的包内的类可以访问该类的成员变量和成员方法。 10. 实例变量是类的成员变量,每个对象都有自己的实例变量副本。类变量是在类加载时创建的,在使用之前必须初始化。 11. ...
这种访问权限设计是为了在继承时保持数据的一致性和安全性,允许子类对基类的内部状态进行必要的操作或扩展。 然而,在.NET中,存在一种特殊情况,即`protected private`组合。这种组合在C#中并不常见,但在C++/CLI...