如果Child extends Parent,那么正确的有()?
A.如果Child是class,且只有一个有参数的构造函数,那么必然会调用Parent中相同参数的构造函数
B.如果Child是interface,那么Parent必然是interface
C.如果Child是interface,那么Child可以同时extends Parent1,Parent2等多个interface
D.如果Child是class,并且没有显示声明任何构造函数,那么此时仍然会调用Parent的构造函数
答案解析:
A. 如果Child是一个类,并且只有一个有参数的构造函数,那么Child的构造函数会通过super
关键字调用Parent中相同参数的构造函数,除非Child显式地通过this
关键字调用了另一个构造函数。如果Child没有显式调用父类的构造函数,Java编译器会尝试调用父类中参数匹配的构造函数。
B. 如果Child是一个接口,那么Parent也必须是一个接口。在Java中,接口不能继承类,只能继承其他接口。
C. 如果Child是一个接口,那么Child确实可以同时继承(使用extends
关键字)多个其他接口(Parent1,Parent2等)。这是Java接口的一个特性,允许多继承。
D. 如果Child是一个类,并且没有显式声明任何构造函数,那么Java编译器会自动提供一个无参数的构造函数,这个构造函数会隐式地调用父类(Parent)的无参数构造函数。
已知String a="a",String b="b",String c=a+b,String d=new String("ab") 以下操作结果为true的是
A.(a+b).equals(c)
B.a+b==c
C.c==d
D.c.equals(d)
答案解析:
A. (a+b).equals(c)
这个表达式是正确的。a+b
会生成一个新的字符串对象,而c
也是一个字符串对象,它们的内容都是"ab",所以使用equals
方法比较时,结果为true
。
B. a+b==c
这个表达式是错误的。a+b
会创建一个新的字符串对象,而c
是之前通过a+b
创建的一个字符串对象的引用,即使它们的内容相同,但它们是不同的对象实例,所以使用==
比较引用时,结果为false
。
C. c==d
这个表达式是错误的。c
是通过a+b
创建的字符串对象,而d
是通过new String("ab")
创建的一个新的字符串对象,即使它们的内容相同,但它们是不同的对象实例,所以使用==
比较引用时,结果为false
。
D. c.equals(d)
这个表达式是正确的。c
和d
都是字符串对象,它们的内容都是"ab",所以使用equals
方法比较时,结果为true
。
有关线程的叙述正确的是()
A.可以获得对任何对象的互斥锁定。
B.通过继承Thread类或实现Runnable接口,可以获得对类中方法的互斥锁定。
C.线程通过使用synchronized关键字可获得对象的互斥锁定。
D.线程的创建只能通过继承Thread类来实现。
A. 可以获得对任何对象的互斥锁定。这个说法是正确的。在Java中,任何对象都可以作为锁(lock),通过在对象上调用synchronized
方法或代码块可以获得对该对象的互斥锁定。
B. 通过继承Thread类或实现Runnable接口,可以获得对类中方法的互斥锁定。这个说法是不准确的。继承Thread类或实现Runnable接口是为了创建线程,而不是直接获得对类中方法的互斥锁定。互斥锁定是通过synchronized
关键字来实现的。
C. 线程通过使用synchronized关键字可获得对象的互斥锁定。这个说法是正确的。在Java中,可以通过在方法或代码块前加上synchronized
关键字来获得对象的互斥锁定。
D. 线程的创建只能通过继承Thread类来实现。这个说法是错误的。在Java中,创建线程有两种方式:一种是继承Thread类并重写其run
方法;另一种是实现Runnable接口并实现其run
方法,然后将Runnable实例传递给Thread对象。
选项中哪一行代码可以添加 到题目中而不产生编译错误?
public abstract class MyClass {
public int constInt = 5;
//add code here
public void method() {
}
}
A.public abstract void method(int a);
B.constInt = constInt + 5;
C.public int method();
D.public abstract void anotherMethod