Java基础面试

1.面向对象的三大特性

    封装:就是把同一类事物的属性和方法归类
    封装的优点
    >良好的封装能够减少耦合
    >类内部的结构可以自由修改
    >可以对成员变量进行更精准的控制
    >隐藏信息,实现细节
    
    继承:子类继承父类的方法,使的子类具有父类的相同行为
    继承的特性
    >子类拥有父类费private的属性和方法
    >子类可以拥有自己的属性和方法,既子类可以对父类进行扩展
    >子类可以用自己的方法实现父类的方法
    >Java的继承使单继承

    多态:是同一个行为具有多个不同表现形式或者形态的能力
    多态存在三个必要条件
    >继承
    >重写
    >向上转型(父类引用指向子类对象)
2.重载和重写有什么区别?
    (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,
         则称为方法的重载(Overloading)。
    (2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,
         就称为重写(Overriding)。
    (3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。

    
 3.Java多态的实现机制是什么?
    Java实现多态有三个必要条件:继承、重写、向上转型(父类引用指向子类对象)。

       编译时多态:方法名相同,参数个数或类型不相同。(重载overloading)
       运行时多态:子类覆盖父类的方法,将子类的实例传与父类的引用调用的是子类的方法


4.是否可以继承String类?
    当然不可以了,String是final类型的,不能继承。
    
5.java类支持多继承么?可以实现多个接口么?
    java不支持多继承,但类可以实现多个接口,间接的实现多继承,也可以通过内部类。
    
6.接口和抽象类有什么区别?
    1)抽象类要被子类继承,接口要被类实现
    2)抽象类中可以做方法申明,也可以做方法实现,接口也只能做方法申明(jdk1.8之后才可以做方法实现)
    3)抽象类和接口都是来抽象具体对象的  抽象级别(从高到低):接口>抽象类>实现类。
    4)抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量

7.内部类了解么?简单介绍下
    定义:放在一个类的内部的类我们就叫内部类。
    作用:
     1.内部类可以很好的实现隐藏,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
    2.内部类拥有外部类的所有元素的访问权限
    3. 可以实现多重继承(重点说下这个)
    分类:
    1.静态内部类:作为类的静态成员,存在于某个类的内部。 (java.util.Collections,ConcurrentHashMap)
    2.成员内部类:作为类的成员,存在于某个类的内部。
    3.局部内部类:存在于某个方法的内部。
    4.匿名内部类:存在于某个类的内部,但是无类名的类。


8.请简要叙述下Java中修饰符的作用域及可见性?
    public:修饰的成员可以在任何范围内直接访问,只是一种最宽松的访问控制等级。需要注意的,所谓的直接访问仍需要先创建或获得一个相应类的对象然后才可以使用”对象名.成员“的方式访问其属性或调用其方法,但是出于信息封装和隐藏的需要一般不提倡把成员声明为public的,而构造方法和需要外界直接调用的普通方法则适合声明为public.

    protected:修饰的成员可以在其所在类中、同一包中及子类中(无论子类在不在同一个包)被直接访问,但不能在位于不同包中的非子类中被直接访问,这里需要特别声明:在位于不同包的子类中必须是子类的对象才能直接访问其父类的protected成员,而父类自身的对象反而不能访问其所在类中声明的protected成员。

    default:缺省访问修饰符的成员只能在其所在类中或包中直接访问,在不同包中即使是不同包的子类也不能直接访问。
    
    private:成员只能在所在类中被直接访问,是4种访问等级最高的一个。

 9."=="和equals方法有什么区别?
    equals()和“==”操作用于对象的比较,检查俩对象的相等性,但是他们俩的主要区别在于前者是方法,后者是操作符。
 
    总结:
    1 一般使用==比较原生类型如:boolean、int、char等等,使用equals()比较对象。
    2 如果两个引用指向相同的对象==返回true,equals()的返回结果依赖于具体业务实现,
      一般重写equals方法时,同样重写hashcode方法,默认的equals方法实现是与“==”操作一样的。
    3 字符串的对比使用equals()代替==操作符
10.一个static方法内可以调用非static方法吗?
    不可以。
    加载static方法的时候非静态方法还没初始化,当然不能调用了 

11. 静态变量和实例变量的区别?
    1) 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加
    2) 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。
    静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,只分配一次,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

12.Integer与int的区别

   1.Integer是int的包装类,int则是java的一种基本的数据类型;

   2.Integer变量必须实例化之后才能使用,而int变量不需要实例化;

   3.Integer实际是对象的引用,当new一个Integer时,实际上生成一个指针指向对象,而int则直接存储数值

   4.Integer的默认值是null,而int的默认值是0。
 

13.String,StringBuffer,StringBuilder的区别

    1.String为字符串常量,一旦创建不可更改,对它的操作是不断创建新对象以及回收旧对象,StringBuffer和StringBuilder为变量,可以修改。

    2.StringBuffer是线程安全,StringBuilder不是线程安全。

    3.运行速度对比:StringBuiler>StringBuffer>String(速度从高到底)

    4.一般在不涉及多线程访问,频繁更改值的情况下,建议使用StringBuilder

    总结:

    String:适用于少量字符串操作

    StringBuilder:适用于单线程字符缓冲区的大量操作

    StringBuffer:适用于多线程字符缓冲区的大量操作

