- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是一个 protected 继承问题。我确实理解 protected 意味着在一个包中,就好像它是公开的一样。在包之外,一般来说,只有在子类内部时才能访问它。那不是我的困惑。我的困惑在于正在发生的一个小问题,我不知道为什么。我将在代码之后解释问题的内容。您将获得包含 TestA 类的包 com.wobble.foo 和包含扩展类 A 的 TestB 类的 com.wobble.bar。
//A Package
package com.wobble.foo;
public class TestA{
static protected int x = 5;
protected int y = 6;
}
//A different Package
package com.wobble.bar;
public class TestB extends TestA{
static{
TestA t = new TestA();
t.x = 1; //compiles
t.y = 2; //field not visible, fails to compile
}
}
父类(super class)有两个 protected 变量,一个是静态变量。不同包中的子类创建了一个新的父类(super class)对象,试图访问这两个变量。为什么您可以通过对象访问静态变量,但不能通过它访问实例变量?他们都受到保护。都来自同一个类(class)。两者都由同一个对象访问。请注意,对于那些认为这可能是重复的人:其他问题只是询问 protected 如何工作,但他们没有提出具体问题,即为什么这两个变量中只有一个是 protected ,可以访问。
这不是一个如何修复代码的问题。我知道如何让游戏结束。问题是为什么它可以通过 t.x;
而不是 t.y;
访问?
最佳答案
t.x = 1; //compiles
这是一个static
字段。所以你应该把它写成 TestA.x
(会有一个编译器警告)。
静态保护字段可以从子类的静态代码中访问(或从非静态代码中访问)。
t.y = 2; //field not visible, fails to compile
这是一个实例字段。 protected 实例字段可以从子类的实例方法中访问。但只能从这些方法中进行。您不能从静态方法调用它们(即使该静态方法恰好位于子类中)。
如果您需要从另一个类中的静态方法访问这些字段,您需要将该字段公开或将需要它的代码移到同一个包中。
But only from within those methods.
并且只有当您可以确定所讨论的实例实际上来自您自己的类时。
在你的例子中
TestA t = new TestA();
t.y = 2;
t.y
不可见,因为 TestB
中的代码无法访问 TestA
实例上的 protected 字段。 It needs to be an instance of TestB
.不过,相同的代码可以在 TestA
的方法内部运行。
以下也不起作用:
// in TestB
void boo(TestA someInstance){
this.y = someInstance.y;
// does not compile, because someInstance.y is not visible
// because it could be from unknown TestC
}
Ok that makes sense but then how can I access t.x? It is a protected member too and I am still not t.
实例 t
在这里根本没有使用(它是 could even be null
并且代码仍然有效)。静态方法仅在变量的编译时(声明的)类型上分派(dispatch)。理想情况下,t.x
should not even be allowed ,但至少您会收到编译器警告。
it is static so technically you aren't accessing it via the superclass, but through the subclass? i.e. t.x -> x -> TestB.x which gets it via TestB?
静态方法不能被子类覆盖。 TestB.x
只是一种令人困惑(或方便,取决于您如何看待它)的编写 TestA.x
的方式。您可以将其视为子类自动从父类导入所有(公共(public)和 protected )静态字段和变量。减少击键次数,但不会改变行为(当然与实例方法有很大不同,实例方法是在实际实例类型上动态调度的)。
无论哪种方式,因为 TestA.x
是 protected ,它可以被 TestA
的子类中的静态代码块访问,包括 TestB
。
关于java - 一个 protected 变量是可访问的,而另一个则不可访问。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55202569/
这个问题在这里已经有了答案: How to make a property protected AND internal in C#? (8 个答案) 关闭 9 年前。 我需要声明一个既受又 内部保
我有以下代码: class Base{ protected val alpha ="Alpha"; protected def sayHello = "Hello"; } class
我正在尝试运行一个宏来创建一个工作正常的pdf。 Excel 文件获得签名后,Excel 文件将自动受到保护。 问题:我的工作表上有一个按钮,需要按下该按钮才能创建 pdf 文档网。然而,这是无法完成
子类需要能够使用种子随机数生成器。 使用的优点和缺点是什么 public abstract class AbstractClass { protected Random rnd; public
我们有两个类(class)(A 和 B)。 A类只能由继承它的类创建(A类)B 类可以由用户创建。 A 类,版本 1 有一个private 数据成员,并且有方法访问 A 类中的数据。 A 类,版本 2
当父类受到保护时,我对继承类的默认构造函数有疑问,在我看来,子类也会有一个默认构造函数受到保护,但事实并非如此。 除了在子类上强制默认构造函数外,还有其他方法可以强制保护默认构造函数吗? C++11
我有一个抽象类,我想在其 protected 构造函数中初始化一个只读字段。我希望这个只读字段在派生类中可用。 按照我将所有字段设为私有(private)并公开属性的习惯,我实现如下: abstrac
我在运行大数据时遇到错误。错误已由以下示例示例解释 加载数据 mdata <- as.matrix(read.table('https://gubox.box.com/shared/static
我在获取 时遇到问题非法访问错误 对于以下示例: 我在名为 arch 的 gradle 模块中声明了一个基类 abstract class BaseClass { protected abst
我相信通过 实现 JSF 应用程序的安全性+ + & 通过使用 是两种不同的方式!?他们是吗? 我尝试通过上述第一种方法(使用 + + )来实现安全性,但发现使用 protected 和不
有没有办法确定以下的二传手能见度差异: public Prop { get; protected set; } protected Prop { get; set; } 使用反射?还是那些与 C# 反
我读了一本关于 OOP 的书,并且关于“ protected ”访问修饰符的示例对我来说很奇怪。 例子总结 这个例子是为了测试“protected”保留字对变量的影响。 ClassA 有 2 个 pr
内部——在集会上公开,在其他地方私有(private)。 protected - 只有派生类可以访问父类成员。 Protected internal - protected OR internal -
我有一个类代表 Wicket 中带有“返回”、“前进”和“取消”按钮的基本页面。但并非所有页面都有所有按钮,例如。 G。第一页明显没有“返回”。 我的想法是定义一个通用的ActionHandler p
在了解到嵌套类是嵌套类的成员并因此可以完全访问嵌套类的成员这一事实后(至少对于 C++11,请参见 here),我在尝试创建嵌套类模板: #include using namespace std;
我刚刚使用了 Resharper,并一直在尝试将字段转换为属性。我希望这些属性受到保护,但 Resharper 不想给我这个选项。相反,只有一个 protected 内部选项。这让我思考。要么某处有一
这是 question 的扩展一个小时前问过。 当覆盖派生类中的虚方法时,我们不能修改访问修饰符。考虑 System.Web.UI 命名空间中的 Control 类 public class Cont
有人可以解释一下 C# 中 protected 和 protected internal 修饰符之间的区别吗?看起来他们的行为是相同的。 最佳答案 “protected internal”访问修饰符是
我想知道下面两行代码之间是否有区别: protected $var = null; protected $var; 我已经看到两者都被使用了,我想知道这是否只是一个偏好问题,(也就是 $var; 将变
我正在尝试使用mockito为“另存为”操作编写单元测试。该操作的一部分是制作并显示一个文件对话框,用户可以在其中输入要保存的文件。选择文件不是我可以自动化的操作,因此我想模拟 FileDialog
我是一名优秀的程序员,十分优秀!