「Java」 基础语法

Posted by Dawn-K's Blog on January 16, 2021

基础语法

关键字

final

final 类似cpp中的const, 表示常量.

  • final修饰类, 表示此类不可被继承
  • final修饰方法, 表示此方法在重载中不可被覆盖(覆盖和重写有什么区别), 且不能修饰构造函数.
  • final修饰成员或者局部变量, 表示此成员是常量, 只能在声明时赋值, 一旦赋值就不可修改.

static

static 表示静态, 相当于 cpp中的全局变量, 其声明的成员和函数不依附于某个对象, 而是为整个类所共享.

  • static修饰方法, 则此方法中不可使用this, 因为static方法不需要对象调用, 所以也谈不上this, 同理也不可以使用super(this指向本类对象(即调用这个方法的对象), super指向父类对象)
  • static 修饰的方法只能调用本类中的静态成员函数和静态成员变量.
  • static 不可用于修饰局部变量, 事实上, 仅final能够修饰局部变量, 其余的如访问限制, 静态等都无法修饰局部变量.
  • static 不可用于修饰函数参数, 构造函数
  • static 还可以修饰语句块 {} , 此语句块会在jvm加载类时执行, 并且只执行一次
  • main函数作为整个程序的入口, 自然会在类创建前执行, 所以main函数必须是 public static的, 且传入参数必须是String[] args

综上, final static 结合起来就可以声明全局常量, 也就是类似cpp的全局const变量.

this

this 是一个引用当前对象的引用变量.

引用本类的成员变量和成员函数

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
27
28
29
30
31
public class Student {
    int rollno;
    String name;
    float fee;

    Student() {
        System.out.println("default constructor");
    }

    // 如果不用this,则此处的形参名无法赋值给成员变量
    Student(int rollno, String name, float fee) {
        // 此处如果想重用Student的默认构造函数的话需要 this(),如果写就一定要在第一行,否则编译错误
        this();
        this.rollno = rollno;
        this.name = name;
        this.fee = fee;
    }

    void f2() {
        System.out.println("hello");
    }

    void f1() {
        // 实际上这里 用 this.f2() 和 f2()效果是一样的
        f2();
    }

    public static void main(String[] args) {
        new Student(1, "1", 1).f1();
    }
}

调用构造函数

在其他构造函数中, 可以写入 this(); 此处是为了复用无参构造函数, 也可以不用, 但是如果用必须写在第一行, 可参考上文的代码.

返回当前类的实例

就是返回调用这个方法的对象的引用.

在构造函数中作为参数传递

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class B {
    A4 obj;

    B(A4 obj) {
        this.obj = obj;
    }

    void display() {
        System.out.println(obj.data);// using data member of A4 class
    }
}

class A4 {
    int data = 10;

    A4() {
        B b = new B(this);
        b.display();
    }

    public static void main(String args[]) {
        A4 a = new A4();
    }
}

可看到A4与B之间互相引用(类似于指针的关系), 创建A的时候创建B, 然后把A的引用传入来初始化B里面指向A的引用

super

任何class的构造方法, 第一行语句必须是调用父类的构造方法. 如果没有明确地调用父类的构造方法, 编译器会帮我们自动加一句super();

而且super()和this()不能在一个构造函数中显式的共存, 因为他俩都需要作为构造函数的第一个语句.

如果父类没有默认的构造方法, 子类就必须显式调用super()并给出参数以便让编译器定位到父类的一个合适的构造方法.

异常

如果出现形如下面的报错

1
Attempt to invoke virtual method 'void android.widget.ImageView.setImageBitmap(android.graphics.Bitmap)' on a null object reference

其实是表示调用这个方法的对象是null