Java构造器14连问,你能抗几问?

发布于:2023-02-06 ⋅ 阅读:(2133) ⋅ 点赞:(2)

Java构造器14连问,你能抗几问?

前言

本篇才用通俗易懂的话语来讲解构造器的一些知识,希望能帮助到大家们。

当然本题目都是来自 牛客 Java基础试炼,欢迎大家前来挑战:

题目地址

在这里插入图片描述

一、构造器的作用是什么?

答: 构造器用于给对象属性赋初值,用于初始化对象的状态。

特点:

  • 方法名和类名一样。
  • 没有返回值,且不能用void修饰。
  • 构造器中的参数可有可无。

简言之: 构造器就是的作用就是创造对象。

二、构造器里可以给静态变量赋值吗

答: 可以

原理: 静态变量只能定义全局的,构造方法中不能定义。

补充: 可以,但是用final修饰的静态变量无法再构造器中赋值。

三、抽象类里面有构造器吗?

答: 可以

详解: 抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已。在继承了抽象类的子类中通过super()或super(参数列表)调用抽象类中的构造方法。示例代码如下:

package ahu;
 
abstract class Base{
    int a=7;
    public Base(){
    	a=8;
    }
    public Base(int i){
    	a=i;
    }
}
public class Demo01 extends Base {
	public Demo01(){
		super();
	}
	public Demo01(int i){
		super(i);
	}
	public static void main(String[] args) {
		Demo01 demo=new Demo01();
	    System.out.println(demo.a);
	    Demo01 demo1=new Demo01(9);
	    System.out.println(demo1.a);
	}
}

四、什么是缺省构造器?

一个类中如果没有显式定义构造器,Java编译器会自动在编译期自动添加一个缺省的无参构造器。

五、构造器的声明中有没有返回值类型

答: 没有

拓展:

String str = new String("content");

问: new 的时候调用构造函数,返回给str;

原因: 构造方法是新创建的对象的实例变量缺省初始化以及显式初始化之后才执行的,也就是说在构造方法调用之前这个对象已经存在了,更谈不上你例子中的构造方法返回一个对象引用了。

继承(extends)的含义其实是“扩展”,子类完全没必要扩展父类的构造函数,因为反正每次调子类的时候都会“自动运行”它父类的构造函数,如果真的需要子类构造函数特殊的形式,子类直接修改或重载自己的构造函数就好了。

六、构造器会不会被继承

答: 不会,但是可以在资料中调用父类的构造器。

原因: 因为子类继承父类的时候,先运行父类构造函数;具体的说就是运行父类时就会先“调用”父类的构造函数,注意“调用”和继承不是一个含义,实质上是“自动运行”。

七、构造器可声明为abstract, static, final吗?

答: 不可以

原因:

  • 1.构造器不是通过继承得到的,所以没有必要把它声明为final的。
  • 2.同理,一个抽象的构造器将永远不会被实现,所以它也不能声明为abstract的。
  • 3.构造器总是关联一个对象而被调用,所以把它声明为static是没有意义的。

八、构造器可以重载吗?

答: 可以

原因: 待补充

九、不使用new关键字,可以用什么其他方式创建对象?

答: 构造器Class对象中的newinstance()方法,对象中的clone()方法,对象中的反序列化,forName()方法。

详细: Java中6种创建对象的方法,除了new你还知道啥

例如:

package test;
 
public class Test {
private String a="1";
public static void main(String[] args) throws Exception{
    Test a = (Test)Class.forName("test.Test").newInstance();
    System.out.println(a.a);
     
	}
}

十、给一个构造器添加上返回类型,会不会变成一个普通方法?

答:

详细:

如果为构造方法定义了返回值类型或使用 void 声明构造方法没有返回值,编译时不会出错,但 Java 会把这个所谓的构造方法当成普通方法来处理。

这时候大家可能会产生疑问,构造方法不是没有返回值吗?为什么不能用 void 声明呢?简单的说,这是 Java 的语法规定。实际上,类的构造方法是有返回值的,当使用 new 关键字来调用构造方法时,构造方法返回该类的实例,可以把这个类的实例当成构造器的返回值,因此构造器的返回值类型总是当前类,无须定义返回值类型。但必须注意不要在构造方法里使用 return 来返回当前类的对象,因为构造方法的返回值是隐式的。

十一、构造器可以声明为private吗

答: 可以

详解:

将构造器设为private,那么谁也无法创建类的对象了,但现在别人怎么创建使用这个类?

有两种方法:

  • 第一: 创建一个static方法,它创建一个新的此类的对象,并返回一个对他的引用。如果想在返回引用之前,做一些额外的工作,或者想知道记录创建了多少个对象(可能要限制其对象的数量),这种做法将会大有裨益的。
  • 第二: 选择用到了所谓的设计模式,这种模式称为“singleton”,这是因为你始终只能创建一个对象【通过在内部生成一个static的private对象,然后用static的public方法返回这个对象的引用】。类的对象作为一个static private成员而创建的,所以有只有一个,而起除非通过public方法返回这个引用,否则是无法访问它的。

十二、可以在一个构造器里面调用另一个构造器吗?如何调用?可以在普通方法里面调用吗?

答: 可以。可以使用this()调用类中另外的一个构造器,使用super()调用父类的构造器,调用语句都要放在构造器的第一句代码。不可以在普通方法里面调用。

示例:

本类:

public class Person {
    private String name;
    
    //构造器一
    public Person() {
        
    }
    
    //构造器二
    public Person(String name) {
        this(); //调用构造器一
        this.name = name;
    }
}

十三、可以在一个类的构造器里面调用父类的父类吗?

答: 不可以

解析: 当然是不可以的,我们知道如果一个子类想调用父类的构造函数的话是需要使用super关键字的。但是super只能出现在第一行,也就是只能用一次。也就是说当子类调用父类,父类也会调用父类,但是子类不能使用父类中父类的方法。

也就是说只能来调用其父类。

十四、任何一个构造器(非Object类的)的执行链上最终都需要显式或者隐式调用父类的构造器吗?

答案: 可以

原因: 我们知道加载类时先加载父类在加载子类,每个类最后不是都有object类的方法。我们可以从类的加载来看这个流程

推荐文章: 类加载


网站公告

今日签到

点亮在社区的每一天
去签到