类和对象
-
类的修饰符只能是public,abstract和final(表示该类没有子类),而不可以用private和protected,当然了,也可以没有修饰符,那么此时该类只能在自己所处的包内访问,在包内与public无异
-
-
final修饰符修饰的属性称之为常量,即只能赋值一次,一旦被赋值,就不能被改变,由final修饰的变量,除了可以在被声明的时候赋值之外,还可以通过构造器进行赋值,但是这种情况要保证一定会通过构造器被赋值,比如说你如果你自己定义了一个构造器没有对它进行赋值,就会报错。下面的这段代码就是错误的。
public class City{
public final String name;
public City(){}
public City(String str){
name = str;
}
}
-
每一个类至少有一个构造器,如果没有自己定义,会自动提供一个缺省构造器,但如果你自己写了带参数的构造器,那么之前默认的缺省构造器就会自动丧失。
-
static初始化块在类加载时执行,且只执行一次。而普通的非静态初始化块则在每次创建对象时,在执行构造器之前执行一次。
-
static初始化块只能对静态属性进行初始化或执行其他操作,但绝对不能使用类中的方法或者对实例字段进行操作。而非静态初始化块则没有这个限制,它也可以对静态属性进行操作。
public class City{
public static int val;
public int x;
static {
val = 0;
// x = 0; 错误
// get(); 错误
}
{
val = 0;
x = 0;
get();
}
public void get(){
System.out.println("666");
}
}
-
static初始化块中不能使用 this. ,也就是说一旦你在static初始化块中定义了一个局部变量,与类中的某个静态成员同名,那么你在static初始化块中,就没有办法再访问那个静态成员。
-
有下面几种情况会触发类的静态初始化,需要引起注意 访问类的静态变量和静态方法 反射如(Class.forName()) 初始化一个类发现其父类还没有初始化 虚拟机刚启动定义了main方法的那个类中的静态初始化块 但是需要注意的是,以上的几种情况会触发静态初始化需要一个前提就是:该类还从未被静态初始化过,否则的话就不会再一次触发静态初始化
-
静态方法属于定义它的类,而不属于该类的实例。可以通过类名调用,也可以通过实例调用,甚至可以通过子类的类名和实例调用()。
-
静态方法只能调用静态成员。如果要访问非静态成员,只能通过在静态方法中定义的实例来访问。静态方法中不允许this和super引用。
-
静态方法不能在子类中被改写为非静态的,也不允许在子类中改写为返回值不兼容的方法。静态方法中只可以调用本类的静态方法,不能调用非静态的方法。
-
方法重载返回类型可以相同可以不相同,但是形参列表必须不同。
-
方法的可变参数,“...”位于变量类型和变量名之间,并且最多只能定义一个可变参数。
-
每一个包装类都有一个parseType()的方法,来将字符串转换为对应的基本类型。 type c = WrapperClass.parseType("...");
-
Integer a,b 一般地来说 a == b比较的是是否为同一个引用,但是由于Integer默认在-128到127有缓存,所以在这个区间内使用 == 比较的是值。但如果a, b已经被赋值为对某个对象的引用,即使值在-128到127之间,比较的还是为是否为同一引用。
public class Main {
public static void main(String[] args){
Integer a = 15;
Integer b = 15;
System.out.println(a == b); //True
a = new Integer(100);
b = new Integer(100);
System.out.println(a == b); //False
a = Integer.valueOf(100);
b = Integer.valueOf(100);
System.out.println(a == b); //True
a = 200;
b = 200;
System.out.println(a == b); //False
}
}
类的扩展和继承