模块四
一.继承与重写
有多种表示父类和子类的术语,如父类(parent class)和子类(child class)超类和子类,基类和派生类等,有一点要注意,即生派类是基类的特化类,因此,常常说基类是一般化,而派生类是特殊化。
1.继承的实现
在java中,使用关键字extends来继承类,方法如下:
public class Child class extends ParentClass
{
//程序代码
}
上面的代码表明ChildClass继承了ParentClass类。继承的本事是子类是将父类的非私有成员直接作为自己的成员。
训练代码
public void methodChildren() {
System.out.println(“我是子类–助教的方法”);
System.out.println(“我要改作业”);
}
}
public static void main(String[] args) {
Teacher teacher= new Teacher();
teacher.method();
teacher.methodChildren();
Assistant assistant= new Assistant();
assistant.method();
assistant.methodChildren();
}
}
public class Employee {
String name;
int age;
public void method() {
System.out.println("我是父亲--老师的方法");
}
}
public class Teacher extends Employee{
public void methodChildren() {
System.out.println("我是子类--老师的方法");
System.out.println("我是讲课");
}
}
运行结果
2.重写
如果在子类中定义的一个方法,其名称返回值类型和参数列表正好与父类中的某个方法的名称,返回值类型和参数列表相匹配,那么可以说之类的方法重写了父类的方法。
代码如下:
public static void main(String[] args) {
Phone phone= new Phone();
phone.call();
phone.send();
System.out.println("====");
phone.show();
System.out.println("====");
NewPhone newphone=new NewPhone();
newphone.call();
newphone.send();
System.out.println("===");
newphone.show();
}
}
public class NewPhone extends Phone {
public void show() {
//System.out.println("显示号码");
//this
super.show();
System.out.println("显示头像");
System.out.println("显示归属地");
}
}
public class Phone {
public void call() {
System.out.println(“打电话”);
}
public void send() {
System.out.println(“发短信”);
}
public void show() {
System.out.println(“老手机显示号码”);
}
}
运行结果如下:
3.重载方法
在java中,可以在一个类中用相同的名称定义两个或多个方法,但参数相不同。当两个方法名称相同,而参数项不同时,就认为此方法被重载,而此过程称为“方法重载”存在方法可以有不同的返回值类型
调用重载方法时,java将尝试调用一个参数类型和数量,与此方法的参数类型和数量相匹配的方法。如果不完全匹配java的自动类型转换功能,将解决此问题,并调用正确的重载方法。
代码如下:
public static void main(String[] args) {
Fu fu=new Fu();
System.out.println(fu.numFu);
System.out.println("====");
Zi zi=new Zi();
System.out.println(zi.numFu);
System.out.println(zi.numZi);
System.out.println("====");
System.out.println(zi.num);
System.out.println("=====");
zi.methodZi();
}
}
public class Fu {
int numFu=10;
int num=100;
public void methodFu() {
System.out.println("我是父类方法:"+num);
}
}
public class Zi extends Fu{
int numZi=20;
//int num=200;
public void methodZi() {
//int num=2000;
System.out.println(“我是子类的方法:”+num);
}
}
4.父类与子类
继承的主要优势在于代码的可重用性。一个类一经定义和调试,便可以用来创建新的子类,这样做除了节省大量的时间和精力之外,还无需重新输入相同的代码,另外,佛类的数据和方法可用于它的子类但如果将父类的数据和方法声明为私有使用则此类不能访问他们。
创建子类的对象时他将会包含父类的所有方法和属性但是此类永远不会继承父类的构造方法子类的构造方法可以调用父类的构造方法需要注意的是佛类的构造方法的调用总是先于子类构造方法的调用
代码如下:
public class Demo03Extend {
public static void main(String[] args) {
Zi zi=new Zi();
zi.methodFu();
zi.methodZi();
zi.method();
Fu fu=new Fu();
//fu.methodZi
}
}
public class Fu {
public void methodFu() {
System.out.println(“我是父类方法 methodFu”);
}
public void method() {
System.out.println("我是父类方法 method");
}
}
public class Zi extends Fu{
public void methodZi() {
System.out.println(“我是子类方法 methodZi”);
}
@Override
public void method() {
System.out.println("我是子类方法 method");
}
}
运行结果如下
另一方面,通过使用关键字super程序员还可以,从此类构造方法中调用父类中的默认构造方法或带参数的构造方法调用父类构造方法的语句应该为此类构造方法中的第一个语句因为父类的存在先于子类,其语法为:
Super(parameter-list)
或者
super();
其中,parameter-list指定父类中的构造方法所需的参数。子类构造方法调用Super()时,它调用的是直接佛类的构造方法。Super(),总是指调用类的,直接父类下面例子也是关键字super用法
代码:
public static void main(String[] args) {
Zi zi=new Zi();
zi.methodZi();
}
}
public class Fu {
int num=100;
public void method()
{
System.out.println(“父类方法”);
}
}
/*
*
-
总结super的三种用法
-
1,在子类的成员方法中,访问父类的成员变量
-
2.在子类的成员方法中,访问父类的成员方法
-
3.在子类的成员方法中,访问父类的构造方法
*/
public class Zi extends Fu {int num=20;
public Zi() {super();
}
public void method () {
System.out.println("子类方法");
}
public void methodZi() {
System.out.println(num);
System.out.println(super.num);
super.method();
}
}