当前位置:文档之家› JAVA继承、抽象类、接口

JAVA继承、抽象类、接口

JA V A继承、抽象类、接口编辑人:星辰·樱联系QQ:838826112一.类的继承通过继承可以实现代码的复用,被继承的类称为父类或超类(superclass),由继承而得到的类称为子类(subclass)。

一个父类可以拥有多个子类,但一个类只能有一个直接父类,这是因为JA V A语言中不支多重继承。

子类继承父类的成员变量和成员方法,同时可以修改父类的成员变量或重写父类的方法,还可以添加新的成员变量或成员方法。

JA V A语言中有一个名为ng.Object的特殊类,所有的类都是直接或间接地继承该类而得到的。

1.子类的创建类的继承是通过extends关键字来实现的,在定义类时若使用ectends关键字指出新定义类的父类,就是在两个类之间建立了继承关系。

新定义的类称为子类,它可以从父类那里继承所有非private的成员作为自己的成员。

子类的创建:* 格式:class SubClass extends SuperClass* {* .* .* .* }2.调用父类中特定的构造方法在没有明确地指定构造方法时,子类还是会先调用父类中没有参数的构造方法,以便进行初始化的操作。

在子类的构造方法中可以通过super()来调用父类特定的构造方法。

例://以Person作为父类,创建学生子类Student,并在子类中调用父类里某指定的构造方法。

class Person2{private String name;private int age;public Person2()//定义Person2类的无参构造方法{System.out.println("调用了Person2类的无参构造方法");}public Person2(String name,int age)//定义Person2类的有参构造方法{System.out.println("调用了Person2类的有参构造方法");=name;this.age=age;}public void show(){System.out.println("姓名:"+name+" 年龄:"+age);}}class Student2extends Person2//定义继承自Person2类的子类Student2{private String department;public Student2()//定义Student2类的无参构造方法{System.out.println("调用了学生类的无参构造方法Student2()");}public Student2(String name,int age,String dep)//定义Student2类的有参构造方法{super(name,age);//调用父类的胡参构造方法department=dep;System.out.println("我是"+department+"学生");System.out.println("调用了学生类的有参构造方法Student2(String name,int age,String dep)");}}public class App8_2 {public static void main(String[] args){Student2 stu1=new Student2();//创建对象,并调用无参构造方法Student2 stu2=new Student2("李小四",23,"信息系");//创建对象并调用有参构造方法stu1.show();stu2.show();}}/*在子类中访问你类的构造方法,其格式为super(参数列表)。

* super()可以重载,也就是说,super()会根据参数的个数与类型,执行父类相应的构造方法。

* 调用父类构造方法的super()语句必须写在子类构造方法的第一行。

* super()与this()的功能相似,但super()是从子类的构造方法调用父类的构造方法,而this()则是在同一个类内调用其他的构造方法。

* super()与this()均必须放在构造方法内的第一行,也就是这个原因,super()与this()无法同时存在同一个构造方法内。

* 与this关键字一样,super指的也是对象,所以super同样不能在static环境中使用,包括静态方法和静态初始化器(static语句块)。

3.在子类中访问父类的成员例://在学生子类Student中访问父类Person的成员。

用protected修饰符和super关键字访问父类的成员class Person3{protected String name;//用protected(保护成员)修饰符修饰protected int age;public Person3()//定义Person3类的“不做事”的无参构造方法{}public Person3(String name,int age)//定义Person3类的有参构造方法{=name;this.age=age;}protected void show(){System.out.println("姓名:"+name+" 年龄:"+age);}}class Student3 extends Person3//定义子类Student3,其父类为Person3{private String department;int age=20;//新添加了一个与父类的成员变量age同名的成员变量public Student3(String xm,String dep)//定义Student3类的有参构造方法{name=xm;//在子类里直接访问父类的protected成员namedepartment=dep;super.age=25;//利用super关键字将父类的成员变量age赋值为25System.out.println("子类Student3中的成员变量age="+age);super.show();//去掉super而只写sho()亦可System.out.println("系别:"+department);}}public class App8_3 {public static void main(String[] args){@SuppressWarnings("unused")Student3 stu=new Student3("李小四","信息系");}}/*在子类中访问父类的成员:* 在子类中使用super不但可以访问父类的构造方法,还可以访问父类成员就是和成员方法,* 但super不能访问在子类中添加的成员。

子类中访问父类成员的格式如下:* 1. super.变量名; 2.super.方法名;* 用protected修饰的成员可以被三种类所引用:该类自身、与它在同一个包中的其他类、在其他包中该的子类。

* 将成员声明为protected的最大好处是可以同时兼顾到成员的安全性和便利性。

4.覆盖重载是指在同一个类内定义名称相同,但参数个数或类型不同的方法。

覆盖(overriding):是指在子类中,定义名称,参数个数与类型均与父类完全相同的方法,用于重写父类里同名方法的功能。

例://以个人类Person为父类,创建学生子类Student,并用子类中的方法覆盖父类的方法。

class Person4{protected String name;protected int age;public Person4(String name,int age){ = name;this.age = age;}protected void show(){System.out.println("姓名:"+name+" 年龄:"+age);}}class Student4 extends Person4{private String department;public Student4(String name,int age,String dep){super(name,age);department = dep;}protected void show()//覆盖父类Person4中的同名方法{System.out.println("系别:"+department);}}public class App8_4{public static void main(String[] args){Student4 stu = new Student4("王永涛",24,"电子");stu.show();}}*覆盖父类的方法:子类在重新定义父类已有的方法时,应保持与父类完全相同的方法声明,即应与父类有完全相同的方法名、返回值类型和参数列表,否则就不是方法的覆盖,而是子类定义自己的与父类无关的方法,父类的方法末被覆盖,所以仍然存在。

*注意:子类中不能覆盖父类中声明为final或static的方法。

在子类中覆盖父类的方法时,可以扩大父类中方法权限,但不可以缩小父类方法的权限。

5.用父类的对象访问子类的成员例://利用父类Person5的对象调用子类Student5中的成员。

与不可被继承的成员与最终类class Person5{protected String name;//如果声明为静态最终变量,则不能被覆盖。

protected int age;public Person5(String name, int age){ = name;this.age = age;}protected void show(){System.out.println("姓名:"+name+" 年龄:"+age);}}class Student5 extends Person5{private String department;public Student5(String name,int age, String dep){super(name,age);department = dep;}protected void show(){System.out.println("系别:"+department);}}public class App8_5{public static void main(String[] args){Person5 per = new Student5("王永涛",24,"电子");//声明父类变量per指向子类对象per.show(); //利用父类对象per调用show()方法}}通过父类的对象访问子类的成员,只限于“覆盖”的情况发生时。

相关主题