转载

Java冷知识(二)

工厂方法比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有哪些作用?

  1. 实例方法的隐式参数,指向当前对象。本地变量表的第一个变量:aload_0
  2. 在一个构造器内调用另一个构造器(如果调用同一个构造器,编译报错:循环引用)

可以用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中。
原文  https://segmentfault.com/a/1190000021133903
正文到此结束
Loading...