首页 Java基础开发技术查缺补漏笔记
文章
取消

Java基础开发技术查缺补漏笔记

暑假期间,个人对一些未来研究生阶段可能会常用的编程技术进行重新一轮的系统复习和学习,及希望能够查缺补漏,有所提升。本文也是作为复习和学习过程中的笔记,用于长久的记录。不排除其中可能含有部分疏漏和错误,如有发现,希望各位能够批评指正,谢谢。

一、准备工作

JDK版本:1.8.0_261(Java HotSpot TM)

(一)Java 文档注释

1
2
3
4
5
/**
 * @auther katus
 * @version v1.0
 * 这是一个文档注释,是Java所特有的,可以被javadoc所解析。
 */

文档注释可以通过javadoc命令直接生成到技术文档中。

1
javadoc -d dirname -author -version xxx.java

二、Java 基本语法

Java代码采用Unicode编码,因此可以使用任意Unicode编码作为标识符,哪怕是中文。

1
2
3
4
class Student {
    String 姓名 = "katus";
    int 学号 = 29;
}

自动类型转换:byte、short、char三种类型之间的运算的结果为int类型。

Integer类中含有进制转化的方法。

取模运算符的结果符号与被模数相同。

赋值运算符不会改变操作数的数据类型。

1
2
3
4
short s1 = 2;
//s1 = s1 + 2;   编译错误
s1 += 2;   //编译通过 4
s1 *= 0.5;   //编译通过 2

移位操作,»右移的部位数取决于原始的符号位,»>永远用0补位。

三、数组

数组的相关操作类可以参照Arrays类。

四、面向对象编程

(一)匿名对象的使用

1
2
new Phone().sendEmail();
setPhone(new Phone());

(二)可变个数形参

Java5新特性,可变参数必须是参数表的最后一个参数,且只能有一个。

1
2
3
4
5
public void method(String ... strs) {   //可以匹配0至多个字符串
    for(String str : strs) {
        //todo
    }
}

JavaBean,满足类是公共类,含无参数公共构造器,有属性且有对应的get和set方法。

多构造器嵌套调用的时候需要保证调用在其他操作之前。

(三)继承中重写方法

  • 重写的方法的权限修饰符必须不小于父类中被重写的方法,而且不能重写其中private的方法(实际上是一个新的方法)。
  • 重写方法的返回值类型必须与被重写方法返回值类型相同(基本数据类型等)或者其子类(仅引用数据类型)。
  • 重写方法抛出的异常不能超过被重写方法中声明的抛出的异常。
  • 只能重写非静态方法。

通过子类构造器构造对象时,默认先构造父类对象。

(四)多态性

1
2
Person p1 = new Man();
Person p2 = new Woman();

多态性仅适用于方法,不适用于属性。

对象引用直接输出相当于调用其toString()方法。

(五)包装类

1
2
3
4
5
Integer in1 = new Integer(12);
int i1 = 12;
int x = in1.intValue();   // xxxValue()
int y = in1;   // 自动拆箱 Java5新特性
Integer in2 = i1;   // 自动装箱 Java5新特性

(六)String与基本数据类型之间的转化

1
2
3
4
5
int x = 0;
float y = 12.3f;
String str1 = x + "";
String str2 = String.valueOf(y);   // valueOf()
int x1 = Integer.parseInt(str1);   // parseXxx()

三目运算符要求冒号两侧的运算结果地位一致。

1
2
Object o1 = true ? new Integer(1) : new Double(2.0);
System.out.println(o1);   // 1.0

使用自动装箱的Integer对象如果范围在-128~127内,则会使用缓存中已存在的对象,不会new,==比较时为同一个。

(七)单例设计模式

  • 私有化构造器。
  • 内部创建类的对象,且为静态。
  • 提供公共的静态对象,返回类的对象。

(八)代码块

  • 代码块只能选择使用static关键字来修饰。
  • 多个代码块的执行顺序完全依照声明顺序,但是静态代码块一定优先于非静态代码块。
    • 静态代码块
      • 随着类的加载而执行
      • 可以初始化类的属性(静态属性)
    • 非静态代码块
      • 随着对象的创建而执行,而且是每创建一个对象都会执行一次。
      • 可以在创建对象时对对象的属性进行初始化。
  • 执行顺序:静态代码块 优先 非静态代码块 优先 构造器 // 由父及子 静态先行

