A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

[笔试分享] java基础面试题

© 逆风TO 黑马粉丝团   /  2020-2-5 09:53  /  892 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 逆风TO 于 2020-2-5 10:23 编辑

什么是抽象?
答:抽象就是总结出一类事物的公共特征然后以此构造对应类的过程,抽象可以分为行为抽象和状态抽象。我们在开发过程中只抽象出与业务需要有关的方面,例如人的特征有很多,但我们只抽象出我们需要的姓名,年龄,电话就可以满足业务了,无需关注人这个类的其他细节,我们要的就是我们需要抽象出来的。

什么是封装?
答:将同一类事物的属性和操作属性的方法都放在一个类中,同时将这个类的属性访问权限设置为私用,这样要访问这个类的属性只能通过该类提供的方法,这就实现了类的封装了。通俗点理解,封装就代表着对象的属性只有对象提供了相应的方法才能够操作和访问,再通俗点就是,这个东西,我让你动它,你才能动,我不开这个口,门都没有。封装的目标就是要实现软件的"高内聚,低耦合"。

什么是继承?
答:在定义一个类的时候,把一个已经存在的类所定义的内容拿来作为自己的内容,同时加上自己特有的内容,还可以根据业务修改已经存在的类的方法,使之更符合业务需求,这就是继承。提供继承信息的类叫做父类,得到继承信息的类叫做子类。通俗点说,继承就是你的就是我的,我的还是我的。

什么是多态?
答:同样的对象调用了同样的方法实现的却是不同的事情,这就是多态。多态分为编译时多态和运行时多态,方法重载是编译时多态,因为在编译时期,就能够根据参数列表知道到底运行的是哪个方法。方法重写是运行时多态,因为只有在程序运行期间,才能够确定具体调用的是哪个类。

继承可以继承父类的私有属性和私有方法么?
答:不能。这个问题给出代码示例会比较好理解:
首先创建一个父类Car,它有私有属性name和size,以及访问他们的公共方法:
[AppleScript] 纯文本查看 复制代码
public class Car {
    private String name;
    private long size;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public long getSize() {
        return size;
    }

    public void setSize(long size) {
        this.size = size;
    }
}

再创建一个子类SmallCar:
public class SmallCar extends Car {
}
接下来我们尝试着重写SmallCar类的toString()方法:

20200203155006171.png

[color=rgb(153, 153, 153) !important]发现没有一个属性,如果父类的私有属性能够被子类继承的话,那么子类的toString()方法就应该要能输出它,很明显没有。

[color=rgb(153, 153, 153) !important]接下来把父类的私有属性的访问权限改为public,重写SmallCar类的toString()方法如下:

2.png

可以发现访问权限改为public后,toString()方法就能够选择到这两个父类的参数做输出了。

同样的,父类方法的访问权限从public改为private后,子类就无法直接调用到了。比如本来可以这样调用父类的getName()方法:

3.png

访问权限改成private后,就直接编译报错了: 4.png
分析到这里,我们就可以知道子类是无法继承父类的私有方法和私有变量的。还有我想分享一个想法,我觉得就算子类继承了父类,但是其实父类那些被继承的方法和变量只是做到对子类可见可操作可访问,子类并没有复制一份给自己,从这个截图就可以很明显看出:
5.png
其实name和size属性依旧是父类Car的,所以写到这里,我对继承的理解就是父类把自己的变量和方法开放给子类使用,子类靠自己就可以访问这些变量和方法,但是论起归属,他们依旧是父类的,除非你重写,当然这是我自己的一些想法,如果有错,欢迎指正哈。

Java泛型是什么?
答:泛型本质就是参数化类型,简单理解就是把我们操作的数据类型变成一个参数。这样同一个方法,我们使用泛型把数据类型参数化,那么传入的类型可以是Sring,Integer,Long等等类型的变量,然后方法内部再根据参数类型做不同处理,免了做方法重载的活。

Object类是所有类的父类,用Object不就好了,为什么还需要泛型?
答:Object类如果在具体使用时涉及到类型的转换,那么就要求开发者在开发时就要能明确判断出具体的参数类型,不然很容易造成类型转换错误,而且这错误在编译期还无法被发现,只有程序在运行期出错了才会被发现。而泛型不一样,泛型在编译期就能够对类型进行检查,同时所有的强制性类型转换都是自动且隐式的执行,代码的安全性和重用性得到了提高。

怎么对泛型做上限的限定?
答:<? extend T>。使用通配符"?"和"extends"关键字来指定泛型的上限,它表示该通配符所代表的类型是T类型的子类或者接口T的子接口。

怎么对泛型做下限的限定?
答:<? super T>。使用通配符"?"和"super"关键字来指定泛型的下限,它表示该通配符所代表的类型是T类型的父类或者接口T的父接口。

什么是泛型的类型擦除?
答:如果在编码阶段我们使用了泛型,那么这个泛型会被编译器在编译时去掉,在编译完成后生成的Java字节码文件中是不包含泛型的类型信息的,所以泛型主要用于编译阶段。比如List< String >和List< Long >经过编译后就是List,List< String >和List< Long >看似不同类型,其实是相同的基本类型。下面给段示例代码方便理解和加深记忆,代码如下:
[Java] 纯文本查看 复制代码
public class SmallCar extends Car {
    public static void main(String[] args) {
        List<String> stringList = new ArrayList<>();
        List<Long> longList = new ArrayList<>();
        Class stringListClass = stringList.getClass();
        Class longListClass = longList.getClass();
        if (stringListClass.equals(longListClass)) {
            System.out.println("两个集合类型都一样");
        }
    }
}


运行结果如下:
7.png
所以List< String >和List< Long >两个集合就是相同类型。


转自CSDN

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马