13.说一下工作中遇到过哪些异常?

    1. Java.lang.NullPointerException 空指针异常

    2. java.lang.ClassNotFoundException  指定的类不存在

    3. java.lang.ArrayIndexOutOfBoundsException  数组下标越界

    4. java.lang.IllegalArgumentException   方法的参数错误

    5. java.lang.IllegalAccessException 没有访问权限

    6.java.io.IOException  io相关的exception

14、构造器(constructor)是否可被重写(override)?

构造器不能被继承,因此不能被重写,但可以被重载。

15、List、Set、Map是否继承自Collection接口?

List、Set 是,Map 不是。Map是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。

16、Collection和Collections的区别?

Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

17、List、Map、Set三个接口存取元素时,各有什么特点?

List以特定索引来存取元素,可以有重复元素。Set不能存放重复元素(用对象的equals()方法来区分元素是否重复)。Map保存键值对(key-value pair)映射,映射关系可以是一对一或多对一

18、数组有没有length()方法?String有没有length()方法?

数组没有length()方法,有length 的属性。String 有length()方法。

19.ArrayList和LinkedList有何区别?

ArrayList的实现用的是数组,LinkedList是基于链表,ArrayList适合查找,LinkedList适合增删

19.ArrayList中元素如何删除?

使用迭代器Iterator 去删除  remove

20.Iterator和ListIterator之间有什么区别?

    ListIterator继承了Iterator

    1.使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。

    2.ListIterator有add方法,可以向List中添加对象,而Iterator不能。

    3.ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。

    4.ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。

    5.都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。

 

21.创建线程有几种不同的方式?用过那种方式?

    java创建线程的三种方式:

    继承Thread类创建线程类
    通过Runable接口创建线程类
    通过Callable和FutureTask创建线程


    总结下:
    实现Runnable和实现Callable接口的方式基本相同,不过是后者执行call()方法有返回值。
    1、如果需要访问当前线程,必须调用Thread.currentThread()方法。
    2、继承Thread类的线程类不能再继承其他父类(Java单继承决定)。
    注:一般推荐采用实现接口的方式来创建多线程

 

22.sleep() 和 wait() 有什么区别?

    1、这两个方法来自不同的类分别是Thread和Object,sleep方法属于Thread类中的静态方法,wait属于Object的成员方法。

    2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

    3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)

23.线程的join方法的作用是什么?

    等待该线程终止。

    相当于等待该线程执行完,才去继续执行,和同步顺序执行差不多。

24.什么是GC?

    GC(GarbageCollection)是垃圾回收机制(垃圾回收器),GC是JVM对内存(实际上就是对象)进行管理的方式。

    Java有了GC,就不需要程序员去人工释放内存空间。GC使得Java开发人员摆脱了繁琐的内存管理工作,让程序的开发更有效率。

25.Java中堆和栈介绍下?

    堆内存主要作用是存放运行时创建(new)的对象。

    栈内存的主要作用是存放基本数据类型和引用变量。栈的内存管理是通过栈的"后进先出"模式来实现的。

26.java io中有几种类型的流?JDK为每种类型的流 提供了一些抽象类以供继承,请说出他们分别是哪些类?

    一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。

    字节流----字节输入流:InputStream,字节输出流:OutputStream

    字符流----字符输入流:Reader,字符输出流:Writer

 

27.&和&&有什么区别

& 不管前面的条件是否正确,后面都执行

&& 前面条件正确时,才执行后面,不正确时,就不执行,就效率而言,这个更好

28.switch语句能否作用在byte上,能否作用在long上,能否作用在String上?

在switch(e)中,e只能是一个整数表达式或者枚举常量,整数表达式可以是int基本类型或Integer包装类型,由于byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。

switch中可以是字符串类型,String(JDK1.7之后才可以作用在string上),switch中可以是枚举类型(JDK1.5之后)。

29.使用final关键字修饰一个变量时,是引用不能变,还是引用的变量不能变?

使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:

 final StringBuffer a =new StringBuffer("immutable");

a 是引用变量  a指向的对象中的内容还是可以改变的
        执行如下语句将报告编译期错误:

        a=new StringBuffer("");
        但是,执行如下语句则可以通过编译:

        a.append(" broken!");

 

        有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:

        public void method(final  StringBuffer param){

        }

        实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:

param.append("a");

 

30.Integer与int的区别

1.Integer是int的包装类,int则是java的一种基本的数据类型;

2.Integer变量必须实例化之后才能使用,而int变量不需要实例化;

3.Integer实际是对象的引用,当new一个Integer时,实际上生成一个指针指向对象,而int则直接存储数值

4.Integer的默认值是null,而int的默认值是0。

31.java的几种基本类型

32.String能被继承吗?为什么?

不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。平常我们定义的String str=”a”;其实和String str=new String(“a”)还是有差异的。

前者默认调用的是String.valueOf来返回String实例对象,至于调用哪个则取决于你的赋值,比如String num="a",调用的是
        public static String valueOf(Object obj){
              return (obj == null) ? "null" : obj.toString();
        }

 后者则是调用如下部分:
        public String(String original) {      

     throw new UnsupportedOperationException("Use StringFactory instead.");

}
        最后我们的变量都存储在一个char数组中
        private final char value[];

 

 

持续更新中

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值