一.this关键字总是指向对象本身
public class Book {
String name;
String author;
String press;
double price;
public Book(String name, String author, String press, double price) {
this.name = name;
this.author = author;
this.press = press;
this.price = price;
}
@Override
public String toString() {
return " 书名=" + name + "\n 作者=" + author + "\n 出版社=" + press + "\n 价格="
+ price + "";
}
}
public class BookTest {
public static void main(String[] args) {
Book[] books = new Book[2];
books[0] = new Book("鹿鼎记", "金庸", "人民文学出版社", 120.0);
books[1] = new Book("绝代双骄", "古龙", "中国长安出版社", 55.5);
for (Book b : books) {
System.out.println(b.toString());
System.out.println("==================================");
}
}
}
在这里创建了一个一个Book类,在BookTest里面进行了测试,在调用toString的时候是如何辨别是哪一个对象调用了此方法呢。我们每一次使用对象调用方法的时候会多加一个参数进去,那就是这个对象本身,也就是“调用方法的那个对象”,在方法内部也就是this,指代了当前对象的地址。
二.static关键字属于类
static修饰的属性,代码块和方法总是依赖于类,类只加载一次,因此static修饰过后也伴随类只加载一次。但这并不表示对象无法调用这些东西,而是说经过static修饰过后总是由这个类创建的对象所共享。在类里面,static的在类加载的同时初始化的,因此,非静态无法使用静态变量。因为静态是属于类的,所以在静态方法中无法使用this和super等关键字。
public class testStaticCode {
public static void main(String[] args) {
System.out.println(D.i);
System.out.println(new D().i);
}
}
class D {
static {
i = 2;
System.out.println("D : 静态代码块i==2");
}
static int i = 1;
static {
i = 3;
System.out.println("D : 静态代码块i==3");
}
}
输出结果:
D : 静态代码块i==2
D : 静态代码块i==3
3
3
在这里先输出了D.i所以加载了类,类的加载只有一次,所以两个静态代码块在类加载的同时各自只输出了一次,所以先输出了两个静态代码块,在D类里面i的定义在静态代码块后面,静态代码块里面先行赋值,是不会报错的,在这里就要看一下对象的初始化顺序了。《Thinking in Java》第八章:构造器内部的多态方法的行为,对象初始化的顺序
(欢迎指正批评!!!)
参考书籍:《Thinking in Java》