捋顺java面试重点知识

目录

一、Java开发环境--一次编译,随处运行

1.JDK,JRE,JVM的关系

2.Java和C++的区别?

二、基本语法

1.关键字与标识符

1.1 java关键字

 1.2标识符

 2.变量的使用

2.1变量按数据类型分类

 2.2按声明位置分类

 2.3原码、反码、补码的说明

3.运算符

4.流程控制

4.1分支结构-if else、switch-case

4.2 循环结构

三、数组

四、面向对象-封装性

五、面向对象-继承性

1.为什么要有类的继承性?(继承性的好处)

2.继承性的格式:

3.子类继承父类以后有哪些不同?

4.Java中继承性的说明

5.方法的重写

六、面向对象-多态性

1.多态

2.多态性的使用:虚拟方法调用

3.多态性的使用前提

4.向下转型

4.1 instanceof 的使用

 七、面向对象-接口

八、异常

1. 异常的体系结构

2.异常的处理抓抛模型

3.异常处理方式一:try-catch-finally

4.异常处理方式二:throws+异常处理

5.异常处理的区别

6.手动抛出异常对象-throw


一、Java开发环境--一次编译,随处运行

1.JDK,JRE,JVM的关系

JDK能够创建和编译程序。

JRE 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的一些基础构件。但是,它不能用于创建新程序。

在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以, Java 程序运行时相对来说还是高效的(不过,和 C++,Rust,Go 等语言还是有一定差距的),而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。

java程序编写-编译-运行的过程:
编写:我们将编写的java代码保存在以".java"结尾的源文件中
编译:使用javac.exe命令编译我们的java源文件。格式:javac 源文件名.java
运行:使用java.exe命令解释运行我们的字节码文件。 格式:java 类名

2.Java和C++的区别?

Java 和 C++ 都是面向对象的语言,都支持封装、继承和多态。

  • Java 不提供指针来直接访问内存,程序内存更加安全
  • Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
  • Java 有自动内存管理垃圾回收机制(GC),不需要程序员手动释放无用内存。
  • C ++同时支持方法重载和操作符重载,但是 Java 只支持方法重载(操作符重载增加了复杂性,这与 Java 最初的设计思想不符)。

二、基本语法

1.关键字与标识符

1.1 java关键字

所有关键字都是小写,在IDE中会以特殊颜色显示。

 

 1.2标识符

定义:凡是自己可以起名字的地方都叫标识符

规则:(必须遵守)

规范: 

 2.变量的使用

2.1变量按数据类型分类

 2.2按声明位置分类

 2.3原码、反码、补码的说明

正数:三码合一
负数:

 计算机内部都是用补码方式储存数据

3.运算符

3.1.算术运算符: + - + - * / % (前)++ (后)++ (前)-- (后)-- +

3.2.赋值运算符:=  +=  -=  *=  /=  %=

3.3.比较运算符:== != >  <  >=  <=  instanceof

  • 比较运算符的结果是boolean类型
  • >  <  >=  <= :只能使用在数值类型的数据之间。
  • == 和 !=: 不仅可以使用在数值类型数据之间,还可以使用在其他引用类型变量之间。

3.4.逻辑运算符:& &&  |  || !  ^

与或单双的区别:当符号左边为true时,二者都会判断右边;当符号左边是false时,单目会判断右边,双目不会判断右边

3.5.位运算符:<<  >> >>> &  |  ^  ~

  • 位运算符操作的都是整型的数据
  • << :在一定范围内,每向左移1位,相当于 * 2   8<<1=8*2
       >> :在一定范围内,每向右移1位,相当于 / 2

3.6.三元运算符:(条件表达式)? 表达式1 : 表达式2

4.流程控制

4.1分支结构-if else、switch-case

4.1.1  if(条件表达式) {执行表达式1} else{表达式2}

if-else 是n选1

  • else 结构是可选的。
  • 如果多个条件表达式之间是“互斥”关系(或没有交集的关系),哪个判断和执行语句声明在上面还是下面,无所谓。
  • 如果多个条件表达式之间有交集的关系,需要根据实际情况,考虑清楚应该将哪个结构声明在上面。
  • 如果多个条件表达式之间有包含的关系,通常情况下,需要将范围小的声明在范围大的上面。否则,范围小的就没机会执行了。

