关于protected在子类创建父类对象无法访问父类protected方法或成员

子类(父类的外部包)中访问父类的protetcted属性或者方法,是不可以通过创建父类对象调用的。
注意:此处不讨论同包下的父类子类,因为同包下所有类都可访问protected属性或者方法。

请参见Java官方文档:Chapter 6. Names中的6.6.2.1. Access to a protected Member
具体例子如下:

父类C:在包c下

1 package c;
2 public class C {
3   protected int id;
4   protected void test() {
5
6   }
7 }

子类S:在包s下

 1 package s;
 2 import c;
 3 import q;
 4 import t;
 5 public class S extends C {
 6 void accessProtected() {
 7   //C中的protected仅允许其子类S内部访问
 8   id = 5;
 9   test();
10   //此外通过E.id访问(在C子类S的内部),则E必须是S或者S的子类(注意不是C)
11   S s = new S();
12   s.id = 6;
13   s.test();
14
15   Q q = new Q();
16   q.id = 5;
17   q.test();
18
19   //此外通过E.id访问(在C子类S的内部),则E必须是S或者S的子类(注意不是C)
20   //所以c.id不可访问
21   // C c = new C();
22   // c.id;
23   // c.test();
24
25   //此外通过E.id访问(在C子类S的内部),则E必须是S或者S的子类(注意不是C)
26   //所以t.id不可访问
27   // T t = new T();
28   // t.id;
29   // t.test();
30   }
31 }

S的子类Q,包q下

package q;
import s;
public class Q extends S{

}

C的子类T,包t下

package t;
import c;
public class T extends C {

}
时间: 2024-10-09 00:30:16

关于protected在子类创建父类对象无法访问父类protected方法或成员的相关文章

在子类中,一定要访问父类的有参方法?

abstract class Person{ private int age; private String name; public Person(int age,String name){ this.age=age; this.name=name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name

类实例化对象可以访问静态(static)方法,但是不能访问静态属性。

类-> 访问->静态方法(类的方法)->可以 类 ->访问->普通方法(对象的方法)->不可以(虽然方法里不用$this关键字时,可以!但不支持这种写法) 类->对象访问>静态方法(类的方法)->可以 class run{ static function rrun() { var_dump("我在跑步"); } public static $name="小花";} run::rrun(); echo run::$

关于继承(子类对象与父类对象【相互转换】的过程)

<1> using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace list { class A { } class B : A { public A MyMthod() { //你想想看这个MyMthod()方法的返回值类型明明是A类型,为什么这里返回一个B类型对象也不报错呢? return new B(); //因为B类型是A类型的子类,子类对象可以隐式的转换

当构造一个对象的时候,系统先构造父类对象,再构造子类对象

当构造一个对象的时候,系统先构造父类对象,再构造子类对象. 构造一个对象的顺序:(注意:构造父类对象的时候也是这几步) ① 递归地构造父类对象: ② 顺序地调用本类成员属性赋初值语句: ③ 本类的构造方法. 1 package TomText; 2 3 public class TomText_17 { 4 /* 5 * 顺序输出数组里的值 6 */ 7 public void printArray(int[] i) { 8 for(int m=0;m<i.length;m++) { 9 Sys

三种创建XMLHttpRequest对象的方法

XMLHttpRequest对象,也就是Ajax交互的核心对象. 这里列举三种创建Ajax对象的方法. 第一种: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples&

验证当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。

结果:当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行.

用父类对象给子类对象赋值数据

在写毕业设计的时候遇到了一些小问题,当创建一个VO类的时候,继承原先的PO类再添加新的属性比较快捷方便,但是将PO类转换成VO类就会需要先get再set所有属性.虽然说是面向ctrl+c.ctrl+v编程,但是还是想偷懒,所以有了以下代码: /** * 将父类对象的属性值转储到子类对象中,仅限于get(is)方法set方法规范且并存,更适用于数据库实体类,不适用于功能性类 * @param <T> * @param son 子类对象 * @param father 父类对象 * @throws

Java父类对象调用子类实体:方法重写与动态调用

众所周知Java的handle和C++的ponter而不是object对应,我们很熟悉C++的父类pointer调用子类实体的例子,那么对于Java的handle是不是也可以这样呢? 这里我先给一个例子 class Father{ public void announce(){ System.out.println("Father"); } } class Child extends Father{ @Override public void announce(){ System.ou

子类用一个名为subitems的数组属性保存父类对象,为什么不能获取父类对象的信息呢???在main函数中subitems为空,不知道为什么。

main.m如下 1 #import <Foundation/Foundation.h> 2 #import "BNRContainer.h" 3 int main(int argc, const char * argv[]) { 4 @autoreleasepool { 5 6 //创建一个NSMutableArray对象,并用items变量保存该对象的地址 7 BNRContainer *items = [[BNRContainer alloc] init]; 8 fo