今天学习了类的继承,什么是累的继承呢?举生活中的例子比如:我们和父母,我们继承了父母的
一些特征(当然我们同样有自己的特征),比如手机,现在的手机换代很快啊,但是我们手中的手机
却继承了以前手机的很多功能(同样又有了新的功能)。所谓继承,就是子类继承了父类的特征,但
是并一定和父类完全相同,子类一样可以有自己的特征。
那么我们需要介绍一下继承的格式,这里我们需要一个关键字extends!!!
public class 子类名 extends 父类名{
}
如果要我们对继承有一个深刻的认识,那么我们就要知道继承有什么好处。不然我们为什么要用到
继承呢。刚才我们讲过了,继承就是继承了父类的属性和方法。我们在编写另一个类是可以省掉很多
的功夫的,下面那一段代码举例:
比如我们的奥特曼打小怪兽的问题:奥特曼和小怪兽都要定义名字和血量,如果我们把他们看作是
一个角色类的子类,那么我们会省掉很多的功夫,我们只需要定义一个角色类的属性,继而继承这个
类:
//定义一个Role类
public class Role {
private String name;
public int blood;
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setBlood(int blood){
this.blood=blood;
}
public int getBlood(){
return blood;
}
继承前//定义一个奥特曼类
public class atm extends Role {
private String name;
public int blood;
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setBlood(int blood){
this.blood=blood;
}
public int getBlood(){
return blood;
}
}
继承后 //定义一个奥特曼类
public class atm extends Role{
}
是不是觉得很不可思议,但是没错,就是这样的,这么简单!!!
继承不只是在定义属性上起到了方便的效果,同样在方法上也是有着不一样的功能。
在这之前,我们需要先了解一下方法的重写(注意是重写而不是重载!!)
方法的重写指的是具有继承关系的方法,这里我们再来列举一下生活中的例子:
以前的手机和现在的手机具有继承的关系,但是以前的手机在打字时是按键,现在就是触屏了,输
入的方式上发生了变化。这就是方法重写了。。
方法重写需要注意很多的问题,除了要有继承关系外;方法的返回值数据类型,方法名,参数个数
,参数类型,参数顺序必须要和父类的方法完全一致;重写方法的访问修饰符可以大于或者等于父类
方法的访问修饰符。(访问修饰符一共有四种:private 默认 protece public,其大小关系是
private< 默认< protece <public)在调用方法时,如果你实例化的事子类,那么有限考虑调用子类
的方法,如果子类没有那么就调用父类的方法。
自动转型在继承中有很大的用处的。什么是自动转型?怎样才能用自动转型,有什么好处,这就是
我们需要关心的问题了。下面让我们通过一个实例来说明一下
Role at1=new atm();//自动转型
at1.setName("奥特曼1号");
at1.setBlood(5);
这里我们看到在实例化对象的时候,我们实例化的是子类的对象,但是我们把它赋给了主类,如果
我们把这句话去掉,改成:
atm at1=new atm();
at1.setName("奥特曼1号");
at1.setBlood(5);
因为我们在定义atm类是并没有定义setName()和setBlood()的方法,因此我们是不能调用的,
而如果我们进行自动转型,那么子类就可以调用父类里边的方法了,这是我们也知道了,要想进行自
动转型,那么就要有继承关系!!
自动转型一般在什么时候用到呢,我来说森林的故事。(森林里要进行选拔,很多很多的动物
,狮子老虎大象等等。。)如果我们定义的Pk规则都是相同的,那么PK战很热闹,难道我们每个类里
(狮子 老虎 大象 。。。)都要定义这个PK规则吗,相当的麻烦啊!!!这时我们就可以用到自动转
型了,只要我们在父类里定义一个PK方法,子类里就可以来调用它,省了很多的功夫啊 !!!
另外,在进行
构造方法的重写时,特别要注意一点:
子类中至少要有一个构造方法和父类相同,比如我们来看下面两段程序:
//父类
public class Role {
private String name;
public int blood;
public int score;
public Role(int score){
this.score=score;
}
}
//子类
public class atm1 extends Role {
}
如果是这样的话,子类就会出现报错,我们知道,默认的构造方法是不带参数的,而我们在
父类中重新定义了一个构造方法,那么子类(默认构造方法)中就不在有父类中的构造方法。所以我
们可以把父类改成这样:
//父类
public class Role {
private String name;
public int blood;
public int score;
public Role(int score){
this.score=score;
}
public Role(){ //重新定义一下默认的构造方法
}
如果父类中就是没有无参构造方法,那怎么办呢?
//如果在父类没有无参构造方法时,子类这样定义
public class atm1 extends Role {
public int number;
public atm1(int number){
this.number=number;
}
}
结果是报错,那么到底怎样才能行得通呢?首先我们要知道,子类是不可以继承父类的构造
方法的!!所以我们在子类中必定会调用父类的构造方法,如果父类中有无参构造方法,则调用无参
构造方法,如果父类中只有有参构造方法,那么这时候我们就要用到关键字super!!!
而且我们必须要用super去调用一下父类中的有参构造方法。所以上述程序可以写成
//父类
public class Role {
private String name;
public int blood;
public int score;
public Role(int score){
this.score=score;
}
}
//子类
public class atm1 extends Role {
public int number;
public atm1(int number){
super(number);//调用父类的构造方法
}
}
而如果我们一定要重新定义构造方法在子类里,那么还是记得在父类中写一个无参数的构造
方法吧!!!
一些特征(当然我们同样有自己的特征),比如手机,现在的手机换代很快啊,但是我们手中的手机
却继承了以前手机的很多功能(同样又有了新的功能)。所谓继承,就是子类继承了父类的特征,但
是并一定和父类完全相同,子类一样可以有自己的特征。
那么我们需要介绍一下继承的格式,这里我们需要一个关键字extends!!!
public class 子类名 extends 父类名{
}
如果要我们对继承有一个深刻的认识,那么我们就要知道继承有什么好处。不然我们为什么要用到
继承呢。刚才我们讲过了,继承就是继承了父类的属性和方法。我们在编写另一个类是可以省掉很多
的功夫的,下面那一段代码举例:
比如我们的奥特曼打小怪兽的问题:奥特曼和小怪兽都要定义名字和血量,如果我们把他们看作是
一个角色类的子类,那么我们会省掉很多的功夫,我们只需要定义一个角色类的属性,继而继承这个
类:
//定义一个Role类
public class Role {
private String name;
public int blood;
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setBlood(int blood){
this.blood=blood;
}
public int getBlood(){
return blood;
}
继承前//定义一个奥特曼类
public class atm extends Role {
private String name;
public int blood;
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setBlood(int blood){
this.blood=blood;
}
public int getBlood(){
return blood;
}
}
继承后 //定义一个奥特曼类
public class atm extends Role{
}
是不是觉得很不可思议,但是没错,就是这样的,这么简单!!!
继承不只是在定义属性上起到了方便的效果,同样在方法上也是有着不一样的功能。
在这之前,我们需要先了解一下方法的重写(注意是重写而不是重载!!)
方法的重写指的是具有继承关系的方法,这里我们再来列举一下生活中的例子:
以前的手机和现在的手机具有继承的关系,但是以前的手机在打字时是按键,现在就是触屏了,输
入的方式上发生了变化。这就是方法重写了。。
方法重写需要注意很多的问题,除了要有继承关系外;方法的返回值数据类型,方法名,参数个数
,参数类型,参数顺序必须要和父类的方法完全一致;重写方法的访问修饰符可以大于或者等于父类
方法的访问修饰符。(访问修饰符一共有四种:private 默认 protece public,其大小关系是
private< 默认< protece <public)在调用方法时,如果你实例化的事子类,那么有限考虑调用子类
的方法,如果子类没有那么就调用父类的方法。
自动转型在继承中有很大的用处的。什么是自动转型?怎样才能用自动转型,有什么好处,这就是
我们需要关心的问题了。下面让我们通过一个实例来说明一下
Role at1=new atm();//自动转型
at1.setName("奥特曼1号");
at1.setBlood(5);
这里我们看到在实例化对象的时候,我们实例化的是子类的对象,但是我们把它赋给了主类,如果
我们把这句话去掉,改成:
atm at1=new atm();
at1.setName("奥特曼1号");
at1.setBlood(5);
因为我们在定义atm类是并没有定义setName()和setBlood()的方法,因此我们是不能调用的,
而如果我们进行自动转型,那么子类就可以调用父类里边的方法了,这是我们也知道了,要想进行自
动转型,那么就要有继承关系!!
自动转型一般在什么时候用到呢,我来说森林的故事。(森林里要进行选拔,很多很多的动物
,狮子老虎大象等等。。)如果我们定义的Pk规则都是相同的,那么PK战很热闹,难道我们每个类里
(狮子 老虎 大象 。。。)都要定义这个PK规则吗,相当的麻烦啊!!!这时我们就可以用到自动转
型了,只要我们在父类里定义一个PK方法,子类里就可以来调用它,省了很多的功夫啊 !!!
另外,在进行
构造方法的重写时,特别要注意一点:
子类中至少要有一个构造方法和父类相同,比如我们来看下面两段程序:
//父类
public class Role {
private String name;
public int blood;
public int score;
public Role(int score){
this.score=score;
}
}
//子类
public class atm1 extends Role {
}
如果是这样的话,子类就会出现报错,我们知道,默认的构造方法是不带参数的,而我们在
父类中重新定义了一个构造方法,那么子类(默认构造方法)中就不在有父类中的构造方法。所以我
们可以把父类改成这样:
//父类
public class Role {
private String name;
public int blood;
public int score;
public Role(int score){
this.score=score;
}
public Role(){ //重新定义一下默认的构造方法
}
如果父类中就是没有无参构造方法,那怎么办呢?
//如果在父类没有无参构造方法时,子类这样定义
public class atm1 extends Role {
public int number;
public atm1(int number){
this.number=number;
}
}
结果是报错,那么到底怎样才能行得通呢?首先我们要知道,子类是不可以继承父类的构造
方法的!!所以我们在子类中必定会调用父类的构造方法,如果父类中有无参构造方法,则调用无参
构造方法,如果父类中只有有参构造方法,那么这时候我们就要用到关键字super!!!
而且我们必须要用super去调用一下父类中的有参构造方法。所以上述程序可以写成
//父类
public class Role {
private String name;
public int blood;
public int score;
public Role(int score){
this.score=score;
}
}
//子类
public class atm1 extends Role {
public int number;
public atm1(int number){
super(number);//调用父类的构造方法
}
}
而如果我们一定要重新定义构造方法在子类里,那么还是记得在父类中写一个无参数的构造
方法吧!!!