• 【JavaSE】Java基础·疑难点汇集


    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不能同时省略。

  • 相关阅读:
    如何同步共享同一个list
    Java多线程生产者消费者模式(一)之两个线程交替执行
    Java多线程之如何在线程间共享数据
    Java多线程(四)实现多线程的三种方法之JUC的Callable接口
    Java线程的6种状态
    Java lambda表达式的进化论
    Java内部类
    Java多线程(五)锁机制之synchronized 同步方法和同步块
    Java装饰者模式
    Java多线程(三)实现多线程的三种方法之Runnable接口
  • 原文地址:https://www.cnblogs.com/yadiel-cc/p/11297545.html
Copyright © 2020-2023  润新知