构造器(constructor)是否可被重写(override)?
构造器不能被继承,因此不能被重写,但可以被重载。
2.两个对象值相同(x.equals(y)==true),但却可能有不同的hashcode,这句话对不对?
不对,如果两个对象x,y满足x.equals(y)==true,它们的哈希码(hashcode)应当相同,java对于equals方法和hashcose方法是这样规定的:
(1)如果两个对象相同x.equals(y)==true,那么它们的hashcode值一定要相同。
(2)如果两个对象的hashcode相同,对象不一相同。当然,相同的元素可以出现set集合中,同时增加新的元素的效率就会下降。(频繁哈希冲突会造成性能急剧下降)
3.是否可以继承String类?
String类是final修饰的类,不可以被继承。继承String本身就是一种错误的行为,对String最好的重用方式就是关联关系和依赖关系,而不是继承关系。
4.当一个对象被当作参数传递到一个方法后,此方法可以改变对象的属性,并可返回变化后的结果,那么这里是值传递还是引用传递?
是值传递。java语言的方法调用只支持参数的值传递,当一个对象实例作为一个参数传递到方法中,参数的值就是对该对象的引用。对象的属性就是可以在被调用过程中被改变,但对对象引用的改变不会影响到调用者的。C++和C#中可以通过传引用或传出参数来改变传入对象的参数的值。在C#中可以编写如下代码,java中无法做不到:
using System;
namespace CS01 {
class Program {
public static void swap(ref int x, ref int y) {
int temp = x;
x = y;
y = temp;
} p
ublic static void Main (string[] args) {
int a = 5, b = 10;
swap (ref a, ref b);
// a = 10, b = 5;
Console.WriteLine (“a = {0}, b = {1}”, a, b);
}
}
}
说明:Java 中没有传引用实在是非常的不方便,这一点在 Java 8 中仍然没有得到改进,正是如此在 Java 编写的代码中才会出现大量的Wrapper 类(将需要通过方法调用修改的引用置于一个 Wrapper 类中,再将 Wrapper 对象传入方法),这样的做法只会让代码变得臃肿,尤其是让从 C 和 C++转型为 Java 程序员的开发者无法容忍
5.String和StringBuilder,StringBuffer的区别?
java平台提供了两种类型的字符串:Sting和StringBuilder/StringBuffer,它们可以储存和操作字符串。其中String只是只读字符串,也就是意味着String引用的字符串内容不能改变。
而StringBuilder,StringBffer类表示的字符串对象可以直接进行修改的,StringBuilder是java5中引入的,它和StringBuffer的方法完全相同。区别就是它在单线程下 因为它所有方面都没有synchronized修饰,因此他的效率也比StringBuilder高。
6.重载和重写的区别。重载的方法能否根据返回类型进行区分?
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;
写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。
重载对返回类型没有特殊的要求。
7.char型变量中能不能存贮一个中文汉字,为什么?
char类型可以存贮一个中文汉字,因为Java中的编码是unicode(不选择特定编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占两个字节,放一个中文汉字没问题。
补充:使用 Unicode 意味着字符在 JVM 内部和外部有不同的表现形式,在 JVM内部都是 Unicode,当这个字符被从 JVM 内部转移到外部时(例如存入文件系统中),需要进行编码转换。所以 Java 中有字节流和字符流,以及在字符流和字节流之间进行转换的转换流,如InputStreamReader 和 OutputStreamReader,这两个类是字节流和字符流之间的适配器类,承担了编码转换的任务;对于 C 程序员来说,要完成这样的编码转换恐怕要依赖于 union(联合体/共用体)共享内存的特征来实现了。
8.抽象类和接口有什么异同?
抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽象类中的成员可以是private、默认、protected、public 的,而接口中的成员全都是 public 的。抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。
9.java中存在内存泄露问题吗?简单描述。
理论上Java有垃圾回收机制不会存在内存泄漏(这也是Java被广泛使用与服务端编程的原因);然而在实际开发中存在无用但可达的对象,这些对象不被gc回收,因此也会导致内存泄漏。
10.抽象的方法是否可同时是静态的static方法,是否同时是本地native方法,是否同时是被synchronized修饰?
都不能,抽象方法需要子类重写,而静态方法是无法被重写的,因此二者是矛盾的。本地方法是由是由本地代码(c代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized和方法的实现细节有关,抽象方法不能实现其细节,因此也是矛盾的。
原创文章,作者:wdmbts,如若转载,请注明出处:https://blog.ytso.com/272130.html