Java菜鸟补给站--常见面试简答题( 一 )

                 1.关于JDK,JRE 和 JVM的认识理解

2.Java 和 c++的区别?

3.Java 应用程序与小程序之间有那些差别?

4.字符型常量和字符串常量的区别?

5. Java中有那些常见的关键字?

6.方法的四种类型

7.构造器 Constructor 是否可被 override?

8.再调用子类构造方法之前会先带调用父类没有参数的构造方法,其目的是?

9.接口和抽象类的区别是什么?

10.try-cath-finally

11.==和 equals 的区别是什么?

12.简单介绍一些Map

13.final ,finally ,finalize()区别


1.关于JDK,JRE 和 JVM的认识理解

  • JDK: JDK(Java Development Kit) 是整个JAVA的核心,Java开发工具包   包含JRE和编译运行等命令工具 ,开发Java程序的最小环境,基本上每个学java的人都会先在机器 上装一个JDK,那他都包含哪几部分呢?在目录下面有 六个文件夹、一个src类库源码压缩包、和其他几个声明文件。其中,真正在运行java时起作用的 是以下四个文件夹:bin、include、lib、 jre。有这样一个关系,JDK包含JRE,而JRE包 含JVM。
     
      bin:最主要的是编译器(javac.exe)
      include:java和JVM交互用的头文件
      lib:类库
      jre:java运行环境

(注意:这里的bin、lib文件夹和jre里的bin、lib是 不同的)

总的来说JDK是用于java程序的开发,而JRE则是只能运行class而没有编译的功能。

  • JRE: JRE(Java Runtime Environment),Java运行环境  包含JVM和Java系统类库小零件( Java核心类库 ),运行Java程序的最小环境,JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),JRE是指java运行环境。编写的Java程序也必须要JRE才能运行。
  • JVM:JVM(Java Virtual Machine),即java虚拟机,加载(.class)文件并运行(.class)文件,Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。

2.Java 和 c++的区别?

  1.  C++ : 面向过程的高级语言:程序设计的基本单位是函数,
  2. Java: 面向对象的高级语言:程序设计的基本单位为类,纯面向对象的语言,所有代码(包括函数、变量)都必须在类中定义。
  3. C++支持多继承,Java中类都是单继承的。但是继承都有传递性,同时Java中的接口是多继承,类对接口的实现也是多实现。
  4. C++中,开发需要自己去管理内存,但是Java中JVM有自己的GC机制,虽然有自己的GC机制,但是也会出现OOM和内存泄漏的问题。C++中有析构函数,Java中Object的finalize方法。
  5.  C++运算符可以重载,但是Java中不可以。同时C++中支持强制自动转型,Java中不行,会出现ClassCastException(类型不匹配)。
  6. C++比Java执行速度快,但是Java可以利用JVM跨平台。

3.Java 应用程序与小程序之间有那些差别?

一个程序中可以有多个类,但只能有一个类是主类。

  • 在 Java 应用程序中,这个主类是指包含 main()方法的类。
  • 在 Java 小程序中,这个主类是一个继承自系统类 JApplet 或 Applet 的子类。

应用程序的主类不一定要求是 public 类,但小程序的主类要求必须是 public 类。
主类是 Java 程序执行的入口点。

简单说应用程序是从主线程启动(也就是 main() 方法)。applet 小程序没有 main() 方法,主要是嵌在浏览器页面上运行(调用**init()或者run()**来启动),嵌入浏览器这点跟 flash 的小游戏类似。

4.字符型常量和字符串常量的区别?

  • 形式上: 字符常量是单引号引起的一个字符; 字符串常量是双引号引起的若干个字符
  • 含义上: 字符常量相当于一个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表一个地址值(该字符串在内存中存放位置)
  • 占内存大小 字符常量只占2个字节; 字符串常量占若干个字节(至少一个字符结束标志) (注意: char在Java中占两个字节)

5. Java中有那些常见的关键字?

