Modifier Class Package Subclass World
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N
Run Code Online (Sandbox Code Playgroud)
public class a {
protected int x;
}
public class b {
b() {
a A=new a();
A.x=9;//why we can access this field ?
}
}
Run Code Online (Sandbox Code Playgroud)
请帮助我了解Java中受保护的具体工作
是否可以使用PHP Mockery模拟受保护的属性?
我得到了一个带有方法的类,我将其称为"a",它在从同一个类的受保护属性中检索的数组上做了一些魔术.
受保护的属性由另一个方法填充b
,在同一个类中.
我想a
通过模拟受保护的属性来测试方法,所以我不必b
首先使用类方法.
这可能吗?如果没有,我应该重构我的代码吗?或者还有其他方法(考虑最佳实践).
我得到一个编译错误,我有点困惑.这是在VS2003上.
错误C2248:'A :: y':无法访问在类'A'中声明的受保护成员
class A
{
public:
A() : x(0), y(0) {}
protected:
int x;
int y;
};
class B : public A
{
public:
B() : A(), z(0) {}
B(const A& item) : A(), z(1) { x = item.y;}
private:
int z;
};
Run Code Online (Sandbox Code Playgroud)
问题是x = item.y;
访问权限被指定为受保护.为什么B类的构造函数不能访问A :: y?
Test.java
package a;
import b.B;
public class Test {
public static void main(String[] v) {
new A().test();
new B().test();
}
}
Run Code Online (Sandbox Code Playgroud)
A.java:
package a;
public class A {
protected void test() { }
}
Run Code Online (Sandbox Code Playgroud)
B.java:
package b;
public class B extends a.A {
protected void test() { }
}
Run Code Online (Sandbox Code Playgroud)
为什么会new B().test()
出错?这不会破坏可见性规则吗?
B.test()
是不可见的,Test
因为它们在不同的包中,但它拒绝调用可见的test()
in B
超类.
将赞赏与JLS的适当部分的链接.
对.今天我花了三个多小时试图理解为什么你不能在保护模式下调用bios ISR.我得到的一旦你设置和IDT它不一定是在通常的地址为IVT加段没有固定的大小在保护模式等.但我仍然不明白为什么不能你jsut创建一个4GB段,将您的IDT段映射到BIOS IVT,将所有内容设置为0,然后调用它们.不应该那样吗?
大多数文章要么说:"记住你不能在保护模式下使用BIOS中断!" 没有探索主题或极具描述性和引用陷阱,例外,图片重新制作,缺乏权利和段记录的问题作为其背后的原因.
如果有人能够提出一个更人性化的解释,那将是非常有帮助的...我不怀疑文章所说的内容,我只是想明白为什么会这么"痛苦"!
提前致谢!
这段代码:
class B {
protected:
void Foo(){}
}
class D : public B {
public:
void Baz() {
Foo();
}
void Bar() {
printf("%x\n", &B::Foo);
}
}
Run Code Online (Sandbox Code Playgroud)
给出了这个错误:
t.cpp: In member function 'void D::Bar()':
Line 3: error: 'void B::Foo()' is protected
Run Code Online (Sandbox Code Playgroud)
顺便说一下:这看起来很相关,但是我正在寻找一个参考指标或类似内容的地方(希望这将导致如何按照我期望的方式工作).
MSDN上的C#语言参考将"protected internal"定义为"Access仅限于当前程序集或从包含类派生的类型".但是从语义的角度来看,"受保护的内部"听起来像'受保护和内部',这意味着成员只能在同一个程序集中访问那些派生类.是否存在具有相同效果含义的访问修饰符?
我有一个在某个类中定义的受保护函数.我希望能够在另一个函数中将该受保护函数调用到类之外.这是可能的,如果是这样,我怎么能实现它
class cExample{
protected function funExample(){
//functional code goes here
return $someVar
}//end of function
}//end of class
function outsideFunction(){
//Calls funExample();
}
Run Code Online (Sandbox Code Playgroud) 我在两个不同的包中有两个类:
package package1;
public class Class1 {
public void tryMePublic() {
}
protected void tryMeProtected() {
}
}
package package2;
import package1.Class1;
public class Class2 extends Class1 {
doNow() {
Class1 c = new Class1();
c.tryMeProtected(); // ERROR: tryMeProtected() has protected access in Class1
tryMeProtected(); // No error
}
}
Run Code Online (Sandbox Code Playgroud)
我可以理解为什么在调用时没有错误,tryMeProtected()
因为Class2
它继承了这个方法Class1
.
但是,为什么是不是有可能的对象Class2
访问此方法的对象上Class1
使用 c.tryMeProtected();
?
公共继承很容易.
答:公共B意味着每个A都是B.在大多数编程语言中,如vb.net和objective-c,这是唯一的继承类型.
私人继承也很容易,但毫无意义
答:私人B意味着A由B实现.但是,这是毫无意义的,因为这意味着A应该包含B. 所有权意味着更少的耦合,没有缺点.
然后我们有保护继承.
任何人都可以向我解释这到底是为了什么?有人说这是"作为一种关系".我还不是很清楚.
有没有人有一些样本案例,人们使用受保护的继承以良好的模式(和良心)实际生产用途?