工厂方法比new方式相比有哪些好处?
- 工厂方法可以为实例化方法重新命名,但是new调用的构造器只能与类名相同
- 工厂方法可以改变返回对象的类型,比如可以返回子类。构造器无法改变所构造的对象类型。
我们可以把对象的引用传递给Java方法,那么怎么证明Java中方法参数的传递方式是按值调用,而不是按引用传递呢?
- 首先如果参数是基本数据类型,一个java方法是不能修改其值的。也就是说,不管方法里面如何修改其值,在方法外面其值是不会改变的。
- 如果参数是对象,那么方法是可以修改对象状态的(如果此对象是可变对象的话)。但是不能让对象参数指向一个新的对象。也就是说不管方法里面如何修改其引用指向,方法外面此变量还是指向原对象。
- 方法参数传递时,会把参数的值复制一份传给方法使用。所以叫做按值调用。基本数据类型时,方法里的参数已经是一个新的变量了。对象参数时,方法里的参数也是一个新的引用了,只不过新引用与原引用指向同一个变量。
- Java方法无法实现两个对象的引用互换,所以Java方法不可能是按引用传递的。示例如下:
public class CallByValueTest {
public static void main (String[] args) {
howToProveJavaIsCallByValue();
}
/**
* 如何证明Java是按值传递的,而不是按引用传递的!
* 交换逻辑并没有实现。
*/
private static void howToProveJavaIsCallByValue(){
A a1 = new A("a1");
A a2 = new A("a2");
swap(a1, a2);
System.out.println(a1 + ", " + a2);
}
private static void swap(A a1, A a2){
A temp = a1;
a1 = a2;
a2 = temp;
}
static class A{
String name;
private A (String name) {
this.name = name;
}
@Override
public String toString () {
return this.name;
}
}
}
final修饰的域可以不显示地初始化,而让JVM初始化为默认值吗? 比如 int 默认初始化为0
答案:不可以,final域必须显示地初始化。
实例域和静态域的初始化块可以在声明之前?比如下面的代码可以初始化为2吗?
public class ObjectInitialization {
static{
a = 2;
}
static int a;
{
i = 2;
}
int i;
public static void main (String[] args) {
System.out.println(a);
System.out.println(new ObjectInitialization().i);
}
}
class A{
int a;
private A () {}
}
答案:可以。
下面的代码,a的值是?
static{
a = 2;
}
static int a = 1;
答案:1
下面的代码,a的值是?
static{
a = 2;
}
static int a = 1;
static{
a = 3;
}
答案:3
总结:初始化和赋值语句是按照类定义顺序执行,后面的赋值覆盖前面的!
Java中this有哪些作用?
- 实例方法的隐式参数,指向当前对象。本地变量表的第一个变量:aload_0
- 在一个构造器内调用另一个构造器(如果调用同一个构造器,编译报错:循环引用)
可以用import java. 或者 import java..* 导入多个包吗?
答案:不可以,一条import语句只能导入一个包。
import语句作用于编译期,还是运行期?
答案:编译期。字节码中已经全部按照全路径名来引用其他类了。
静态导入可以导入某个类的特定静态方法吗?
答案:可以。
// 导入特定静态方法
import static java.util.Objects.compare;
// 导入特定静态域
import static java.lang.Math.E;
// 导入该类的所有静态方法和静态域
import static java.lang.Math.*;
JAR是使用RAR压缩格式吗?如果不是,它是使用什么压缩格式?
答案:不是。Jar是以ZIP压缩格式为基础的。
使用Javadoc时 如何添加整个包的注释?
- 编写package.html的HTML文件放在包中,在<body>标签中的内容会被提取。
- 另一种方法,写一个package-info.java文件放在包中,在包语句之后紧跟/*和/的注释。
- 如何给所以源文件添加注释,写一个overview.html的文件放在包含所有源文件的父目录中。在<body>标签中的内容会被提取。内容将被显示在导航栏的Overview中。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。