java面试基础知识

1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?

        ①可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。②需要注意的是,当用javac指令编译有多个类的Java文件时,它会给每一个类生成一个对应的.class 文件。③该文件同级的类之间可以互相调用,但是除了public的类,其他不能够在其他文件调用。

2、java内部类分几种?原理---相当拗口

     ①成员内部类:外部类直接包含内部类。内部类对象可以访问外部类对象中所有访问权限的字段,同时,外部类对象也可以通过内部类的对象引用来访问内部类中定义的所有访问权限的字段,。②局部内部类:局部内部类是定义在一个方法或作用域中的类,它的访问权限仅限于方法内或作用域内。③匿名内部类:在编译的时候由系统自动起名,它必须继承一个父类或实现一个接口。④静态内部类:静态内部类也是定义在另一个类里面的类,只不过在类前加上了static。静态内部类是不需要依赖于外部类的,与静态成员变量类似。

    内部类编译过程中编译器自动生成一个默认修饰权限并且名为 access$100 的静态方法,其接受一个外部类对象作为参数。创建非静态内部类的对象时,新建的非静态内部类对象会持有对外部类对象的引用。静态内部类对象不依赖其外部类对象存在,编译器不会为静态内部类对象提供外部类对象的引用,因为静态内部类对象的创建根本不需要外部类对象支持。

3、java关键字

(1)用于数据类型:boolean、byte、char、 double、 false、float、int、long、new、short、true、void、instanceof。

(2)用于语句:break、case、 catch、 continue、 default 、do、 else、 for、 if、return、switch、try、 while、 finally、 throw、this、 super。

(3)用于修饰:abstract、final、native、private、 protected、public、static、synchronized、transient、 volatile。

(4)用于方法、接口、包和异常:class、 extends、 implements、interface、 package、import、throws。

(4)其他:cat、 future、 generic、innerr、 operator、 outer、rest、var等都是Java保留的没有意义的关键字。
  另外,Java还有3个保留字:true、false、null。它们不是关键字,而是文字。包含Java定义的值。和关键字一样,它们也不可以作为标识符使用。

4、&和&&的区别

&&逻辑与的运算符,前一个表达式为false,后面的则不再计算。&是位与运算符,如果&两边是boolean类型时,同&&一样。

5、在switch(e)中,e的类型有要求吗?

 char byte short int 以及对应的包装类,枚举,从jdk1.7开始,switch支持String(通过hash)。

 long、float、double、boolean四种基本类型以及它们的包装类(在Java所有版本中)  都不能用于switch语句。

e本质上就是int

6、char型变量中能不能存贮一个中文汉字?

char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字。unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。

7、abstract class和interface区别?

1.抽象类可以有构造方法,接口中不能有构造方法。

2.抽象类中可以有普通成员变量,接口中没有普通成员变量

3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然

eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。

5. 抽象类中可以包含静态方法,接口中不能包含静态方法

6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。

7. 一个类可以实现多个接口,但只能继承一个抽象类。

接口可以继承接口。抽象类可以实现(implements)接口,抽象类可以继承具体类。

8、java方法的参数可有默认值吗?

java不支持默认值,可以通过函数重载(参数比较少,参数的顺序)或者工厂模式(参数比较多,构造对象)实现。
例如:Student s2 = new StudentBuilder().name("Spicoli").age(16).motto("Aloha, Mr Hand").buildStudent();

9、java 中检查异常,运行时异常?

 Exception表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常
系统异常(运行时异常):就是软件开发人员考虑不周所导致的软件本身缺陷问题,软件使用者无法克服和恢复这种问题。如(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException)

普通异常(检查异常):是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。也就是检查异常就是编译器要求你必须处置的异常。编写某段代码,编译器要求你必须要对这段代码try...catch,或者throws exception

10、final、finally与finalize的区别

final可以用来修饰类(表明该类不能被其他类所继承),方法(防止继承类对其进行重写)和变量(成员变量或局部变量,表示常量,只能被赋值一次,赋值后其值不再改变)

finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行。①只有与finally对应的try语句块得到执行的情况下,finally语句块才会执行。②在finally语句块语句块调用 虚拟机退出(System.exit(0) )或中断线程,则finally语句块不执行。③不管在 try 块中还是在 catch 块中包含 return,finally 块总是在 return之前执行。④如果 finally 块中有 return,那么 try 块和 catch 块中的 return就没有执行机会了。