4.1.2 switch(表达式){   case 常量1:执行语句1;//break .....  default 执行语句n;//break}

  • 根据switch表达式中的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应case结构中,调用其执行语句。
      当调用完执行语句以后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break关键字或此switch-case结构
      末尾结束为止。
  • break,可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构
  • switch结构中的表达式,只能是如下的6种数据类型之一:
       byte 、short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增)
  • case 之后只能声明常量。不能声明范围。
  • break关键字是可选的。
  • default:相当于if-else结构中的else

continue 是结束本次循环,break是跳出整个循环

4.2 循环结构

4.2.1 for循环结构

for(①;②;④){
    ③
}

执行过程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②

4.2.2 while循环结构


while(②){
    ③;
    ④;
}
执行过程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②

4.2.3  do-while循环


do{
    ③;
    ④;
}while(②);
执行过程:① - ③ - ④ - ② - ③ - ④ - ... - ②
do-while循环至少会执行一次循环体!
 

三、数组

数组的静态初始化

1.ids = new int[]{1001,1002,1003,1004};

2.int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};

四、面向对象-封装性

1.为什么要引入封装性?
我们程序设计追求“高内聚,低耦合”。
高内聚 :类的内部数据操作细节自己完成,不允许外部干涉;
低耦合 :仅对外暴露少量的方法用于使用。

隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。

2.权限从小到大顺序为:private <  缺省 < protected < public

3.具体的修饰范围:

五、面向对象-继承性

1.为什么要有类的继承性?(继承性的好处)


 * ① 减少了代码的冗余,提高了代码的复用性
 * ② 便于功能的扩展
 * ③ 为之后多态性的使用,提供了前提

2.继承性的格式:

class A extends B{}
 *    A:子类、派生类、subclass
 *    B:父类、超类、基类、superclass


3.子类继承父类以后有哪些不同?


3.1体现:一旦子类A继承父类B以后,子类A中就获取了父类B中声明的所有的属性和方法。
 *  特别的,父类中声明为private的属性或方法,子类继承父类以后,仍然认为获取了父类中私的结构。只因为封装性的影响,使得子类不能直接调用父类的结构而已。
3.2 子类继承父类以后,还可以声明自己特有的属性或方法:实现功能的拓展。
 *    子类和父类的关系,不同于子集和集合的关系。
 *    extends:延展、扩展

4.Java中继承性的说明


1)一个类可以被多个子类继承。
2)Java中类的单继承性:一个类只能有一个父类
3)子父类是相对的概念。
4)子类直接继承的父类,称为:直接父类。间接继承的父类称为:间接父类
5)子类继承父类以后,就获取了直接父类以及所间接父类中声明的属性和方法

5.方法的重写

子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作.
重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的是子类重写父类的方法。

重写规则:

方法的声明: 权限修饰符  返回值类型  方法名(形参列表) throws 异常的类型{
 *                         //方法体
 *                     }
 *         约定俗称:子类中的叫重写的方法,父类中的叫被重写的方法
 *         ① 子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同
 *         ② 子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符
 *          >特殊情况:子类不能重写父类中声明为private权限的方法
 *         ③ 返回值类型:
 *          >父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void
 *          >父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A类的子类
 *          >父类被重写的方法的返回值类型是基本数据类型(比如:double),则子类重写的方法的返回值类型必须是相同的基本数据类型(必须也是double)
 *        ④ 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型(具体放到异常处理时候讲)
 *    **********************************************************************
 *    子类和父类中的同名同参数的方法要么都声明为非static的(考虑重写,要么都声明为static的(不是重写)。    

六、面向对象-多态性

1.多态

  • 多态性的理解:可以理解为一个事物的多种形态。
  • 对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)
    举例:Person p = new Man();

2.多态性的使用:虚拟方法调用

  • 有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
  •  总结:编译,看左边;运行,看右边。

3.多态性的使用前提

  •  类的继承关系

  •  方法的重写

