JAVA类的继承学习笔记——稻草人
学习资料:《Java就业培训教程》
Java类继承的特点
1.Java只支持单继承,不允许多继承,一个子类只能有一个父类,不允许一个类直接继承多个类,但一个类可以被多个类继承,,即是类X不可以既继承类Y又继承类Z。
2.可以有多继承,如:类B继承了类A,类C又可以继承类B,那么类C也间接继承了类A。
3.子类继承父类的所有成员变量和成员方法,但不继承父类的构造方法(构造方法是特殊的成员方法,他与类名相同,不返回结果也不加void返回值)。
4.在子类的构造方法中可以使用super()调用父类的构造方法,如下:
public class Student extends Person
{
public Student(String name,int age,String school)
{
super(name,age);
this.school = school;
}
}
5.如果子类没有显式地调用父类构造方法,也没有使用this关键字调用重载的其他构造方法,则在产生子类的实例对象时,系统默认调用父类无参数的构造方法。也就是,在下面的例子中,写不写super()语句效果是一样的:
public class B extends A
{
public B ()
{
super();//写不写,效果时一样的
}
}
如果子类构造方法没有显式地调用父类构造方法,二父类中又没有无参数的构造方法(需要再次说明:如果父类没有显式地定义任何构造方法,系统将提供一个无参数的构造方法,相当于父类中又无参数的构造方法),则会编译出错。所以,通常情况下只要定义了有参数的构造方法,一般还要再定义一个无参数的构造方法。
/**
* 测试类的继承特性
* @author Administrator
*
*/
class Person
{
public String name;
public int age;
public Person(String name,int age)
{
this.name = name;
this.age = age;
}
public Person() {}//如果这个构造函数不写,则编译会出错
public void getInfo()
{
System.out.println("name:"+name+" , age"+age);
}
}
class Student extends Person{
public void study()
{
System.out.println("好好学习,天天向上");
}
public static void main(String arg[])
{
Person p = new Person();
p.name = "Person";
p.age = 33;
p.getInfo();
Student s = new Student();
s.name = "student";
s.age = 10;
s.getInfo();
s.study();
}
}
子类对象实例化过程
1.分配成员变量的存储空间,并进行默认的初始化,就是用new关键字产生对象以后,对成员变量用相应的关系对对象中的成员变量进行初始化赋值。
2.绑定构造参数。
3.如果有this()调用,则调用相应的重载构造方法,(被调用的冲在构造方法又从步骤2开始执行这些流程),被调用的重载构造方法结束后回到当前的构造方法,然后直接跳到步骤6执行。
4.显式或隐式追溯调用父类的构造方法(一直到Object类为止,Object是所有Java类的最顶层父类),父类的构造方法又从步骤2开始对父类执行这些流程,父类构造方法执行结束后,回到当前的构造方法,当前构造方法继续往下执行。
5.进行实例变量的显式初始化,也就是执行在定义成员变量时就对其进行赋值的语句。String school = "NIT";
6.执行当前构造方法的方法体里面的程序代码。
覆盖父类的方法
*覆盖的方法必须和被覆盖的方法具有相同的方法名称,参数列表和返回值类型。
*覆盖方法时,不能使用比父类中被覆盖的方法更加严格的访问权限。