亚信科技线上笔试

记录一下不会的吧。。。。。。。。。。

1抽象类能被实例化吗?

考察点:java在创建子类对象时,会不会创建父类对象

创建子类对象时不会创建父类对象。所以抽象类是不会被实例化的,因为根本就没有父类对象被创建出来,虽然确实执行了父类的构造方法,但执行了构造方法就会创建父类对象吗,那你错了,构造方法只是初始化对象用的,此时父类构造方法初始化的是子类对象,真正的父类对象并没有被创建,因为内存中并不存在父类对象,否则java的内存管理早就爆了,满内存都是java的object对象!!!!!!!

我们创建子类对象时,只是说创建了父类空间,并进行了初始化。如果说创建子类的时候就会创建它的父类,那内存空间中不都是Object类的对象吗?(想想java的设计师也不会这么做的)

  • 创建对象指的是在堆区开辟空间
  • 编译器在运行子类构造器之前,必须先执行父类构造器;且调用父类构造器的语句必须在子类构造器的第一行。
  • 构造方法的作用是为堆区中的对象的属性初始化,不是创建对象。

下面将通过一个简单的Demo来展示一下:

首先,定义一个抽象类B,包含抽象方法play()

public abstract class B {
    private String str;
    
    public B(String a){
        System.out.println("父类已经实例化");
        this.str = a;
        System.out.println(str);
    }
    
    public abstract void play();
}
然后,定义一个子类C去继承类B,并实现其中的抽象方法
public class C extends B{
    public C(String c){
        super(c);
        System.out.println("子类已经被实例化");
    }
 
    @Override
    public void play() {
        System.out.println("我实现了父类的方法");
    }
    
    public static void main(String[] args){
        B c = new C("c");
    }
}

运行结果如下:
父类已经实例化
c
子类已经被实例化

2接口能被实例化吗?接口中有成员变量吗?

考察点:什么是变量?什么是常量?接口中属性方法是怎么定义的,内存不会存在接口对象的

接口不能被实例化,因为接口中的所有方法必须是抽象方法都不能被实现,接口中不允许定义构造函数,

亚信科技线上笔试_第1张图片

接口中没有成员变量,接口中不包含成员变量和方法实现,这句话是对的,

java中接口的定义

[修饰符] interface 接口名 [extends 父接口名列表]{

[public] [static] [final] 常量;//因此接口中确实没有成员变量,人家的是常量啦
[public] [abstract] 方法;
}

public static final int a=10;,

接口中变量修饰符必须为:static final

接口中方法修饰符必须为abstract

接口只是对一类事物属性和行为的更高次抽象;对修改关闭,对扩展开放,可以说是java中开闭原则的一种体现吧。

3java构造函数有返回值吗?

考察点:对象的创建过程(new中发生的事:1jvm为对象分配内存2构造函数对对象进行了初始化)

构造函数没有返回值,因为构造函数只是用来初始化对象的,对象的创建程序员都管不到,都是分配内存的事:jvm开内存给对象,是由jvm完成的,jvm负责给对象分配内存,

网上说的构造函数有返回值是错的!返回值为对象是错的!返回值为引用也是错的!

亚信科技线上笔试_第2张图片

(1)构造方法的主要作用是完成对象的初始化工作

这是 上的说法: 
For purposes other than simple initialization, classes can have constructors. Constructors are blocks of statements that can be used to initialize an object before the reference to the object is returned by new. Constructors have the same name as the class they initialize. Like methods, they take zero or more arguments, but constructors are not methods and thus have no return type. Arguments, if any, are provided between the parentheses that follow the type name when the object is created with new. Constructors are invoked after the instance variables of a newly created object of the class have been assigned their default initial values and after their explicit initializers are executed. 
看最后一句话,构造方法是新创建的对象的实例变量缺省初始化以及显式初始化之后才执行的,也就是说在构造方法调用之前这个对象已经存在了,更谈不上你例子中的构造方法返回一个对象引用了。

也就是说,构造函数的作用仅仅是完成对象的初始化工作,而对象的创建工作是在调用构造函数之前就已经完成的工作,不然构造函数怎么对对象进行初始化呢?

也就是new的时候,系统先创建了对象,在调用了构造函数对对象进行初始化的操作!!!!!!!!!!!!!!!!!!

(2)

这就是规定,如果你现在自己做一个新语言的编译器,也可以规定构造函数必须加上void,或者一个特殊的返回值。
那么为什么构造函数没有返回值呢,主要是为了区分构造函数和其它方法。其实,你可以尝试在你的构造函数前加上void,你会发现编译可以通过,但是编译器把它认为是方法,而不是构造函数,当然也无法在new的时候自动调用。

package JianZhiOffer;

public class Test {
    public void Test(){
        System.out.println("我只是一个普通的方法,我只能被显示调用");
    }
    //构造函数本身是没有返回值的,如果非得说有返回值,他的返回值也就是一个引用
    public Test(){
        System.out.println("我是一个构造函数,我是在创建对象时被yinshi调用的");
    }
    public static void main(String []args){
        Test a=new Test();
        a.Test();
    }

}

输出

我是一个构造函数,我是在创建对象时被yinshi调用的
我只是一个普通的方法,我只能被显示调用

4接口可以继承接口吗?抽象类可以实现接口吗?抽象类可以继承实体类吗?

可以,可以,可以

接口存在多继承,一个接口可以继承接口

抽象类是可以实现接口的,因为抽象类中可以含有普通方法对接口中的抽象方法进行实现

抽象类可以继承实体类,但是没有存在的意义
 

你可能感兴趣的:(校招面经)