对象的多态性,只适用于方法,不适用于属性(编译和运行都看左边)

4.向下转型

有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。如何才能调用子类特的属性和方法?使用向下转型。

4.1 instanceof 的使用

a instanceof A:判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false。

 七、面向对象-接口

1.接口使用interface来定义
 * 2.Java中,接口和类是并列的两个结构
 * 3.如何定义接口:定义接口中的成员
 *         
 *         3.1 JDK7及以前:只能定义全局常量和抽象方法
 *             >全局常量:public static final的.但是书写时,可以省略不写
 *             >抽象方法:public abstract的
 *             
 *         3.2 JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法(略
 * 
 * 4. 接口中不能定义构造器的!意味着接口不可以实例化
 * 
 * 5. Java开发中,接口通过让类去实现(implements)的方式来使用.
 *    如果实现类覆盖了接口中的所抽象方法,则此实现类就可以实例化
 *    如果实现类没覆盖接口中所的抽象方法,则此实现类仍为一个抽象类
 *    
 * 6. Java类可以实现多个接口   --->弥补了Java单继承性的局限性
 *   格式:class AA extends BB implements CC,DD,EE
 *   
 * 7. 接口与接口之间可以继承,而且可以多继承
 * 
 * *******************************
 * 8. 接口的具体使用,体现多态性
 * 9. 接口,实际上可以看做是一种规范

八、异常

1. 异常的体系结构

* java.lang.Throwable
 *         |-----java.lang.Error:一般不编写针对性的代码进行处理。
 *         |-----java.lang.Exception:可以进行异常的处理
 *             |------编译时异常(checked)
 *                     |-----IOException
 *                         |-----FileNotFoundException
 *                     |-----ClassNotFoundException
 *             |------运行时异常(unchecked,RuntimeException)
 *                     |-----NullPointerException
 *                     |-----ArrayIndexOutOfBoundsException
 *                     |-----ClassCastException
 *                     |-----NumberFormatException
 *                     |-----InputMismatchException
 *                     |-----ArithmeticException

2.异常的处理抓抛模型

过程一:"抛":程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象。
 *           并将此对象抛出。
 *           一旦抛出对象以后,其后的代码就不再执行。
 *         
 *         关于异常对象的产生:① 系统自动生成的异常对象
 *                                          ② 手动的生成一个异常对象,并抛出(throw
 * 
过程二:"抓":可以理解为异常的处理方式:① try-catch-finally  ② throws

3.异常处理方式一:try-catch-finally


 *         //可能出现异常的代码
 * 
 * }catch(异常类型1 变量名1){
 *         //处理异常的方式1
 * }catch(异常类型2 变量名2){
 *         //处理异常的方式2
 * }catch(异常类型3 变量名3){
 *         //处理异常的方式3
 * }
 * ....
 * finally{
 *         //一定会执行的代码
 * }
 * 
 * 说明:
 * 1. finally是可的。
 * 2. 使用try将可能出现异常代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配
 * 3. 一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常的处理。一旦处理完成,就跳出当前的try-catch结构(在没写finally的情况。继续执行其后的代码
 * 4. catch中的异常类型如果没子父类关系,则谁声明在上,谁声明在下无所谓。
 *    catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类的上面。否则,报错
 * 5. 常用的异常对象处理的方式: ① String  getMessage()    ② printStackTrace()
 * 6. 在try结构中声明的变量,再出了try结构以后,就不能再被调用
 * 7. try-catch-finally结构可以嵌套

finally中的代码是一定会被执行的,主要用于手动的进行资源的释放。

4.异常处理方式二:throws+异常处理

异常往上抛

"throws + 异常类型"写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。
一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。异常代码后续的代码,就不再执行!

5.异常处理的区别

try-catch-finally:真正的将异常给处理掉了。
throws的方式只是将异常抛给了方法的调用者。并没真正将异常处理掉。

6.手动抛出异常对象-throw

异常处理的两种方式是负责”抓“异常,throw是抛异常

throw 和  throws区别:
throw 表示抛出一个异常类的对象,生成异常对象的过程。声明在方法体内。
throws 属于异常处理的一种方式,声明在方法的声明处。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值