1.java中对象的比较
class A{
public A(String str) {}
}
public class Test {
public static void main(String[] args) {
A classa = new A("he");
A classb = new A("he");
System.out.println(classa == classb);
}
}
//打印结果为 false
//classa和classb都为引用变量,其保存的都是他们对应对象的地址信息,地址信息不同,所以返回false
2.关于final
修饰类class
该类不能被继承
类中的方法不能被覆盖
修饰方法method
该方法可以被继承,但是不能被覆盖
一个类不允许子类覆盖其方法是,用final修饰
修饰变量variable
用final修饰后变为常量,包括静态变量、实例变量和局部变量
可以先声明,但是使用时必须赋值,赋值后不能改变,假如是成员变量,则必须写相应的构造方法进行初始化,否则报错
修饰参数arguments
用final修饰的参数,只有get方法,没有set方法,也就是只能读取该参数,不能修改该参数
3.关于static语句块,语句块,子类构造方法,父类构造方法的执行顺序
class A {
public A() {
System.out.println("class A");
}
{
System.out.println("I'm A class");
}
static {
System.out.println("class A static");
}
}
public class B extends A {
public B() {
System.out.println("class B");
}
{
System.out.println("I'm B class");
}
static {
System.out.println("class B static");
}
public static void main(String[] args) {
new B();
}
}
//存在static静态语句块时,优先加载static语句块,当然父类的静态语句块优先于子类的静态语句块,
//其次,由于这里new了子类对象,那么先去其父类中,非静态语句块的优先级高于构造方法,
打印结果为:
class A static
class B static
I'm A class
class A
I'm B class
class B
分析:
静态代码块—>非静态代码块—>构造方法 父类优先于子类
4.接口与类的关系
接口与类的关系
接口的定义 interface
类的定义class
从定义时使用的关键字可知,接口并不属于类
类是接口的实现
实现接口的类中,覆盖了接口的方法,也就是重写了接口的方法。
当一个类实现了两个接口时,且两个接口中有重名的方法(但是返回值类型不同,参数列表相同)即不构成重写的前提条件,那么,该类无法同时实现这两个接口
假如多个接口中有同名的方法且返回值参数列表都一致时,实现的子类只需实现一次即可,即子类的方法同时重写了两个接口中的方法
5.下⾯字段声明中哪⼀个在interface主体内是合法的?
A. private final static int answer = 42;
B. public static int answer = 42;
C. final static answer = 42;
D. int answer;
答案:B
接口只能定义常量,所谓常量则必须赋初始值,且常量的定义都要为 public static final,假如没有写,那么系统会默认为该变量加上public static final修饰符,正因为会默认修饰,所有在定义时可以省略。 以上默认修饰符也包括对方法的修饰。
6.尝试编译一下程序会产生怎么样的结果?
public class MyClass {
long var;
public void MyClass(long param) {
var = param;
}//(1)
public static void main(String[] args) {
MyClass a, b;
a = new MyClass();//(2)
b = new MyClass(5);//(3)
}
}
分析:编译错误将在(3)出发生,因为该类没有int型的构造方法
代码中 public void MyClass(long param){}方法并非构造方法,因此JVM会提供一个默认的无惨构造方法,因此(2)处不会报错,但是该类不存在一个接收int型的构造方法,(3)处报错