1.子父类
在调用子类构造器之前,会先调用父类构造器,当子类构造器中没有使用"super(参数或无参数)"指定调用父类构造器时,是默认调用父类的无参构造器,如果父类中包含有参构造器,却没有无参构造器,则在子类构造器中一定要使用“super(参数)”指定调用父类的有参构造器,不然就会报错。
如下代码:
class Base{
public Base(String s){
System.out.print("B");
}
}
public class Derived extends Base{
public Derived (String s) {
System.out.print("D");
}
public static void main(String[] args){
new Derived("C");
}
}
子类构造方法未调用父类构造方法且父类无无参构造,改为如下即可。
public Derived(String s){
super("s");
System.out.print("D");
}
2.类的加载顺序
(1) 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法)
(2) 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法 )
(3) 父类非静态代码块( 包括非静态初始化块,非静态属性 )
(4) 父类构造函数
(5) 子类非静态代码块 ( 包括非静态初始化块,非静态属性 )
(6) 子类构造函数
其中:类中静态块按照声明顺序执行,并且(1)和(2)不需要调用new类实例的时候就执行了(意思就是在类加载到方法区的时候执行的)
子类覆盖父类(base 父类,sub子类)
Base b = new Sub();它为多态的一种表现形式,声明是Base,实现是Sub类, 理解为 b 编译时表现为Base类特性,运行时表现为Sub类特性。
看下题,代码输出为什么?
public class Base
{
private String baseName = "base";
public Base()
{
callName();
}
public void callName()
{
System. out. println(baseName);
}
static class Sub extends Base
{
private String baseName = "sub";
public void callName()
{
System. out. println (baseName) ;
}
}
public static void main(String[] args)
{
Base b = new Sub();
}
}
因此Base b时进行到第四步调用父类构造函数,运行时为子类特征,而子类重写了callname方法,因此实现为子类callname方法。此时子类还未构造,因此basename为空,故输出为空。
3.关键字
static关键字:
1、被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来(被修饰的方法相同)
2、静态代码块,与静态变量静态方法一样,只在初始化类的时候执行
3、static修饰类,只能修饰静态内部类
其余关键字待续
4.值传递和引用传递
基本数据类型都是值传递 类,数组,接口是引用传递 由于String对象本身的特殊性,导致它值传递的特征