BAT面试题-JAVA基础

面向对象和面向过程的区别

面向过程(Procedure Oriented Programming)
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素
缺点:没有面向对象易维护、易复用、易扩展。

面向对象(Object Oriented Programming)
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。
缺点:性能比面向过程低。

 

Java基本数据类型 各占多少字节

字节
byte:用来计量存储容量的一种计量单位;位:bit,一个字节等于8位  1byte = 8bit.
整型
byte:1个字节
short :2个字节
int :4个字节
long:8个字节
浮点型
float:4个字节
double :8个字节
char类型
char:2个字节
Boolean类型
boolean:1个字节

 

JDK、JRE、JVM的关系

JVM :Java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。所以说,jvm 是 Java 能够跨平台的核心。
JRE :Java 运行时环境。它主要包含两个部分,jvm 的标准实现和 Java 的一些基本类库。它相对于 jvm 来说,多出来的是一部分的 Java 类库。
JDK :Java 开发工具包。jdk 是整个 Java 开发的核心,它集成了 jre 和一些好用的小工具。例如:javac.exe,java.exe,jar.exe 等。
这三者的关系是:一层层的嵌套关系。JDK>JRE>JVM。

 

Java的四个基本特性

抽象:就是把现实生活中的某一类东西提取出来,用程序代码表示,我们通常叫做类或者接口。抽象包括两个方面:一个是数据抽象,一个是过程抽象。数据抽象也就是对象的属性。过程抽象是对象的行为特征。
封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行封装隐藏。封装分为属性的封装和方法的封装。
继承:是对有着共同特性的多类事物,进行再抽象成一个类。这个类就是多类事物的父类。父类的意义在于抽取多类事物的共性。
多态:允许不同类的对象对同一消息做出响应。方法的重载、类的覆盖正体现了多态。

 

重载和重写的区别

重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类;如果父类方法访问修饰符为private则子类中就不是重写。

 

采用字节码的好处

Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。
所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。

 

构造器Constructor是否可被override

构造器不能被重写,不能用static修饰构造器,只能用public、private、protected这三个权限修饰符,且不能有返回语句。

 

访问控制符public,protected,private,以及默认的区别

 

是否可以继承String类

String类是final类故不可以继承,一切由final修饰过的都不能继承。

 

String和StringBuffer、StringBuilder的区别

可变性
String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[] value,这两种对象都是可变的。

线程安全性
String中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

性能
每次对String 类型进行改变的时候,都会生成一个新的String 对象,然后将指针指向新的String 对象。StringBuffer每次都会对StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StirngBuilder 相比使用StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

 

String s=new String("abc")创建了几个对象?

答案应该是1个或者2个。

1个的情况:如果字符串池中已经存在了"abc"这个对象,那么直接在创建一个对象放入堆中,返回str引用。

2个的情况:如果字符串池中未找到"abc"这个对象,那么分别在堆中和字符串池中创建一个对象,字符串池中的比较都是采用equals()方法。

 

equals和==的区别

对于值类型的数据都是用于比较相等;对于引用类型==判断对象是否同一个,equals是Object的成员函数,有些类会重写这个方法用来比较对象的等价性。

 

hashCode和equals方法的关系

equals相等,hashcode必相等;hashcode相等,equals可能不相等。重写equals方法必须重写hashCode方法。

hashCode()方法就是返回对象hash码。hash码用来快速比较两个对象是否等价。哈希值不等两个对象必定不等价,相等的话再做二次验证。重写equals方法的类,若两个对象相等hash值必须相等,但是默认的hashCode是根据对象地址计算的,所以必须重写hashCode方法来保持hash的一致性。

 

Java语言采用的编码方案

Java语言采用Unicode编码标准,Unicode(标准码),它为每个字符制订了一个唯一的数值,因此在任何的语言,平台,程序都可以放心的使用。

 

抽象类和接口的区别

语法层次
抽象类和接口分别给出了不同的语法定义。

设计层次
抽象层次不同,抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。

跨域不同
抽象类所体现的是一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is-a"关系,即父类和派生类在概念本质上应该是相同的。对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的,仅仅是实现了接口定义的契约而已,"like-a"的关系。

 

自动装箱与拆箱

装箱:将基本类型用它们对应的引用类型包装起来;

拆箱:将包装类型转换为基本数据类型;

Java使用自动装箱和拆箱机制,节省了常用数值的内存开销和创建对象的开销,提高了效率,由编译器来完成,编译器会在编译期根据语法决定是否进行装箱和拆箱动作。

 

Java对象的创建方式

new关键字;class类或constructor类的newInstance(通过反射);使用clone方法;反序列化

 

Java异常体系

Throwable 类是 Java 语言中所有错误或异常的超类。

Error 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获的严重问题

Exception 异常主要分为两类

运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

另一类是受查异常checkedException,RuntimeException以外的异常都属于该类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等。

 

异常使用注意的地方

  • 不要将异常处理用于正常的控制流;
  • 对于可以恢复的异常使用受检查异常,对于编程错误使用运行时异常;
  • 避免不必要的使用受检查异常;
  • 优先使用标准化异常;
  • 每个异常都有文档;
  • 保持异常的原子性;
  • 不要再catch中忽略捕获到的异常。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值