关键字 含义
abstract 表明类或者成员方法具有抽象属性
assert 断言,用来进行程序调试
boolean 基本数据类型之一,声明布尔类型的关键字
break 提前跳出一个块
byte 基本数据类型之一,字节类型
case 用在switch语句之中,表示其中的一个分支
catch 用在异常处理中,用来捕捉异常
char 基本数据类型之一,字符类型
class 声明一个类
const 保留关键字,没有具体含义
continue 回到一个块的开始处
default 默认,例如,用在switch语句中,表明一个默认的分支。Java8 中也作用于声明接口函数的默认实现
do 用在do-while循环结构中
double 基本数据类型之一,双精度浮点数类型
else 用在条件语句中,表明当条件不成立时的分支
enum 枚举
extends 表明一个类型是另一个类型的子类型。对于类,可以是另一个类或者抽象类;对于接口,可以是另一个接口
final 用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变,用来定义常量
finally 用于处理异常情况,用来声明一个基本肯定会被执行到的语句块
float 基本数据类型之一,单精度浮点数类型
for 一种循环结构的引导词
goto 保留关键字,没有具体含义
if 条件语句的引导词
implements 表明一个类实现了给定的接口
import 表明要访问指定的类或包
instanceof 用来测试一个对象是否是指定类型的实例对象
int 基本数据类型之一,整数类型
interface 接口
long 基本数据类型之一,长整数类型
native 用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的
new 用来创建新实例对象
package
private 一种访问控制方式:私用模式
protected 一种访问控制方式:保护模式
public 一种访问控制方式:共用模式
return 从成员方法中返回数据
short 基本数据类型之一,短整数类型
static 表明具有静态属性
strictfp 用来声明FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754算术规范
super 表明当前对象的父类型的引用或者父类型的构造方法
switch 分支语句结构的引导词
synchronized 表明一段代码需要同步执行
this 指向当前实例对象的引用
throw 抛出一个异常
throws 声明在当前定义的成员方法中所有需要抛出的异常
transient 声明不用序列化的成员域
try 尝试一个可能抛出异常的程序块
void 声明当前成员方法没有返回值
volatile 表明两个或者多个变量必须同步地发生变化
while 用在循环结构中

 

Java关键字 ( https://baike.baidu.com/item/java%E5%85%B3%E9%94%AE%E5%AD%97/5808816?fr=aladdin)

6.方法的四种类型

 1、无参无返回值

public void methodName(){

}

2、无参有返回值

public int methodName(){
     return 1;
}

3、有参无返回值

public void methodName(String name){

}

4.有参有返回值

 public int methodName(String name){
        return 1;
}

7.构造器 Constructor 是否可被 override?

 构造器Constructor不能被继承,因此不能被重写(Override),但是可以被重载(Overload)

如果父类自定义了有参构造函数,则子类无论定义构造函数与否,定义有参构造函数与否,都会报错,正确的做法是在子类的构造方法中添上super(参数),以表明子类构造之前先构造父类,而这句话必须放在第一句,否则报"Constructor call must be the first statement in a constructor"的错误。
类的加载顺序:
  首先执行 父类的静态代码块/初始化静态变量(两者优先级相同),然后执行子类的静态代码/初始化静态变量(两者优先级相同,谁写在前面谁先执行),然后初始化父类成员变量/执行代码块{}(两者优先级相同),接着父类的构造器,然后子类的成员变量/代码块,最后子类的构造器。

8.再调用子类构造方法之前会先带调用父类没有参数的构造方法,其目的是?

  1. 继承父类, 就获得其成员变量,成员函数的使用。因此需要对这些成员变量做一些初始化工作。
  2. 父类初始化完成后,再接着初始化本身的成员变量。
  3.  子类构造器会默认调用 父类的无参构造器,如果父类没有无参构造器,则需在子类构造器的第一行显式地调用父类的其他构造器。
  4. 其次,从继承的思想来看,你继承一个类,就相当于扩展一个类,形成一个更为特殊的类,但经常,我们需要将子类向上转型为基类,以便使用或达到其他各种目的。
  5. 这时,如果你生成子类对象时没有调用父类的构造器,那么,我们在使用父类的一些成员变量的时候,就会报变量未初始化的错误。请记住,变量初始化总是在构造器调用之前完成!
  6. 构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量。子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。

9.接口和抽象类的区别是什么?

   1).接口是用Interface修饰,而抽象类是用abstract修饰

   2).接口中的方法都是抽象方法,抽象类中可以看抽象方法,也可以有普通方法

   3).接口中只有常量,即抽象类中可以有常量也可以有普通变量

   4).接口可以继承多个接口,而抽象类是单继承

   5).接口中没有构造器,抽象类有构造器

   6).抽象类和接口都不能被实例化

