Java基础·疑难点


2019-08-03  19:51:39  by冲冲

1. 部分Java关键字

instanceof:用来测试一个对象是否是指定类型的实例。

native:用来声明一个方法是由与计算机相关的语言(C/C++/FORTRAN语言)实现的。

(1)break、continue

break:①switch判断语句中,用于跳出switch语句体。②一个循环体中,用于跳出该循环体。

注意:当循环体中包含switch语句,若break在switch语句中,则用于结束switch语句;若想用于结束该循环体,则在switch体外设置break。

continue:仅结束本次循环,然后开始下一次循环。(跳过本次循环体中余下未执行的语句,立即进行下一次循环条件的判定)

(2)final、finally

final:声明为最终,表明一个final类不能派生子类、或者一个final方法不能被覆盖,或者一个final成员的不能改变值。(String类就是一个final类)

finally:用于在处理异时,声明一个肯定会被执行到的语句块。fianlly块不被执行的情况

注意

① final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法

② 当你不希望该方法在子类中被覆盖时声明其为final。父类的final方法不能被子类重写,但是可以被重载。需要注意的是,因为重写的前提是子类可以从父类中继承此方法,如果父类中final修饰的方法其访问控制权限为private,将会导致子类中不能直接继承到此方法,因此可以在子类中定义相同的方法名和参数,此时不再产生重写与final的矛盾,而是在子类中重新定义了新的同名方法,该方法属于子类本身的方法。(注:类的private方法会隐式地被指定为final方法。)

③ final成员变量表示常量,只能被赋值一次,赋值后值不再改变当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。本质上是一回事,因为引用的值是一个地址,final要求值,即地址的值不发生变化。

④ final修饰一个成员变量(属性),必须要显示初始化。这里有两种初始化方式,一种是在变量声明的时候初始化;第二种方法是在声明变量的时候不赋初值,但是要在这个变量所在的类的所有的构造函数中对这个变量赋初值。当参数的类型声明为final时,说明该参数是只读型的。即你可以读取使用该参数,但是无法改变该参数的值。

浅谈Java中的final关键字  

(3)super、this

super:表示当前对象的父类型引用,或者父类型的构造方法。
this:表示当前对象的引用,或者当前对象的构造方法。

注意

① 如果通过this关键字调用其他构造方法时,this()语句必须是该构造方法的第一个子句,否则编译器会报错。也就是说,在构造方法中只能调用一次this([参数]),第二个子句不能再使用this

如果该构造方法没有显式地通过this调用其他构造方法,那么编译器不会自动为它添加默认的this()方法调用,但是会自动为它加上一个默认的super()方法调用

③ 如果该构造方法没有显式地调用父类的构造方法,那么编译器会自动为它加上一个默认的super()方法调用。如果父类没有默认的无参构造方法,编译器就会报错,super()语句必须是该构造方法的第一个子句。每个子类构造方法的第一条语句,都是隐含地调用super(),如果该子类构造器的第一句是this([参数n]),那么该this([参数n])方法的第一句就得显式或隐式调用super()。如果还是this([参数n])的第一句还是this([参数m]),那么该this([参数m])方法的第一句就得显式或隐式调用super(),依次类推...

④ this()和super()表示的都是对象,所以都不能在static环境中使用。包括:static变量、static方法、static语句块。

class Creature {
public Creature(){
// 这里会自动调用最终父类的默认构造器 Object()
System.out.println("初始化一个生物");
}
} class Animal extends Creature {
public Animal(){
// 这里会自动调用父类Creature的默认构造器 super()
System.out.println("初始化一个动物");
} public Animal(int head){
this();
this.head = head;
System.out.println("该动物有"+head+"个头");
} public Animal(int head, int nose){
//this(); this只能调用一个
this(head);
this.nose = nose;
System.out.println("该动物有"+head+"个头和"+nose+"个鼻子");
}
}

(4)throw、throws

throw:出现在函数体内,表示抛出一个异常。
throws:出现在函数头,用于声明在当前方法中所有需要抛出的异常。

通常情况,当程序的语句出现异常时,系统会被动地自动抛出异常。

1 public static void main(String[] args) {
2 int a = 5, b =0;
3 System.out.println(5/b);
4 }
5 /**************
6 系统会自动抛出ArithmeticException异常,程序意外中止
7 ***************/

① throw表示主动抛出一个异常,通常发生在代码块的内部,当程序出现某种逻辑错误时由程序员主动抛出某种特定类型的异常。

 1 public static void main(String[] args) {
2 String s = "abc";
3 if(s.equals("abc")) {
4 throw new NumberFormatException();
5 } else {
6 System.out.println(s);
7 }
8 }
9 /************
10 控制台显示:
11 Exception in thread "main" java.lang.NumberFormatException at......
12 *************/

② throws用于声明方法可能抛出的异常。

public void function() throws Exception{......}

当某个方法可能会抛出某种异常时用throws 声明可能抛出的异常,然后交给上层调用它的方法程序处理。

 1 public class testThrows {
2
3 public static void function() throws NumberFormatException {
4 String s = "abc";
5 System.out.println(Double.parseDouble(s));
6 }
7
8 public static void main(String[] args) {
9 try {
10 function();
11 } catch (NumberFormatException e) {
12 System.err.println("非数据类型不能强制类型转换。");
13 //e.printStackTrace();
14 }
15 }
16 }
17 /************
18 控制台显示:
19 非数据类型不能强制类型转换。
20 *************/

throw和throws 两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),它们只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用者来处理。

通常情况,程序对可能会出现异常的部分,要用try{...}catch{...}去捕捉它,并在catch{...}中对该异常进行处理。处理的方式可以是一句简单的输出语句,可以是栈输出e.printStackTrace(); ,或者其它。

