- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑以下代码。
A.java,主包:
package pkgs.main;
public class A {
protected int x;
}
B.java,测试包:
package pkgs.test;
import pkgs.main.A;
public class B extends A {
}
当 javac 编译器运行时,它会做一些大致如下的事情吗:
A.java,主包:
package pkgs.main;
public class A {
protected int x;
}
B.java,测试包:
package pkgs.test;
import pkgs.main.A;
public class B extends A {
// Some "flag/code" that says:
// Must be aware that the following new and seperate copy of x
// has originated from class A, which is inside a package called main.
protected int x;
}
我问的原因是我试图了解子类是否必须了解其继承成员的所有“特性/属性”才能运行是否必不可少。如果这是真的,那么这种编程继承与“现实世界”中的继承会略有不同吗?例如,我从 parent 那里继承了各种属性(property),但我可以完全不知道所有这些信息。 (比如说,如果我的 parent 去世了,我可以继续经营。)然而,我想知道 Java 的继承在这个意义上是否不是独立的,如果一个子类必须始终知道它从哪里得到它的继承成员,在才能正确运行。
问题是,在阅读编程书籍中有关继承的内容时,我感到很困惑。他们提供了涉及真实世界对象的示例,例如动物和猫狗等,但是根据上面的段落,我想知道 Java 继承与 Java 书籍中涉及这些类型的继承示例之间是否存在细微的“机制差异”现实世界中的物体。
我在使用 Java 时遇到的问题是我不明白为什么允许我执行以下操作。下面的代码是“主类”中的一些简单“调用代码”,涉及上面已经定义的两个类(A 和 B)。
Main.java,主包:
package pkgs.main;
import pkgs.test.B;
// Just some method inside the "main class"
void method() {
B b = new B();
b.x ++; // <--- why is this allowed?
}
这个“调用代码”在一个名为 main 的包中,而类 B 在另一个名为 test 的包中定义。这段调用代码没有扩展类 B,那么为什么 Java 允许访问 B 的 protected 成员 x?
解释是因为 protected 成员 x 最初是在类 A 中声明的,它与调用代码在同一个包中吗?如果是真的,这是否与我之前的想法大致相符,我在其中谈到了 B 类:
public class B extends A {
// Some "flag/code" that says:
// Must be aware that the following new and seperate copy of x
// has originated from class A, which is inside a package called main.
protected int x;
}
最佳答案
What does the Java compiler do when it sees the keyword extends?
你的情况没有。
This calling code is not extending class B, so why does Java allow access to B's protected member x?
这是关于可访问性的。根据 Java 语言规范(参见 JLS7:http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf)
6.6.1 Determining Accessibility
...
Otherwise, if the member or constructor is declared protected, then access is permitted only when one of the following is true:
Access to the member or constructor occurs from within the package containing the class in which the protected member or constructor is declared.
Access is correct as described in §6.6.2.
...
您可以从同一个包访问 protected 字段“x”。但是,如果您在类“B”(隐藏“A.x”)中声明一个新字段“x”,则您无法访问“x”(格式为 b.x++;
)包“主要”。
关于java - 当 Java 编译器看到关键字 extends 时会做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23153373/
如何获取特定 UTF-8 字符串的字节序列?我看到正则表达式引擎中的某些错误仅在某些边缘情况下才会触发,我想确切地知道它正在处理哪些数据。 最佳答案 也许 charToRaw ? > charToRa
考虑一个具有许多变量的 java 程序,其中一些是循环计数器,我希望看到这些变量随时间变化的值,而不是在代码中到处放置 print 语句。 为什么?我认为它可以帮助我轻松调试。 Example- in
有没有办法查看 JavaScript 正在创建的“线程”?例如,如果我有一个附加到 DOM 元素的事件处理程序,我假设 JavaScript 会隐式地创建一个新线程来在后台运行该代码?如果是这样,有没
我正在使用反射 API 来调用类运行时并调用其方法。但我看到 java.lang.reflect.InitationTargetException 异常。 我需要调用一个名为 - TestClass
考虑一个名为 t.cmd 的命令脚本,它只包含以下两行: @exit /b 123 @echo If you see this, THEN EXIT FAILED.. 因此,该脚本只是将脚本执行过程的
我最近一直在努力学习编程语言实用学第 3 版,以了解更多关于语言在底层如何工作的信息,并且通过查看由真正基本的 GCC 编译的 C 代码生成的程序集,我获得了很多进展.我开始对 C 系列的静态语言越来
最简单的制作方法是什么QWebView识别并正确加载网页上的 Flash? 最佳答案 似乎只需两行即可实现(当然,假设目标系统上安装了闪存): QWebSettings *settings = QWe
我想通过编程(使用VBA)访问其他人与我共享的日历。它们在我的Outlook中的“人民日历”下列出。我在网上搜索了此内容,所有建议所做的仅使我感到困惑。如何从“人的日历”中获取共享给我的所有日历的
使用MongoDB Compass,可以看到数据库用户或创建新用户吗? 最佳答案 香港专业教育学院在命令行上使用以下命令进行管理: mongo use (my database name) db.cr
我正在CentOS 7.4.1708(核心),Java(TM)SE运行时环境(内部版本1.8.0_152-b16)上运行eXist-db 3.6.1。我希望能够在person.xml中的最后一个记录之
我需要确认。 客户端 1 在事务内的表中插入行。 客户端 2 使用 SELECT 请求该表。如果在此客户端上隔离级别设置为 READ COMMITTED,您能否确认 SELECT 不会返回客户端 1
我刚刚安装了 python-dev: $ sudo apt-get install python-dev 这样我就可以开始使用 P4Python 了。但是当我尝试导入 P4 时,我得到: Traceb
我正在使用 msys 和 mingw 编译 libtorrent-rasterbar-0.16.16。./configure 运行良好,直到它进入 boost 库检查。我有 boost 1.51,我设
我在 GO 项目的 Travis CI 上有一个奇怪的行为。 [这里] 失败了,提示一个函数只接受 1 个参数并用 2 个参数调用。 src/finances-service/main.go:45:1
这个问题已经有答案了: What are enums and why are they useful? (27 个回答) 已关闭 4 年前。 作为 Java 初学者,我接触到了枚举,这让我对类型声明感
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我正在使用 preactjs 创建我的应用程序。最重要的是,我正在使用剑道网格。在网格内,我想显示一个超链接。如果用户点击链接,它应该改变路线。为了呈现链接,我使用了 preact-router。 这
有没有办法只查看 Node.js 中的函数签名?我知道 fn.toString() 但不需要所有代码,只需要签名。 最佳答案 var source = fn.toString(); var signa
如何设置 vim 以查看我在 ubuntu 上安装的 ruby rvm。 rvm 已安装,ruby 从终端返回。 renshaw@renshaw-TravelMate-5740G:~$ ruby
我试图在我的 Android 应用程序中防止 OutOfMemoryError。我已经阅读了很多帖子,但我仍然无法解决。 该应用程序有后台 Activity ,所以我认为这是主要问题。 OutOfMe
我是一名优秀的程序员,十分优秀!