10.try-cath-finally

  1. 程序执行无异常:-->程序执行try块代码-->再执行finally块.
  2. 程序执行有异常:-->则执行catch块代码-->再执行finally语句中全部代码
  3. 不管有没有出现异常,finally块中代码都会执行,当try和catch中有return时,finally仍然会执行,finally提供了统一的出口
  4. finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

11.==和 equals 的区别是什么?

   1).==是比较两个对象(引用)的地址是否相同

   2).equals不被重写前和==的判断方式一样 ,重写之后equals( )是对字符串(对象)的内容进行比较

 12.简单介绍一些Map

  1. Map是一个集和接口,是一种数据容器里面是键值对的形式,左列为key右列为value, key是唯一不可重复的 value是可重复的,每个key可以都有对应的value 
  2. Map有三个常用实现类分别是 HashMap , LinkedHashMap , TreeMap.
  3. put( )添加元素方法,get( )获取元素方法,
  4. 遍历Map的三种方式
  • 遍历所有键 key    
  • 遍历所有值 value    
  • 遍历所有键值对 entry   
        /*
		 *Set keySet()
		 * 将当前Map中所有的key以一个Set集合形式返回,遍历该集合等于遍历所有key
		 */
		Set<String> keySet = map.keySet();
		for(String key: keySet){
			System.out.println("key:"+key);
		}
		/*
		 * 遍历每一组键值对
		 * Set<Entry> entrySet();
		 * 
		 * java.util.Map.Entry
		 * Entry的每一个实例表示Map的一组键值对,其中提供了两个常用方法:
		 * getKey 和 getValue 分别用来获取 对应key 和value
		 */
		Set<Entry<String,Integer>> entrySet = map.entrySet();
		for(Entry<String,Integer> e : entrySet){
			String key = e.getKey();
			Integer value = e.getValue();
			System.out.println(key+":"+value);
		}
		
		/**
		 * 遍历所有value
		 * Collection values();
		 * 该方法会将当前Map中所有的value以一个集合形式返回
		 */
		
		Collection<Integer> values = map.values();
		for(Integer value: values){
			System.out.println(value);
		}

13.final ,finally ,finalize()区别

   1).final 是修饰符

      1.1).修饰变量不能被改变.

      1.2).修饰方法不能被重写.

      1.3).修饰类不能被继承.

    2).finally

  • 只能用于try/catch语句中,附带着一个语句块,表示这个语句块最终总是会被执行,是异常捕获机制中必定会执行语句,可直接放在try语句之后也可以放在最后一个catch后面.。return,continue,break也都无法阻止finally语句块的执行,finally语句块会在他们之前执行。

3).finalize

  • finallize:是方法名,是Object提供的的实例方法,finalize()方法是在GC清理它所从属的对象时被调用的。当对象不再被任何对象引用时,GC会调用该对象的daofinalize()方法
  • java技术允许使用finalize()方法在垃圾收集器将对象从内存清除出去之前做必要的清理工作。这个方法是在垃圾收集器确认一个对象没有被引用时,对这个对象调用的。它是在Objec类中定义的,因此所有的类都继承它,子类覆盖了finalize()方法移整理系统资源或执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。

猜你喜欢

转载自blog.csdn.net/c202003/article/details/107239000
今日推荐