1.类方法
类方法指的就是被static修饰的方法,有如下选择题:
下列说法错误的有( )
A. 在类方法中可用this来调用本类的类方法
B. 在类方法中调用本类的类方法时可直接调用
C.在类方法中只能调用本类中的类方法
D. 在类方法中绝对不能调用实例方法
A. static方法是属于类的,而不是属于某一个对象,所以没有this指针。
B.一个类方法中可以直接调用另一个类方法
C.一个类方法中可以通过 类名+方法 来调用另一个类的类方法
D.只需要在类中新建一个实例就可以调用实例方法
2.Integer的缓存
Integer a = 1;
Integer b = 1;
Integer c = 500;
Integer d = 500;
System.out.print(a == b);
System.out.print(c == d);
上述代码返回结果为: true false
这是因为Integer类型在**[-128,127]范围之间是被缓存了的**,也就是每个对象的内存地址是相同的,赋值就直接从缓存中取,不会有新的对象产生,而大于这个范围,将会重新创建一个Integer对象,也就是new一个对象出来,当然地址就不同了,也就!=;
3.String 练习题
public class SendValue{
public String str="6";
public static void main(String[] args) {
SendValue sv=new SendValue();
sv.change(sv.str);
System.out.println(sv.str);
}
public void change(String str) {
str="10";
}
}
输出结果为? 6
由于String的不可修改性,所以即使是引用传递,修改的也只是形参的值。也就是首先调用函数change(),让形参str指向6,后来又让它指向10,但是this.str的指向始终是10。
而数组则不同,数组里的值是可变的,所以可以直接进行修改而不是改变指向,所以方法中改变数组会实际的改变数组值。
4.super
super就是指向父类的一个指针,所以可以用来访问父类的非私有成员变量,用来调用父类中被重写的方法,用来调用父类的构造函数。
public class TestSuper {
protected String father = "father";
public TestSuper() {
}
public void print(){
System.out.println("我是爸爸");
}
public static void main(String[] args) {
Child child = new Child();
child.print();
child.fatherPrint();
child.printFather();
}
}
class Child extends TestSuper{
/**
* 调用父类的构造方法
*/
public Child() {
super();
}
@Override
public void print() {
System.out.println("我是儿子");
}
/**
* 调用父类的被重写方法
*/
public void fatherPrint(){
super.print();
}
/**
* 访问父类非私有变量
*/
public void printFather(){
System.out.println(super.father);
}
}
5.final练习题
class Foo {
final int i;
int j;
public void doSomething() {
System.out.println(++j + i);
}
}
会报错,因为final类型的成员变量在使用之前一定要初始化。有两种选择:
- 在构造函数中赋值
- 初始化赋值