Java面试高频(二)

1.构造方法有哪些特性?

特点:

(1)构造方法名一定与类同名。

(2)构造方法无返回值。

(3)构造方法可以没有(默认一个无参构造方法),也可以有多个构造方法。他们之间构成重载关系。

(4)如果定义有参构造函数,则无参构造函数将被自动屏蔽。

(5)构造方法不能被继承。

(6)构造方法不能手动调用,在创建类实例的时候自动调用构造方法。

作用:

(1)初始化对象,为对象赋初值。

(2)简化我们为类字段赋值的代码。

构造方法和普通方法的区别:

(1)构造方法一定与类同名,普通方法就可以不用。

(2)构造方法无返回值,普通方法可以有返回值。

2.在 Java 中定义一个不做事且没有参数的构造方法有什么作用?

Java 程序在执行子类的构造方法之前,如果没有用 super() 来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 super() 来调用父类中特定的构造方法,则编译时将发生错误。因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。

3.Java 中创建对象的几种方式?

  1. 使用new关键字:这是我们最常见的也是最简单的创建对象的方式,通过这种方式我们还可以调用任意的够赞函数(无参的和有参的)。比如:Student student = new Student();
  2. 使用Class类的newInstance方法:我们也可以使用Class类的newInstance方法创建对象,这个newInstance方法调用无参的构造器创建对象,如:Student student2 = (Student)Class.forName("根路径.Student").newInstance(); 或者:Student stu = Student.class.newInstance();
  3. 使用Constructor类的newInstance方法:本方法和Class类的newInstance方法很像,java.lang.relect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数。如: Constructor constructor =Student.class.getInstance(); Student stu = constructor.newInstance(); 这两种newInstance的方法就是大家所说的反射,事实上Class的newInstance方法内部调用Constructor的newInstance方法。这也是众多框架Spring、Hibernate、Struts等使用后者的原因。
  4. 使用Clone的方法:无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用clone方法创建对象并不会调用任何构造函数。要使用clone方法,我们必须先实现Cloneable接口并实现其定义的clone方法。如:Student stu2 = stu.clone();这也是原型模式的应用。
  5. 使用反序列化:当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象,在反序列化时,JVM创建对象并不会调用任何构造函数。为了反序列化一个对象,我们需要让我们的类实现Serializable接口。如:ObjectInputStream in = new ObjectInputStream (new FileInputStream("data.obj")); Student stu3 = (Student)in.readObject();

4.抽象类和接口有什么区别?

(1)抽象类中可以定义构造方法,而接口中不可以定义构造方法;

(2)抽象类中可以有抽象方法和具体方法,而接口中只能有抽象方法(public abstract);

(3)抽象类中的成员权限可以是public、默认(default)、protected(抽象类中的抽象方法就是为了重写,所以不能被private修饰),而接口中的成员只可以是public(方法默认:public abstact,成员变量默认:public static final);

(4)抽象类中可以包含静态方法,而接口中不可以包含静态方法。

JDK1.8中的改变:

(1)在JDK1.8中,允许在接口中包含带有具体实现的方法,使用default修是,这类方法就是默认方法。

(2)在JDK1.8之前接口中不能包含静态方法,而JDK1.8以后可以包含。之前不能包含是因为接口中不可以实现方法,只可以定义方法,所以不能使用静态方法(因为静态方法必须实现)。现在可以包含了,只能用接口直接调用静态方法(如:接口名调用静态方法)。JDK1.8仍然不可以包含静态代码块。

5.静态变量和实例变量的区别

语法定义上的区别

  • 静态变量用static修饰

  • 实例变量没有static修饰

运行区别,实例区别

  • 静态变量在类中,不属于实例对象,属于类所有,只要程序加载了字节码,不用创建实例对象静态变量就会被分配空间,已经可以使用。

  • 实例变量是某个对象的属性,只有实例化对象后,才会被分配空间,才能使用。

  • 类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象;

6.short s1 = 1;s1 = s1 + 1;有什么错?那么 short s1 = 1; s1 += 1;呢?有没有错误?

对于 short s1 = 1; s1 = s1 + 1; 来说,在 s1 + 1 运算时会自动提升表达式的类型为int,那么将int型值赋值给short型变量,s1会出现类型转换错误。

对于 short s1= 1; s1 += 1; 来说,+= 是Java语言规定的运算符,Java编译器会对它进行特殊处理,因此可以正确编译。

7.int和Integer的区别

  1. int是基本数据类型,Integer是int包装类。
  2. Integer变量必须实例化后才能使用,int可以直接使用
  3. Integer的默认值是null,int默认值是0
  4. Integer变量实际上是对象的引用,指向new的Integer对象,int是直接存储数据

8.装箱和拆箱

Integer i = 10; //装箱
int n = i;      //拆箱

Java 为每种基本数据类型分别设计了对应的类,称之为包装类(Wrapper Classes)。例如:int的包装类为Integer、double的包装类为Double等等。

什么是装箱和拆箱呢?简单说基本数据类型转换为包装类的过程称为装箱,例如把 int 包装成 Integer 类的对象;包装类变为基本数据类型的过程称为拆箱,例如把 Integer 类的对象重新简化为 int。

参考文档

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注