0731-88031769

学院新闻

Campus news
首页 学院新闻 正文

知识分享 | JAVA基础面试必读!你都会吗?

JAVA知识分享

 

这是一个,任何人的努力都会被看到的年代。在这个年代,只要你坚持到底,决不放弃,你就有机会成功。而这个年代也是充满知识的年代,读万卷书,行万里路,知识永远战胜愚昧。

    这不,学习知识的机会不是来了吗?下面是小编整理的一些关于JAVA的知识,小伙伴们赶快行动起来吧!

NO.1

Java语言有哪些特点

1.简单易学;

2.面向对象(封装,继承,多态);

3.平台无关性(Java虚拟机实现平台无关性);

4.可靠性;

5.安全性;

NO. 2

Java 基础知识(一)

1、字符型常量和字符串常量的区别

(1)形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符;

(2)含义上: 字符常量相当于一个整形值( ASCII 值),可以参加表达式运算 字符串常量代表一个地址值(该字符串在内存中存放位置)

(3)占内存大小 字符常量只占 2 个字节 字符串常量占若干个字节(至少一个字符结束标志) (注意:char 在 Java 中占两个字节) 

2、 构造器 Constructor 是否可被 override

在讲继承的时候我们就知道父类的私有属性和构造方法并不能被继承,所以Constructor 也就不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多个构造函数的情况。

3、重载和重写的区别

    重载: 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。

    重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符,范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。

NO.3

Java 基础知识(二)

1、import java 和 javax 有什么区别?

刚开始的时候 JavaAPI 所必需的包是 java 开头的包,javax 当时只是扩展API 包来说使用。然而随着时间的推移,javax 逐渐的扩展成为 Java API 的组成部分。但是,将扩展从 javax 包移动到 java 包将是太麻烦了,最终会破坏一堆现有的代码。因此,最终决定 javax 包将成为标准 API 的一部分。所以,实际上 java 和 javax 没有区别。这都是一个名字。

2、接口和抽象类的区别是什么?

   (1)接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),抽象类可以有非抽象的方法;

(2)接口中的实例变量默认是 final 类型的,而抽象类中则不一定;

(3)一个类可以实现多个接口,但最多只能实现一个抽象类;

(4)一个类实现接口的话要实现接口的所有方法,而抽象类不一定;

(5) 接口不能用 new 实例化,但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。

NO.4

Java 基础知识(三)

1、JDK和JRE

JDK是JavaDevelopmentKit,它是功能齐全的JavaSDK。它拥有JRE所拥有的一切,还有编译器(javac)和工具(如javadoc和jdb)。它能够创建和编译程序。JRE是Java运行时环境。它是运行已编译Java程序所需的所有内容的集合,包括Java虚拟机(JVM),Java类库,java命令和其他的一些基础构件。但是,它不能用于创建新程序。如果你只是为了运行一下Java程序的话,那么你只需要安装JRE就可以了。如果你需要进行一些Java编程方面的工作,那么你就需要安装JDK了。但是,这不是绝对的。有时,即使您不打算在计算机上进行任何Java开发,仍然需要安装JDK。例如,如果要使用JSP部署Web应用程序,那么从技术上讲,您只是在应用程序服务器中运行Java程序。那为什么需要JDK呢?因为应用程序服务器会将JSP转换为Javaservlet,并且需要使用JDK来编译servlet.

NO.5

Java 基础知识(四)

1、 成员变量与局部变量的区别有哪些?

(1)从语法形式上,看成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰;

(2)从变量在内存中的存储方式来看,成员变量是对象的一部分,而对象存在于堆内存,局部变量存在于栈内存;

(3)从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失;

(4)成员变量如果没有被赋值,则会自动以类型的默认值而赋值(一种情况例外被 final 修饰的成员变量也必须显示地赋值);而局部变量则不会自动赋值。

2、 创建一个对象用什么运算符?对象实体与对象引用有何不同?

new 运算符,new 创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。一个对象引用可以指向 0 个或 1 个对象(一根绳子可以不系气球,也可以系一个气球);一个对象可以有 n 个引用指向它(可以用 n 条绳子系住一个气球)。

NO.6

Java 基础知识(五)

1、什么是方法的返回值?返回值在类的方法里的作用是什么?

