scjp
写博客这几天终于有朋友回帖了,心里高兴。下面学习默认的构造方法、方法的重载和覆写,以下代码可以直接在MyEclipse中运行,到最后我会把中间写的所有代码打包放出来,敬请关注。
package operation; class ConsBase { ConsBase(int i) { System.out.println("single int constructor"); } /** * 如果你没有显式定义任何构造方法,编译器会插入一个“后台”的不可见的无参数的构造方法。 * 如果你自己创建了构造方法,java 就不支持默认的无参数的构造方法了。 * 可以通过在Base 类中创建一个“什么都不干”的零参数构造方法来修复这个错误。 */ ConsBase() {// 构造器有和类同样的名字并且没有返回值 System.out.println("ConsBase"); // 当类的实例被创建时打印字符串“ConsBase”: } public void aBaseMethod(){ System.out.println("Base.amethod"); } } /** * @author 木炭 * 程序最后输出:ConsBase 换行 Cons */ public class Cons extends ConsBase { /** * @param args */ public static void main(String args[]) { // ConsBase c = new ConsBase(); Cons s = new Cons(); } Cons() { System.out.println("Cons"); } /** * @param iOver * 如果一个类中的两个或者多个方法有同样的名字,就被称为方法重载。 * 你可以在一个类中有两个同样名字的方法,但是他们必须有不同的参数类型和顺序。 * 返回值的类型不能帮助区分两个方法。下面第二个参数相同的方法将导致编译时错误。 */ public void amethod(int iOver){ System.out.println("Cons.amethod"); } /* public int amethod(int iOver){ System.out.println("Cons int return method"); return 0; }*/ //正确的重构 public int amethod(String iOver){ System.out.println("Cons int return method"); return 0; } //你可以在一个子类中重载一个方法,所需要的就是新方法有不同的参数顺序和类型。 //static 方法不能被重写。 public void aBaseMethod(){ System.out.println("重写aBaseMethod成功"); } }
问题 ) 给定下面的类定义
class Base{
Base(int i){}
}
class DefCon extends Base{
DefCon(int i){
//XX}
}
如果将标记//XX 的地方替换为下面的行,哪一行是独立合法的?
1) super();
2) this();
3) this(99);
4)super(99);
答案 4) super(99);
由于类Base 定义了一个构造方法,编译器将不会插入默认的0 参数的构造方法。因此,super()
的调用会引起一个错误。一个this()调用试着在当前类中调用一个不存在的0 参数构造方法,
this(99)调用会引起一个循环引用并将引起一个编译时错误。
问题 )下面的哪一句陈述是正确的?
1) The default constructor has a return type of void
2) The default constructor takes a parameter of void
3) The default constructor takes no parameters
4) The default constructor is not created if the class has any constructors of its own.
答案
3) The default constructor takes no parameters
4) The default constructor is not created if the class has any constructors of its own.
选项1 相当明显,因为构造方法不会有返回类型。选项2 不容易确定,Java 没有为方法或构
造方法提供void 类型。
问题 )给定下面的类定义
public class Upton{
public static void main(String argv[]){
}
public void amethod(int i){}
//Here
}
下面哪一个在替换//Here 后是合法的?
1) public int amethod(int z){}
2) public int amethod(int i,int j){return 99;}
3) protected void amethod(long l){ }
4) private void anothermethod(){}
答案
2) public int amethod(int i, int j) {return 99;}
3) protected void amethod (long l){}
4) private void anothermethod(){}
选项1 由于两个原因不会被编译。第一个相当明显,因为它要求返回一个integer。
另一个是试着直接在类内部重新定义一个方法。把参数的名字从i 换成z 是无效的,类型没有变。
并且一个方法不能在同一个类里重写。
问题 )给定下面的类定义
public class ShrubHill{
public void foregate(String sName){}
//Here
}
下面的哪一个方法可以合法的直接替换//Here?
1) public int foregate(String sName){}
2) public void foregate(StringBuffer sName){}
3) public void foreGate(String sName){}
4) private void foregate(String sType){}
答案
2) public void foregate(StringBuffer sName){}
3) public void foreGate(String sName){}
选项1 是试着定义一个方法两次,有一个int 返回值并不能帮助将它与存在的foregate 方法相区分。
而像选项4 那样改变方法的参数名,也不能与存在的方法相区分。
选项2里的foreGate 方法是与foregate不同的方法。
相关阅读
过了SCJP,得分94%,自我感觉良好。下面把我自己的复习,考试过程在这里做个小结吧: 1.知识背景和概况: 我不是程序员,在大学做毕业设计的