7.构造器 Constructor 是否可被 override?
8.再调用子类构造方法之前会先带调用父类没有参数的构造方法,其目的是?
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++的区别?
- C++ : 面向过程的高级语言:程序设计的基本单位是函数,
- Java: 面向对象的高级语言:程序设计的基本单位为类,纯面向对象的语言,所有代码(包括函数、变量)都必须在类中定义。
- C++支持多继承,Java中类都是单继承的。但是继承都有传递性,同时Java中的接口是多继承,类对接口的实现也是多实现。
- C++中,开发需要自己去管理内存,但是Java中JVM有自己的GC机制,虽然有自己的GC机制,但是也会出现OOM和内存泄漏的问题。C++中有析构函数,Java中Object的finalize方法。
- C++运算符可以重载,但是Java中不可以。同时C++中支持强制自动转型,Java中不行,会出现ClassCastException(类型不匹配)。
- 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中有那些常见的关键字?
|
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.再调用子类构造方法之前会先带调用父类没有参数的构造方法,其目的是?
- 继承父类, 就获得其成员变量,成员函数的使用。因此需要对这些成员变量做一些初始化工作。
- 父类初始化完成后,再接着初始化本身的成员变量。
- 子类构造器会默认调用 父类的无参构造器,如果父类没有无参构造器,则需在子类构造器的第一行显式地调用父类的其他构造器。
- 其次,从继承的思想来看,你继承一个类,就相当于扩展一个类,形成一个更为特殊的类,但经常,我们需要将子类向上转型为基类,以便使用或达到其他各种目的。
- 这时,如果你生成子类对象时没有调用父类的构造器,那么,我们在使用父类的一些成员变量的时候,就会报变量未初始化的错误。请记住,变量初始化总是在构造器调用之前完成!
- 构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量。子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。
9.接口和抽象类的区别是什么?
1).接口是用Interface修饰,而抽象类是用abstract修饰
2).接口中的方法都是抽象方法,抽象类中可以看抽象方法,也可以有普通方法
3).接口中只有常量,即抽象类中可以有常量也可以有普通变量
4).接口可以继承多个接口,而抽象类是单继承
5).接口中没有构造器,抽象类有构造器
6).抽象类和接口都不能被实例化
10.try-cath-finally
- 程序执行无异常:-->程序执行try块代码-->再执行finally块.
- 程序执行有异常:-->则执行catch块代码-->再执行finally语句中全部代码
- 不管有没有出现异常,finally块中代码都会执行,当try和catch中有return时,finally仍然会执行,finally提供了统一的出口
- finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
11.==和 equals 的区别是什么?
1).==是比较两个对象(引用)的地址是否相同
2).equals不被重写前和==的判断方式一样 ,重写之后equals( )是对字符串(对象)的内容进行比较
12.简单介绍一些Map
- Map是一个集和接口,是一种数据容器里面是键值对的形式,左列为key右列为value, key是唯一不可重复的 value是可重复的,每个key可以都有对应的value
- Map有三个常用实现类分别是 HashMap , LinkedHashMap , TreeMap.
- put( )添加元素方法,get( )获取元素方法,
- 遍历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()方法是在垃圾收集器删除对象之前对这个对象调用的。