方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果)。返回值的作用:接收出结果,使得它可以用于其他的操作!

2、一个类的构造方法的作用是什么?若一个类没有声明构造方法,该程序能正确执行吗 ?为什么?

主要作用是完成对类对象的初始化工作。可以执行。因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。

NO.7

Java 基础知识(六)

1、== 与 equals(重要)

== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:(1)类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。(2)类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

举个例子:

public class test1 {

public static void main(String[] args) {

String a = new String("ab"); // a 为一个引用

String b = new String("ab"); // b 为另一个引用,对象的内容一样

String aa = "ab"; // 放在常量池中

String bb = "ab"; // 从常量池中查找

if (aa == bb) // true

System.out.println("aa==bb");

if (a == b) // false,非同一对象

System.out.println("a==b");

if (a.equals(b)) // true

System.out.println("aEQb");

if (42 == 42.0) { // true

System.out.println("true");

}

说明:

String 中的 equals 方法是被重写过的,因为 object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是对象的值。

     当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象。

3、构造方法有哪些特性?

(1)名字与类名相同;

(2)没有返回值,但不能用 void 声明构造函数;

 (3)生成类的对象时自动执行,无需调用。

4、静态方法和实例方法有何不同?

(1)在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。

(2)静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。

NO.8

Java 基础知识(七)

1、 hashCode 与 equals(重要)

面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写 equals时必须重写 hashCode 方法?”

hashCode()介绍

hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode()定在 JDK 的 Object.java 中,这就意味着 Java 中的任何类都包含有 hashCode() 函数。散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)

为什么要有 hashCode?

我们以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的 Java 启蒙书《Headfirst java》第二版)。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。

hashCode()与 equals()的相关规定:

(1)如果两个对象相等,则 hashcode 一定也是相同的。

(2)两个对象相等,对两个对象分别调用 equals 方法都返回 true。(3)两个对象有相同的 hashcode 值,它们也不一定是相等的。因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖。

(4)hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)

NO.9

Java 基础知识(八)

1、简述线程,程序、进程的基本概念。以及他们之间关系是什么?

线的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

程序是含有指令和数据程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。

进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如 CPU 时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。

NO.10

Java 基础知识(六)

1、对象的相等与指向他们的引用相等,两者有什么不同?

对象的相等,比的是内存中存放的内容是否相等。而引用相等,比较的是他们指向的内存地址是否相等。

2、在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?

帮助子类做初始化工作。

3、线程有哪些基本状态?

参考《Java 并发编程艺术》4.1.4 节。Java 线程在运行的生命周期中的指定时刻只可能处于下面 6 种不同状态的其中一个状态。线程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换。

4、关于 final 关键字的一些总结

final 关键字主要用在三个地方:变量、方法、类。

(1)对于一个 final 变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

(2)当用 final 修饰一个类时,表明这个类不能被继承。final 类中的所有成员方法都会被隐式地指定为 final 方法。

(3)使用 final 方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的 Java 实现版本中,会将final 方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的 Java 版本已经不需要使用 final 方法进行这些优化了)。类中所有的 private 方法都隐式地指定为 final。

NO.11

Java 基础知识(十)

1、Java 序列化中如果有些字段不想进行序列化 怎么办?

对于不想进行序列化的变量,使用 transient 关键字修饰;

transient 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;

当对象被反序列化时,被 transient 修饰的变量值不会被持久化和恢复;transient 只能修饰变量,不能修饰类和方法。

2、获取用键盘输入常用的的两种方法

方法 1:

通过 Scanner

Scannerinput = new Scanner(System.in);

String s = input.nextLine();

input.close();

方法 2:

通过BufferedReader

BufferedReaderinput=new BufferedReader(new InputStreamReader(System.in));

 

一分耕耘

一分收获

要收获的好

必须耕耘的好

 

资料整理 / 新媒体工作室--朱鹏波

24小时课时咨询:0731-88031769课程培训电话:0731-88031769

地址:长沙市天心区赤岭路45号长沙理工大学金盆岭校区14栋教学楼校企合作思文部

QQ :1105254908

扫一扫微博二维码
扫一扫微博二维码

湖南思文佳创教育科技有限公司(www.swedu.net)版权所有 湘ICP备2023014477号