Java初级面试(2019版/武汉)

有则改之,无则加勉。

  • 面试官也是从小白来的,有啥好怕的!
  • 一个萝卜一个坑,满足需求就要你了!

Java基础

基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法,其他

1. &和&&的区别

  1. &和&&都可以用作逻辑与的运算符,表示逻辑与(and)
  2. &&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式
  3. &还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。

2. 在Java中如何跳出多重循环
    在外循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环。

ok:    
for(int i=0;i<10;i++){
	for(int j=0;j<10;j++){
        ystem.out.println(“i=” + i + “,j=” + j);
        if(j == 5) break ok;
    }
}

3. switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?
    在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long类型不符合sitch的语法规定,并且不能被隐式转换成int类型,所以,jdk7.0扩展了Switch对于String的支持.

4.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
    对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
    对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。

5.char型变量中能不能存贮一个中文汉字?为什么?
    char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。

6.使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
    使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:
    final StringBuffer a=new StringBuffer(“immutable”);
执行如下语句将报告编译期错误:
    a=new StringBuffer("");
但是,执行如下语句则可以通过编译:
    a.append(" broken!");

7."=="和equals方法究竟有什么区别?
== 操作符专门用来比较两个变量的值是否相等,无论是基本数据类型还是引用类型。
equals方法是用于比较两个独立对象的内容是否相同。
例如,对于下面的代码:
String a=new String(“foo”);
String b=new String(“foo”);
表达式a==b将返回false,表达式a.equals(b)将返回true。

8.Overload和Override的区别
    重写(Override)也称覆盖,它是父类和子类之间多态性的一种表现,而重载(Overload)是一个类中多态性的一种表现。
    重写:方法名、参数、返回值相同;子类方法不能缩小父类方法的访问权限;存在于父类和子类之间;方法被定义为final不能被重写;被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。常用于接口实现
    重载:参数类型、个数、顺序至少有一个不相同;针对于一个类而言;可以改变返回值类型。

9.Java为什么要用抽象类和接口
    在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。

  1. 抽象类
        下面要注意一个问题:在《Java编程思想》一书中,将抽象类定义为“包含抽象方法的类”,但是后面发现如果一个类不包含抽象方法,只是用abstract修饰的话也是抽象类。也就是说抽象类不一定必须含有抽象方法。个人觉得这个属于钻牛角尖的问题吧,因为如果一个抽象类不包含任何抽象方法,为何还要设计为抽象类?所以暂且记住这个概念吧,不必去深究为什么。
    注意,抽象类和普通类的主要有三点区别:
    1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
    2)抽象类不能用来创建对象;
    3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
  2. 接口
        在软件工程中,接口泛指供别人调用的方法或者函数。从这里,我们可以体会到Java语言设计者的初衷,它是对行为的抽象。
        接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。
  3. 抽象类和接口的区别
    1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。举个简单的例子,飞机和鸟
    2)一个类只能继承一个抽象类,而一个类却可以实现多个接口。

10.面向对象的特征

  1. 封装
        封装的目标就是要实现软件部件的“高内聚、低耦合”
  2. 继承
        继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。
  3. 多态
        多态是指程序中定义的引用变量所指向的类和方法调用在编程是并不明确,只有在程序运行时才能确定,这样在不改变代码的情况下可以选择多个运行状态。多态性增强了软件的灵活性和扩展性。

11.java中实现多态的机制是什么?
    依靠父类或接口的引用指向子类

12.final, finally, finalize的区别
    final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
    finally是异常处理语句结构的一部分,表示总是执行。
    finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用

13.error和exception有什么区别
    error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
    exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

14.异常处理机制
    异常机制可以使程序中的异常处理代码和业务逻辑代码分离,保证代码可读性,并提高程序健壮性。
主要依赖于try、catch、finally、throw、throws五个关键字。
    Java的异常分为两种,checked异常(编译时异常)和Runtime异常(运行时异常),checked异常体现了java设计哲学:没有完善处理的代码根本不会被执行,体现了java的严谨性

15.简述synchronized和java.util.concurrent.locks.Lock的异同
    Lock是java的一个interface接口,而synchronized是Java中的关键字
    主要相同点:Lock能完成synchronized所实现的所有功能
    主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且一般在finally从句中释放。
    Lock还有更强大的功能,例如Lock的实现类ReentrantReadWriteLock提供了readLock()和writeLock()用来获取读锁和写锁的两个方法,这样多个线程可以进行同时读操作。

16.GC
jvm详解
    程序员创建对象时,GC就开始监控这个对象的地址,大小及使用情况。
    通常GC采用有向图记录和管理堆的所有对象,以此判断对象的可达性。
    程序员可以手动执行system.gc()通知GC运行,但不保证一定运行。

Java Web

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值