JAVA继承

继承
当我们创建一个新类时,可以指定新类从一个现有的类中继承某些成员,而不是完全声明一个新类。这个现有的类java中称作超类,新类称为子类。而在C++中,超类称为基类,子类称为派生类。每个子类又可以成为其他子类的超类。
子类拥有超类的字段和方法,同时子类也可以添加自己的字段和方法,因此子类比超类会更加具体,表示更加专门化的对象组。子类能够体现出超类的行为,同时子类可以改变这些行为,使得他们能够适应子类的操作。通常来讲,子类更具体而超类更概括。
一般来说两个类之间的关系我们可以概括为两种情形,is-a和has-a,接下来通过is-a和has-a来说明什么是继承。
首先来说明has-a关系:
has-a表示“有”关系,例如汽车有方向盘,我们有两个类,一个是汽车类,一个是方向盘类,并且在汽车类的字段中包含有方向盘类,当然还有轮胎类等其他类,这些都是has-a关系,这里就不一一举例了。
has-a代码:

//汽车类
public class Car
{
private SteeringWheel steeringwheel;//汽车类中包含有方向盘类
//还有其他的一些汽车部件
}
//方向盘类
public class SteeringWheel
{
//方向盘的各种属性
}

is-a表示“是”关系,例如法拉利是车,其中法拉利是子类,车是超类。

//汽车类
public class Car
{
private int maxSpees;
//汽车的一些基本属性
}
//法拉利类
public class Ferrari extends Car
{
//法拉利类继承了汽车类,表明法拉利是汽车,只不过法拉利类是在汽车类的基础上添加了一些法拉利独有的属性
}

通过上面的is-a和has-a的比较,我们就可以看出其中的is-a就是我们所讲的继承关系。

直接超类和间接超类:
直接超类:子类明确地继承了超类。
间接超类:类层次中直接超类上面的任何类,类层次定义了类之间的继承关系。
Java中类层次从Object类开始,Java中的每个类都直接或者间接的拓展自或者继承自Object类。即Java中的每个类包括你自己写的类都继承了Object类的方法。
Object类的详细信息:http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html

超类中的protected成员

关于超类中的protected成员,超类的protected成员可以由超类成员、子类成员以及同一包中的其他类访问,除了这三种情况,其他的类都是不能访问超类的protected成员。当超类的公共成员和protected成员成为子类的成员时,他们都保持原来的访问修饰符,即超类的公共成员成为子类的公共成员,超类的protected成员成为子类的protected成员。超类的私有成员无法从这个类的外部访问。它们被隐藏在子类中,只能通过继承自超类的公共方法或protected方法访问。

子类方法可以引用从超类继承的公共成员和protected成员,只需要使用成员名称即可,当用子类方法重写超类方法时,如果要在子类访问超类方法,可以在超类方法名称前面加上关键字super和点号运算符。

例如:

超类:

public class Test
{
public void show()
{
System.out.println("This is a test message");
}
}

子类:

public class Test2
{
public void childShow()
{
super.show();//使用super来调用超类的show方法
}
}

超类的构造方法:

Java中构造方法是不能够继承的,但是超类的构造方法在子类中仍然可以使用,事实上,任何子类的构造方法第一个任务是显式地调用直接超类的构造方法,如果没有指定构造方法的调用,那么便会隐式地调用超类的构造方法,以保证正确地初始化了从超类中继承过来的变量。

隐式调用:如果子类中没有显示调用超类的构造方法,那么便会隐式调用超类的构造方法,即调用超类的默认构造函数。

显示调用:在子类的构造方法中使用super来调用超类的构造方法。

超类:

public class Test

{

private int x,y;

public Test(int a,int b)

{

x=a;

y=b;

}

}

子类:

public class Test2

{

private int z;

public Test2(int a,int b,int c)

{

super(a,b);//显示调用超类的构造函数

z=c;

}

}

子类重写超类的方法:

前面讲过,子类能够体现出超类的行为,同时子类可以改变这些行为,使得他们能够适应子类的操作,而这个改变超类行为Java中称之为重写。有时候子类为了使超类中的方法能够适应子类,这时候我们就需要重写超类的一些方法来适应子类。例如超类中有一个show方法能够输出超类中所有变量的值,这时子类继承了超类的show方法,但是子类中比超类多了一些变量要输出,这时超类的show方法就不能满足子类的需求,因此子类需要重写超类的show方法。

超类:

public class Test

{

private int a,b;

public void show()

{

System.out.println(a);

System.out.println(b);

}

}

子类:

public class Test2

{

private int c;

@override

public void show()

{

System.out.println(a);

System.out.println(b);

System.out.println(c);

}

}

上面的代码在重写show方法时使用了@override,@override注解能够指明在它下面的函数是在重写超类中的方法,如果编译器没有在超类中找到这个方法就会报错,这样可以让我们避免在重写方法时由于参数表或其他一些原因导致我们的重写变成了重载,而这也会导致一些其他的问题,例如你在调用的时候因为是重载,所以子类调用show方法时可能任然调用了超类的show方法而导致输出结果的错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值