finalize()是在java.lang.Object里定义的。这个方法在该对象被回收的时候被调用,用于释放资源。

《深入java虚拟机》:在java编译器编译finally子句时会生成jsr指令,它使jvm调转到微型子例程进行执行,也就是finally块处,同时将程序中的return 0语句编译为在调用jsr指令前栈中的返回变量到局部变量,调用jsr指令,执行finally块,finally块返回,在将局部变量中的返回值压入栈,执行return指令,从栈中弹出返回值,返回到调用方法,这里在执行jsr指令前将返回值保存在局部变量中,是因为finally块执行的过程中可能发生异常或者说是也有返回值,只有这样做才能保证最后程序执行的一致性。

11、反射中Class.forName()和ClassLoader.loadClass()的区别

Class.forName(className)方法,内部实际调用的方法是  Class.forName(className,true,classloader);

第2个boolean参数表示类是否需要初始化,Class.forName(className)默认是需要初始化。一旦初始化,就会触发目标对象的 static块代码执行,static参数也也会被再次初始化。

ClassLoader.loadClass(className)方法,内部实际调用的方法是ClassLoader.loadClass(className,false);

第2个 boolean参数表示目标对象是否进行链接,false表示不进行链接,不进行链接意味着不进行包括初始化等一些列步骤,那么静态块和静态对象就不会得到执行

12、Java中常用的类,包,接口

包名内容
java.lang该包提供了Java编程的基础类,例如 Object、Math、String、StringBuffer、System、Thread等,不使用该包就很难编写Java代码了。
java.util该包提供了包含集合框架、遗留的集合类、事件模型、日期和时间实施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。
java.io该包通过文件系统、数据流和序列化提供系统的输入与输出。
java.net该包提供实现网络应用与开发的类。
java.sql该包提供了使用Java语言访问并处理存储在数据源(通常是一个关系型数据库)中的数据API。
java.awt这两个包提供了GUI设计与开发的类。java.awt包提供了创建界面和绘制图形图像的所有类,而javax.swing包提供了一组“轻量级”的组件,尽量让这些组件在所有平台上的工作方式相同。

13、controller-service-dao三层,异常事务处理

基于controller-service-dao三层,从入口开始,controller层做异常处理返回前端能读懂的信息,一般来说会有统一的异常处理方法;
service层对多条sql进行事务控制,如果失败,进行回滚;@Transactional 一般基于异常,如果service层处理掉异常,则不回滚
dao层更多是单一的sql语句,没有必要进行事务控制,因为事务开销并不便宜。

14、Serializable接口作用和机制
在定义实体类时会继承Serializable接口,一个类只有实现了Serializable接口,它的对象才能被序列化。
把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。
private static final long serialVersionUID =xxxxxxL;
工作机制是:在序列化时系统将serialVersionUID写入序列化文件中,反序列化时系统会先检测serialVersionUID是否一致,如果一直则反序列化成功,否则抛出InvalidClassException。

15、String.split()使用的一些注意点
1、如果用“.”作为分隔的话,必须是如下写法,String.split("\\.")   //正则表达式的关键字
2、String[] arr = "?==".split("=");    // arr.length = 1
3、String[] arr = "?= =".split("=");   // arr.length = 2
4、String[] aa = "aaa\\bbb\\bccc".split("\\\\");    //要表达"aaaa\bbbb"这个串,用"\"分割

16、Java中NaN、无穷大

在JAVA中有三个特殊的浮点类型的数值:正无穷大(Infinity)、负无穷大(-Infinity)、NaN(不是一个数字)
在整型运算中,除数是不能为0的,否则直接运行异常。但是在浮点数运算中,引入了无限这个概念。。
常量 Double_POSITIVE_INFINITY、 Double.NEGATIVEJNFINITY 和 Double.NaN(以及相应的 Float 类型的常量) 分别表示这三个特殊的值
if (x == Double.NaN) // is never true
if (Double.isNaN(x)) // check whether x is "not a number

17、运算符相关

int x=1; x += 3.5;//是合法的,将把x设置为(int)(x + 3.5),运算符得到一个值, 其类型与左侧操作数的类型不同, 就会发生强制类型转换
&& 的优先级比 || 的优先级高, 所以表达式a && b || c等价于(a && b)|| c
+= 是右结合运算符, 所以表达式a += b += c等价于a += (b += c)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值