基础语法
关键字
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