Java必须要掌握的基本问题
1.如何理解面向过程和面向对象
面向过程:分析出解决问题所需要的步骤,然后用函数把这些步骤实现,使用的时候一个一个调用。
优点:性能比面向对象高,因为类的调用需要实例化,开销大;多用在单片机,嵌入式开发。
缺点:没有面向对象容易维护、复用和扩展
面向对象:把构成问题的事务分成各个对象,通过属性和方法来描述对象。也就是以功能来划分问题,而不是步骤。
优点:容易扩展、复用,由于面向对象有封装、继承、多态的特性,可以设计出低耦合的系统。
缺点:比面向过程性能低。
2. Java 语言有哪些特点
- 面向对象(封装、继承、多态)
- 平台无关性 jvm 编译器产生的目标代码针对并不存在的cpu-JVM,能够掩盖不同CPU之间的区别
- 安全性 指针和内存释放等功能被删除,避免了非法内存操作
- 支持多线程
- 动态
3. 关于 JVM JDK 和 JRE 最详细通俗的解答
JVM是运行java字节码的虚拟机,针对不同操作系统有不同实现。

JDK:有JRE所拥有的一切,还有编译器(javac)和工具(javadoc);可以创建和编译程序。
JRE:java运行时环境。包括jvm,java类库,java命令等。
5. Java和C++的区别
- 都是面向对象,都支持封装、继承和多态
- java不提供指针直接访问内存,程序内存更加安全
- java的类是单继承的,C++支持多继承;java的接口可以多继承
- java有自动内存管理机制,不需要手动释放无用内存
6. 什么是 Java 程序的主类 应用程序和小程序的主类有何不同
一个程序中可以有多个类,但是只能有一个类是主类。
8. 字符型常量和字符串常量的区别
形式上:括号
含义上:字符常量相当于1个整型值,而字符串常量代表1个地址值
内存上:字符常量只占2个字节,而字符串常量占若干个字节。
注意:java每种数据类型所占存储空间具有不变性!!!
| 基本类型 | 大小 | 最小值 | 最大值 | 包装器类型 |
| boolean | ||||
| char | 16 | unicode 0 | unicode 216-1 | Charactor |
| byte | 8 | -128 | 127 | Byte |
| short | 16 | -215 | 215-1 | |
| int | 32 | -231 | 231-1 | |
| long | 64 | -263 | 263-1 | |
| float | 32 | |||
| double | 64 |
9. 构造器 Constructor 是否可被 override
父类的私有属性和构造方法不能被继承,所以不能重写,但是可以重载。
10. 重载和重写的区别
重载:发生在1个类中,方法名不同,参数类型,参数个数不同返回值也可以不同;
重写:发生在父子类中,方法和参数名必须相同。如果父类方法访问修饰符为private,则子类不能重写该方法。
11. Java 面向对象编程三大特性: 封装 继承 多态
封装:对象属性私有化,对外提供访问方法。
继承:继承已经存在的类。
1.子类拥有父类非private的属性和方法
2.子类可以拥有自己的属性和方法
多态:继承(多个子类对同一方法的重写)、接口(实现接口方法)
12. String StringBuffer 和 StringBuilder 的区别是什么 String 为什么是不可变的
可变性
String类中使用了final关键字字符组保存字符串,所以String对象不可变。
而StringBuffer 和 StringBuilder都继承自AbstractStringBuilder类,在这个类中,字符数组没有用final关键字修饰,所以这两个对象是可变的。
线程安全性
string:对象不可变,线程安全。
AbstractStringBuilder 定义了字符串的一些基本操作:append insert indexOf
StringBuffer :对以上方法加了同步锁,线程安全
StringBuilder:非线程安全
性能
每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
总结
1.操作少量的数据=string
2.单线程操作大量数据=strinBuilder
3.多线程操作大量数据=stringBuffer
13. 自动装箱与拆箱
装箱:将基本类型用对应的引用类型包装起来。
拆箱:将包装类型转换为基本数据类型。
14. 在一个静态方法内调用一个非静态成员为什么是非法的
因为静态方法可以不通过对象进行调用
15. 在 Java 中定义一个不做事且没有参数的构造方法的作用
如果父类定义了有参的构造函数,而子类有没有用super方法调用,则会编译出错,为了防止出错,定义1个无参构造函数。
17. 接口和抽象类的区别是什么
-
接口的方法默认是public,所有方法在接口中不能有实现(jdk8中可以有默认实现),抽象类可以有非抽象的方法。
- 接口中的实例变量默认是final类型的,而抽象类中不一定
- 一个类可以实现多个接口
- 一个类要实现接口就必须实现接口的所有方法
- 接口是行为的抽象,抽象是对类的抽象
18. 成员变量与局部变量的区别有那些
语法上:成员变量是属于类的,而局部变量是在方法中调用的,而且局部变量不能被访问修饰符修饰
存储方式:成员变量被static修饰了,属于类,没有被static修饰,属于实例,对象放在堆内存;局部变量放在栈内存。
生存时间:成员变量随对象的创建而存在,而局部变量随方法的调用而自动消失。
19. 创建一个对象用什么运算符?对象实体与对象引用有何不同?
new 对象实体放在堆内存中,对象引用指向对象实体。
25. 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?
帮助子类做初始化工作。
26. == 与 equals(重要)
== 判断两个对象的地址是否相等,也就是判断两个对象是不是同一个对象。
基本数据类型==比较的是值,引用数据类型比较的是内存地址。
equals 两种使用情况
1.没有覆盖equals方法,等价于==
2.覆盖了,一般用来比较两个对象的内容是否相等。
注意:string中的equals方法是被重写过的,比较的是对象的值。
27. hashCode 与 equals (重要)
hashcode(),java中任何类都包含这个函数,确定对象在哈希表中的索引位置。
hashset检查重复:计算哈希值,在调用equals方法。
为什么重写equals方法必须重写hashcode方法?
如果两个对象相等,则hashcode一定相同;但是两个对象有相同的哈希值,这两个对象并不一定相同。
28. 为什么Java中只有值传递???
把实参对象引用的地址当做值传递给了形式参数。
30. 线程有哪些基本状态?
线程创建之后它将处于 NEW(新建) 状态,调用 start() 方法后开始运行,线程这时候处于 READY(可运行) 状态。可运行状态的线程获得了 cpu 时间片(timeslice)后就处于 RUNNING(运行) 状态。
当线程执行 wait()方法之后,线程进入 WAITING(等待)状态。进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态,而 TIME_WAITING(超时等待) 状态相当于在等待状态的基础上增加了超时限制,比如通过 sleep(longmillis)方法或 wait(longmillis)方法可以将 Java 线程置于 TIMED WAITING 状态。当超时时间到达后 Java 线程将会返回到 RUNNABLE 状态。当线程调用同步方法时,在没有获取到锁的情况下,线程将会进入到 BLOCKED(阻塞) 状态。线程在执行 Runnable 的 run()方法之后将会进入到 TERMINATED(终止) 状态。
31 关于 final 关键字的一些总结
变量:基本数据类型 引用类型
方法:把方法锁定;
类:不能被继承
32 Java 中的异常处理

在以下4种特殊情况下,finally块不会被执行:
-
在finally语句块第一行发生了异常。 因为在其他行,finally块还是会得到执行
-
在前面的代码中用了System.exit(int)已退出程序。 exit是带参函数 ;若该语句在异常语句之后,finally会执行
-
程序所在的线程死亡。
-
关闭CPU。
33 Java序列化中如果有些字段不想进行序列化 怎么办
transient关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被transient修饰的变量值不会被持久化和恢复。transient只能修饰变量,不能修饰类和方法。
34 获取用键盘输入常用的的两种方法


浙公网安备 33010602011771号