黑马程序员--第一阶段3.面向对象--第8天
类的继承
-
继承格式:class 子类名 extends父类名
-
java 只支持单继承,即只能继承一个父类
-
java 支持多层继承,如B继承A,C继承B,则C也间接的继承了A
-
子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法。在子类的构造方法中可使用语句super(参数列表)调用父类的构造方法,如:
class A
{
public String aa=”你好”;
public int bb=20;
public A(String aa,int bb)
{
this.aa=aa;
this.bb=bb;
}
}
class B
{
public String cc=”不好”;
public B ( String d,int e,String f )
{
super(d,e);
this.cc=f;
}
} //如果类B中没有定义构造函数,则系统会自动创建一个无参数的空构造函数,并调用父类的无参构造函数,即public类名(){ super( ) }
-
如果子类的构造方法中没有显式地调用父类构造方法,也没有使用this关键字调用重载的其它构造方法,则在产生子类的实例对象时,系统默认调用父类无参数的构造方法。
-
子类不能继承父类中private类型的成员变量和方法
-
被final修饰的类不能当父类
子类对象的实例化过程
1. 分配成员变量的存储空间并进行默认的初始化,就是用new关键字产生对象后,对类中的成员变量按第三章的表3.1中的对应关系对对象中的成员变量进行初始化赋值。
2. 绑定构造方法参数,就是new Person(实际参数列表)中所传递进的参数赋值给构造方法中的形式参数变量。
3. 如有this()调用,则调用相应的重载构造方法(被调用的重载构造方法又从步骤2开始执行这些流程),被调用的重载构造方法的执行流程结束后,回到当前构造方法,当前构造方法直接跳转到步骤6执行
4. 显式或隐式追溯调用父类的构造方法(一直到Object类为止,Object是所有Java类的最顶层父类,在本章后面部分有详细讲解),父类的构造方法又从步骤2开始对父类执行这些流程,父类的构造方法的执行流程结束后,回到当前构造方法,当前构造方法继续往下执行。
5. 进行实例变量的显式初始化操作,也就是执行在定义成员变量时就对其进行赋值的语句,如:
6. 执行当前构造方法的方法体中的程序代码
-
super(…)和this(…)调用语句不能同时在一个构造函数中出现
-
super(…)或this(…)调用语句只能作为构造函数中的第一句出现
覆盖父类的方法
方法重写=覆盖
-
覆盖方法必须和被覆盖方法具有相同的方法名称、参数列表和返回值类型。
-
如果在子类中想调用父类中的那个被覆盖的方法,我们可以用super.方法的格式。
-
覆盖方法时,不能使用比父类中被覆盖的方法更严格的访问权限。
final关键字
-
在Java中声明类、属性和方法时,可使用关键字final来修饰。
-
final标记的类不能被继承。
-
final标记的方法不能被子类重写。
-
final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次,不能再被改变。
-
方法中定义的内置类只能访问该方法内的final类型的局部变量,用final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期,将一个形参定义成final也是可以的,这就限定了我们在方法中修改形式参数的值。
-
public static final共同标记常量时,这个常量就成了全局的常量。
-
final标记的成员变量只能在两个地方被赋值,其他任何地方都不行,代码如下:
public final int x=6;//在定义时初始化
public 类名( ){x=50;}//在构造函数中初始化,注意如果有多个构造函数则需要在每一个构造函数中都进行初始化,否则会报错。 -
static 修饰的成员变量只能在定义时初始化,被static修饰的成员变量在其他类中可以直接调用,即“类名.变量名”这种方法调用,如果没有static修饰,则需要创建该类的实例后才能调用。