如果是捕捉IO输入输出流中的异常,一定要在try{...}catch{...}后加finally{...}把输入输出流关闭。

如果在函数体内用throw抛出某种异常,最好要在函数名中用throws对抛出的异常进行声明,然后交给调用它的上层函数通过catch{...}进行处理。

(5)synchronized、volatile

synchronized:表示一段代码需要同步执行。
volatile:表示两个或多个变量必须同步地发生变化。

2. break自定义标签跳转

 1 public class Test {
2 public static void main(String[] args) {
3 int i, j;
4 first: for (i = 4; i > 1; i--) {
5 second: for (j = 4; j > 1; j--) {
6 if (j == 2) {
7 break first;
8 }
9 System.out.println(i + "-" + j);
10 }
11 }
12 }
13 }
14
15 /****************
16 输出结果:
17 4-4
18 4-3
19 *****************/

3. try、catch、finally的搭配

try语句后面必须要有一个别的语句(catch块或者finally块)跟在后面。try-catch、try-catch-finally、try-finally。其中catch和finally不能同时省略。

【JavaSE】Java基础·疑难点汇集的更多相关文章

  1. java基础疑难点总结之成员变量的继承,方法重载与重写的区别,多态与动态绑定

    1.成员变量的继承 1.1要点 子类用extends关键字继承父类.子类中可以提供新的方法覆盖父类中的方法.子类中的方法不能直接访问父类中的私有域,子类可以用super关键字调用父类中的方法.在子类中 ...

  2. JavaSE学习总结(一)——Java基础

    一.Java是什么 Java 是由 Sun Microsystems 在 1995 年首先发布的编程语言和计算平台.Java 是一项用于开发应用程序的技术,可以让 Web 变得更有意思和更实用.有许多 ...

  3. JavaSE入门学习7:Java基础语法之语句(下)

    继续接着Java基础语法来:JavaSE入门学习5:Java基础语法(一)和JavaSE入门学习6:Java基础语法(二). 语句 Java经常使用的3种循环:while.do...while,for ...

  4. JavaSE入门学习6:Java基础语法之运算符和语句(上)

    继续接着上篇:JavaSE入门学习5:Java基础语法(一)来看Java的基础语法. 五运算符 运算符是一种"功能"符号,用以通知Java进行相关的运算.比方.我们须要将变量age ...

  5. JavaSE部分之(1)Java基础

    JavaSE部分之(1)Java基础 1.为什么重写equals还要重写hashcode 为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那就没必要再进行equ ...

  6. Java匹马行天下之JavaSE核心技术——Java基础语法

    Java基础语法 一.   认识Java 1. Java 简介 java 是一种高级的面向对象的程序设计语言,使用Java语言编写的程序时跨平台的.从pc到手机,都有Java开发的程序和游戏,Java ...

  7. Java基础之疑难知识点

    问题列表: 1. Java中子类中可以有与父类相同的属性名吗? 2. Java中子类继承了父类的私有属性及方法吗? 3. Java中抽象类到底能不能被实例化? 1. Java中子类中可以有与父类相同的 ...

  8. JavaSE基础(三)--Java基础语法

    Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如 ...

  9. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

随机推荐

  1. java的加载与执行原理剖析

    到目前为止,我们接触过的重点术语,总结一下: Java体系的技术被划分为三大块: JavaSE:标准版 JavaEE:企业版 JavaME:微型版 安装JDK之后: JDK:java开发工具箱 JRE ...

  2. vue.$set实现原理

    上源码: export function set (target: Array<any> | Object, key: any, val: any): any { if (process. ...

  3. Netty学习笔记(1)NIO三大组件

    1. Channel channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前 ...

  4. 写了10000条Airtest截图脚本总结出来的截图经验,赶紧收藏!

    前言 今天想先给大家分享1个小白用户的Airtest从入门到放弃的故事: 小A是一个自动化的小白,在逛测试论坛的时候,偶然间发现了Airtest这个基于图像识别的UI自动化框架. 出于好奇,小A试用了 ...

  5. Spring动态添加定时任务

    Spring动态添加定时任务 一.背景 二.需求和实现思路 1.能够动态的添加一个定时任务. 2.能够取消定时任务的执行. 3.动态的修改任务执行的时间. 4.获取定时任务执行的异常 三.代码实现 四 ...

  6. Noip模拟76 2021.10.14

    T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 ...

  7. 设计AOV网拓扑排序的算法

    拓扑排序 对一个有向图构造拓扑序列的过程称为拓扑排序(不唯一) 思想 从AOV网选择一个没有前驱的顶点并输出 从AOV网中删去该顶点,并且删去所有以该顶点为尾的弧 重复上述两步,直到全部顶点都被输出, ...

  8. MyBatis源码分析(一):从JDBC到MyBatis 介绍MyBatis的背景,为什么要用MyBatis

    一.介绍JDBC JDBC全称Java Database Connectivity,是Java语言规范客户端访问数据库的应用程序接口,所面向的数据库类型为关系型数据库. JDBC的三层架构图: JDB ...

  9. K8S_Kubernetes

    Google创造, K8S,是基于容器的集群管理平台, K8S集群   应用场景 微服务   这个集群主要包括两个部分 一个Master节点(主节点) 一群Node节点(计算节点)   Master节 ...

  10. Vivado Synth/Place Faild但是没有给出error信息

    最近遇到一个现象,以前可以编译通过的工程,修改之后发现Synthesis编译报错,而且没有给出error信息,以前也出现过无故place 失败但是没有给出error信息的现象,查看错误日志输出文件,出 ...