属性赋值的先后顺序:默认初始化 - 显式初始化 / 代码块 - 构造器 - 通过对象的set方法等。(显式初始化和代码块赋值的先后顺序完全取决于代码声明顺序)

(九)final 关键字

  • final修饰的类不能被继承。
  • final修饰的方法不能被重写。
  • final修饰的变量不能修改。(常量)
    • 修饰的属性变量:显式初始化、代码块中赋值、构造器中赋值。
    • 修饰的局部变量:常量(多用作修饰方法形参)

(十)abstract 关键字

  • 修饰类
    • 不能实例化。
  • 修饰方法
    • 只有声明,没有方法体。
    • 需要子类重写其全部的抽象方法才能实例化。
  • 不能修饰私有方法、静态方法、final方法、final类。

(十一)抽象类的匿名子类

相当于在创建子类对象时,将子类的抽象方法实现直接写在后面。

(十二)接口

  • 只能定义全局常量和抽象方法。
    • 书写时可以省略关键字。
  • 接口中不能定义构造器,接口不可以实例化。

  • 用类来实现接口,可以实现多个接口。

    1
    
    class AA extends A implements Aable, Bable, Cable {}
    
  • 接口之间可以继承,也可以多继承。

  • 接口的匿名实现类与“抽象类的匿名子类”实现方法一致。

  • Java8新增定义静态方法、默认方法
    • 接口中的静态方法只能通过接口来调用,实现类的对象无法调用。
    • 接口中的默认方法可以通过实现类的对象来调用,可以在实现类中覆盖重写。
      • 如果实现类的父类中的方法和接口中的默认方法重名且没有重写,则父类中的方法优先。
      • 如果多继承的实现类多接口中有重名默认方法,且实现类没有重写,则接口冲突。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    interface AA {
        public static void method1() {}   // 静态方法 Java8
        public default void method2() {}   // 默认方法 Java8
        public void method3();   // 抽象方法
    }
      
    class SubClass extends SuperClass implements CompareA, CompareB {
        public void method() {}
        public void myMethod() {
            method();
            super.method();
            CompareA.super.method();
            CompareB.super.method();
        }
    }
    

(十三)内部类

  • 成员内部类
    • 可以调用外部类的成员。
    • 可以被static修饰。
    • 可以被权限修饰。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    class Person {
        private String name;
        private int age;
        public void eat() {}
        class Bird {
            private String name;
            public void method() {
                System.out.println();
                Person.this.eat();   // eat();
            }
            public void test(String name) {
                System.out.println(name);
                System.out.println(this.name);
                System.out.println(Person.this.name);
            }
        }
        static class Dog {}
    }
      
    class Test {
        public static void main(String[] args) {
            Person.Dog dog = new Person.Dog();
            Person p = new Person();
            Person.Bird bird = p.new Bird();
        }
    }
    
  • 局部内部类
    • 局部内部类使用的外部的局部变量默认为final。

五、异常处理

(一)异常类别

  • 编译时异常
    • IOException、ClassNotFoundException
  • 运行时异常(RuntimeException)
    • NullPointerException、ClassCastException、ArrayIndexOutOfBoundsException、NumberFormatException、InputMismatchException、ArithmeticException
  • catch从上到小捕捉,只要被捕捉就不会继续。要求子类异常在父类异常上面。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    try {
        // ...
    } catch (Exception e) {
        System.out.println(e.getMessage());   // 获取源异常信息
        e.printStackTrace();   // 获取异常堆栈信息
    } finally {
        // 一定会被执行
    }
    throw new Exception();   // 手动抛出异常
    
  • finally块中的代码会抢在try和catch块中的return之前被执行。
  • 子类重写的方法抛出的异常不能大于父类规定的抛出异常的类型。

(二)自定义异常类

  • 基于现有的异常结构,继承。
  • 提供全局常量:serialVersionUID
  • 提供重载的构造器。
本文由作者按照 CC BY 4.0 进行授权

Spark数据库操作初步

Java开发技术之多线程