声明:希望大家拍砖,但不要人身攻击
protected:是包和子类可见。但有一个现象很难理解(子类在不同的包中),举个例子。
设计三个类,TObject(基类,其中有个protected void sayHello()方法),TObjectExtends1,TObjectExtends2;
其中TObject和TObjectExtends1在一个包中,TObjectExtends2在另一个包中;
TObjectExtends1和TObjectExtends2继承TObject;然后在TObjectExtends1中运行TObjectExtends2的sayHello()方法。
编译通过,然后运行成功;
然后我在TObjectExtends2中重写了sayHello()方法,权限是protected,然后编译,
编译器报错,试图在TObjectExtends1中调TObjectExtends2中受protected方法;
如果把TObjectExtends2 te2=new TObjectExtends2();改成TObject te2=new TObjectExtends2();改一下声明;又居然可以编译通过了,运行成功;
也就是说在不同包的子类中调用其他子类的protected方法,有可以成功(如果调用的子类没有覆盖父类的protected),也有可能失败,如果都声明成最大的那个超类,那都可以运行了,貌似是编译器的错,
测试代码:
TObject:
package extends1;
public class TObject {
/**
* Method TObject
*
*
*/
public TObject() {
// TODO: Add your code here
}
protected void sayHello(){
System.out.println("TObject");
}
}
TObjectExtends1:
package extends1;
import extends2.*;
public class TObjectExtends1 extends TObject {
/**
* Method TObjectExtends2
*
*
*/
public TObjectExtends1() {
// TODO: Add your code here
}
public static void main(String[] args){
TObject te2=new TObjectExtends2();
te2.sayHello();
// TObjectExtends2 te2=new TObjectExtends2();
// te2.sayHello();编译通不过
}
}
TObjectExtends2:
package extends2;
import extends1.TObject;
public class TObjectExtends2 extends TObject {
/**
* Method TObjectExtends1
*
*
*/
public TObjectExtends2() {
// TODO: Add your code here
}
@Override
protected void sayHello(){
System.out.println("TObjectExtends2");
}
}
分享到:
- 2009-09-09 17:34
- 浏览 1306
- 评论(5)
- 论坛回复 / 浏览 (5 / 1805)
- 查看更多
相关推荐
常用选项包括-c(显示方法的具体字节码)、-public|protected|package|private(指定显示的类成员的访问级别)和-verbose(显示更详细的编译信息)。例如,使用命令:javap -c com.stopTalking.test.JavacTest,可以...
- Java开发工具Javac、Java和Javadoc的使用 - 第一个Java程序"Hello, World!" 2. **ch02** - 基本语法与数据类型 - 关键字、标识符和注释 - 变量声明与赋值 - 数据类型:整型、浮点型、字符型、布尔型 - ...
* -protected 选项用于只显示 protected 和 public 类及成员。 * -package 选项用于只显示包、protected 和 public 类及成员。 * -private 选项用于显示所有类和成员。 * -J 选项用于直接将flag 传给运行时系统。 * ...
我们知道,Java是一种跨平台的编程语言,其源码(.java文件)被编译成与平台无关的字节码(.class文件),然后在运行期动态链接。这样,编译后的类文件中将包含有符号表,从而使得Java程序很容易被反编译。相信每一个...
- **protected方法**:即使子类与父类不在同一包内,子类也可以继承父类的`protected`方法。 - **默认方法**:不在同一包内的子类无法继承父类的默认权限(包级访问权限)方法。 **6. 类变量与实例变量的区别** - ...
-scramble:protected 对所有private, package private, protected元素进行混淆 -scramble:public 对所有的元素都进行混淆 -scramble:all 相当于-scramble:public 如果使用-scramble不带级别参数,则相当于-...
* -protected:只显示受保护的和公有的类及成员。这是缺省状态。 * -package:只显示包、受保护的和公有的类及成员。 * -private:显示所有类和成员。 * -help:显示联机帮助,它将列出这些 javadoc 和 doclet ...
我们知道,Java是一种跨平台的编程语言,其源码(.java文件)被编译成与平台无关的字节码(.class文件),然后在运行期动态链接。这样,编译后的类文件中将包含有符号表,从而使得Java程序很容易被反编译。相信每一个...
5. **包与导入**:包的概念,import语句的使用,理解public、protected、package-private、private的访问权限。 6. **内存管理**:垃圾回收机制,对象的生命周期,引用类型的区别(强引用、软引用、弱引用、虚引用)...
- `-protected`:显示protected和public类和成员。 - `-package`:显示包、protected和public类和成员(默认)。 - `-private`:显示所有类和成员。 - `-J`:将标志直接传递给运行时系统。 - `-classpath`:...
3. 多类编译:如果源文件中有多个类,用`javac`编译会产生与每个类同名的`.class`文件。 十一、Unicode字符 4. char类型:Java的`char`类型使用Unicode编码,可以表示各种字符。 以上知识点涵盖了Java基础语法、...
在 Java 中,每个类都必须有一个公共的 `public` 关键字修饰,除非它被其他访问修饰符(如 `private` 或 `protected`)所覆盖。此外,构造方法的名字应与类名相同,并且没有返回类型,即使是 `void` 也不行。在提供...
- **访问修饰符**:Java提供四种访问级别:`public`(公开)、`protected`(受保护)、`default`(默认,即无修饰符)、`private`(私有)。它们分别控制了类、成员方法和变量的可见范围。 - **变量命名规则**:变量...
1. 不能用 private、protected 和 static 修饰 interface。 2. call by value 不会改变实际参数的数值,而 call by reference 能改变实际参数的内容。 3. 在类方法中不能调用实例方法,但可以调用本类的类方法。 ...
10. **访问修饰符**:`public`, `private`, `protected`和默认修饰符控制类、方法和变量的访问权限。 11. **类的继承与可见性**:题目涉及类的继承关系,以及类、接口和公共类的声明。 12. **I/O流**:Java的输入/...
使用`javac`命令可以编译Java源代码。 3. 主方法是Java程序的入口点,必须声明为`public static void main(String[] args)`,访问控制修饰符为`public`。 4. 在Java中,定义常量通常使用`final`修饰符,而不是C++中...
JDK包含了Java编译器`javac`,这是将源代码编译成可执行字节码的工具。 - 确保`JAVA_HOME`环境变量已经正确设置,并且`javac`命令在命令行中可被调用。 2. **Servlet API**: - Servlet API是Java EE的一部分,...
6. interface 不能被 private、protected 和 static 修饰。 总结 本文档涵盖了 Java 语言的基础知识、数据库知识和编程实践等方面,是一个非常有用的资源,对于 Java 开发者和面试者都是非常有价值的参考资料。