SCJP认证 1.5(2) 声明类成员
2011-02-21 22:06
621 查看
公共成员
当一个方法或变量成员声明为public时,就表示所有其他类(无论他们属于哪个包)都能够访问该成员(假设类本身是可见的)。
请看下面的源文件:
现在请看第二个源文件:
可以看出,Goo和Sludge位于不同的包中。然而,Goo能够毫无问题地调用Sludge中的方法,因为Sludge类以及其testIt()方法都被标识为public。
对于子类,如果其超类的成员被声明为public,则该子类就会继承其成员,无论这两个类是否同一个包中:
注意,在前面的代码中,无须在其前面添加引用前缀,即可调用doRooThings()方法。记住:如果看到调用的方法(或者访问的变量)没有点运算符,则表示该方法或变量属于你所看到的代码所在的类。它还指方法或变量整隐含地使用this引用访问。因此,在前面的代码中,Cloo类中队doRooThings()的调用也可以写作this.doRooThings()。this引用总是引用当前正在执行的对象——换句话说,研究生运行this引用代码的对象。因为this引用是隐含的,所以不必将它放在成员访问代码的前面,但是如果加上也不会有什么坏处。一些程序员将其添加上,是为了使代码对新入门(或者完全不懂Java)的Java程序员具有更好的可读性。
除了能够在本身上调用doRooThings()方法之外,其他类的代码也能够像下面的大妈那样调用Cloo实例上的doRooThings():
私有成员
标识为private的成员,不能被声明该私有成员的泪意外的任何类中的代码访问。让我们对前面例子中的Roo类做一个小小的改动:
现在,doRooThings()方法是私有的,因此,其他任何类上都不能使用它。如果试图ongoing其他任何类中调用该方法,就会遇到麻烦:
如果试图编译UserARoo类,则会出现如下编译错误:
cannot find symbol
symbol : method doRooThings()
对Roo类之外的任何代码来说,方法doRooThings()就像不存在一样。情况确实如此。私有成员对该成员自己累之外的任何代码都是不可见的。
子类试图继承其超累的私有成员时会怎么样?当成员声明为私有的时,子类不能继承它。对于考试,要认识到子类不能看到、使用伸着想到起超类的私有成员。然而,可以在子类中声明相同的方法。但是,无论它看起来是什么样子,这绝不是重写方法!它只是彭倩与超类中的私有方法具有相同的名称罢了。重写规则不适用与这种情况。因此,可以对这个新声明的但碰巧名称相同的方法声明信的异常,或者改变其返回类型,或者对其做任何其他事情。
现在,doRooThings()方法对所有子类来说都是禁止访问的,甚至对于那些与其超累在同一个包中的子类也是如此:
如果试图编译子类Cloo,则编译器将产生如下错误:
Cloo.java:4 Undefined method: doRooThings()
System.out.println(doRooThings());
1 error
子类能重写私有方法吗?这是个有趣的问题。但是,从 技术上讲答案为否。因为,向我我们已经看到的,子类不能继承私有方法,因此它不能重写该方法——重写依赖于继承。
当一个方法或变量成员声明为public时,就表示所有其他类(无论他们属于哪个包)都能够访问该成员(假设类本身是可见的)。
请看下面的源文件:
package book; import cert.*; class Goo { public static void main(String[] args){ Sludge o = new Sludge(); o.testIt(); } }
现在请看第二个源文件:
package cert.*; public class Sludge{ public void testId(){ System.out.println("sludge"); } }
可以看出,Goo和Sludge位于不同的包中。然而,Goo能够毫无问题地调用Sludge中的方法,因为Sludge类以及其testIt()方法都被标识为public。
对于子类,如果其超类的成员被声明为public,则该子类就会继承其成员,无论这两个类是否同一个包中:
package cert; public class Roo { public String doRooThings(){ // imagine the fun code that goes here return "fun"; } }
注意,在前面的代码中,无须在其前面添加引用前缀,即可调用doRooThings()方法。记住:如果看到调用的方法(或者访问的变量)没有点运算符,则表示该方法或变量属于你所看到的代码所在的类。它还指方法或变量整隐含地使用this引用访问。因此,在前面的代码中,Cloo类中队doRooThings()的调用也可以写作this.doRooThings()。this引用总是引用当前正在执行的对象——换句话说,研究生运行this引用代码的对象。因为this引用是隐含的,所以不必将它放在成员访问代码的前面,但是如果加上也不会有什么坏处。一些程序员将其添加上,是为了使代码对新入门(或者完全不懂Java)的Java程序员具有更好的可读性。
除了能够在本身上调用doRooThings()方法之外,其他类的代码也能够像下面的大妈那样调用Cloo实例上的doRooThings():
class Toon { public static void main(String[] args){ Cloo c = new Cloo(); System.out.println(c.doRooThings()); //No problem; method is public } }
私有成员
标识为private的成员,不能被声明该私有成员的泪意外的任何类中的代码访问。让我们对前面例子中的Roo类做一个小小的改动:
package cert; public class Roo { private String doRooThings(){ // imagine the fun code that goes here, but only the Roo // class knows return "fun"; } }
现在,doRooThings()方法是私有的,因此,其他任何类上都不能使用它。如果试图ongoing其他任何类中调用该方法,就会遇到麻烦:
package notcert; import cert.Roo; class UseARoo{ public void testIt(){ Roo r = new Roo();//So far so good System.out.println(r.doRooThings());//Compiler error! } }
如果试图编译UserARoo类,则会出现如下编译错误:
cannot find symbol
symbol : method doRooThings()
对Roo类之外的任何代码来说,方法doRooThings()就像不存在一样。情况确实如此。私有成员对该成员自己累之外的任何代码都是不可见的。
子类试图继承其超累的私有成员时会怎么样?当成员声明为私有的时,子类不能继承它。对于考试,要认识到子类不能看到、使用伸着想到起超类的私有成员。然而,可以在子类中声明相同的方法。但是,无论它看起来是什么样子,这绝不是重写方法!它只是彭倩与超类中的私有方法具有相同的名称罢了。重写规则不适用与这种情况。因此,可以对这个新声明的但碰巧名称相同的方法声明信的异常,或者改变其返回类型,或者对其做任何其他事情。
package cert; public class Cloo { private String doRooThings(){ // imagine the fun code that goes here, but no other class // will know return "fun"; } }
现在,doRooThings()方法对所有子类来说都是禁止访问的,甚至对于那些与其超累在同一个包中的子类也是如此:
package cert;//Cloo and Roo are in the same package class Cloo extends Roo {//Still OK superclass Roo is public public void testCloo(){ System.out.println(doTooThings()); //compiler error! } }
如果试图编译子类Cloo,则编译器将产生如下错误:
Cloo.java:4 Undefined method: doRooThings()
System.out.println(doRooThings());
1 error
子类能重写私有方法吗?这是个有趣的问题。但是,从 技术上讲答案为否。因为,向我我们已经看到的,子类不能继承私有方法,因此它不能重写该方法——重写依赖于继承。
相关文章推荐
- SCJP认证范围 1.5 声明类成员
- SCJP认证范围 1.3声明类
- 使用Java 1.5半年了,今天通过SCJP 5.0认证
- SCJP认证 1.5 (3) 声明类成员
- kubernetes1.5新特性:kubelet API增加认证和授权能力
- SCJP认证套题解析之二
- SCJP认证考试题集
- SCJP认证套题解析之一
- SCJP认证套题解析卷1
- SCJP认证 第二章 面向对象 2.4.2重载方法(1)
- SCJP认证套题解析之三
- SCJP认证考试全接触
- 声明一个哺乳动物类Mammal,再由此派生出狗类Dog,二者都定义Speak()成员函数,基类中定义为虚函数,声明类Dog的一个对象,调用函数Speak()
- 在名字空间中声明类和成员函数
- 声明类person,该类定义了两个数据成员,一个带参的构造方法,一个具有两个参数的构造方法,一个方法prin()
- SCJP认证套题解析之一
- SCJP认证套题解析之二
- SCJP认证套题解析卷2
- 怎样拿下SUN公司的SCJP认证?
- 为wp1.5 的Stattraq增加登陆认证