继承是java三大特性之一(另外两个是封装和多态)
通常只要你能说通 xx是xx的一种,就能用继承,
java是单继承的,意味着一个类一次只能从另一个类继承,但是可以从很多不同的类选择一个来继承,比如熊猫,可以从动物继承,也可以成需要被保护的东西继承。被继承的类叫做父类(基类),继承的类叫做子类。java中的继承使用extends关键字。
首先举个简单例子:
public class Child extends Parent
{
publicChild()
{
System.out.println("child");
super(1);
}
publicstatic void main(String[] args)
{
Child child= new Child();
}
}
class Parent
{
publicParent(int i)
{
System.out.println("parent");
}
}
以前真还没有搞清楚继承的具体过程是怎么实现的。
1)首先是这样的,如果一个类继承另外一个类,那么首先要生成父类的对象。
2)这里就有意思了,父类里面有构造方法,那么父类里面的无参构造方法首先会被调用,然后生成父类对象。
3)然后才是调用子类无参构造方法生成子类的对象
也就说在内存中,现在栈内存中生成一个子类的引用,然后在堆内存中生成一个父类的对象,然后再在堆内存里面生成一个子类的对象,子类的对象除了包含子类自己的成员变量之外,还包含了父类的对象。
但是有2个问题:
1)如果父类里面已经定义了有参的构造方法,而无参的构造方法就会被冲掉(也就是系统不会自动为其类生成无参构造方法)。那么编译就会报错。
2)假如我并不想调用父类的无参构造方法,而想调用其它有参构造方法,但是系统会自动去找父类的无参构造方法,怎么办
解决方法:super关键字。
以前我没有很好的理解super关键字的用法,现在好像清楚了,至少清楚其中一种了。也就是用于显式地调用父类里面的构造函数。
super(括号里面是构造函数的实际参数);
这样就可以引用父类的特定的构造方法。系统就不会按照默认地去寻找父类的无参构造方法了。其实默认地相当于就执行了super();意思就是调用父类的不带参数的构造方法。
注意:如果用super调用父类构造方法的话,必须用在子类构造方法的第一行
几点总结:
1)父类有的,子类都有
2)父类没有的,子类可以增加
3)父类有的,子类可以改变
4)构造方法不能被继承,只能通过super关键字调用 (这有什么区别呢???在csdn上发帖,得到了如下回复)
网上的解释大致是这样的,“ 究其原因,想必是java语言设计者,要求子类有责任保证它所继承的父类尽快进入到一个稳定、完整的状态中。试想,如果没有这个约束,那么子类的某个继承自父类的方法可能会使用到父类中的一些变量,而这些变量并没有进行初始化,从而产生一些难以预料的后果,因此构造子类的对象前,必须构造父类的对象,并将之隐含于子类对象之中,使用关键字super引用父类对象。”
5)方法和属性可以被继承
6)子类的构造方法隐式地调用父类的不带参数的构造方法
7)当父类没有不带参数的构造方法时,子类需要使用super来显式地调用父类的构造方法,super指的是对父类的引用
8)super关键字必须是子类构造方法的第一行语句
方法重写(override):又叫覆写,子类与父类的方法返回类型一样,方法名称一样,参数一样,这样的话子类和父类的方法就构成了重写关系。重写的方法不能使用比被重写的方法更加严格的访问权限,这样做对多态不会造成影响。
为什么要重写呢???父类的方法也许写得很general,比如说一个动物的类,有一个run方法,但是它不可能适用于每种东西,狗有狗的跑法,猫有猫的跑法,所以在定义具体的子类方法的时候,要重写这个方法。
方法重写与方法重载的关系:
1)重载是发生在一个类内部的2个或者多个方法,是平行的关系
2)重写发生在父类与子类之间,是一种层次关系
super.方法名---调用父类的方法
注意:在构造方法中super必须在子类构造方法的第一行语句,因为必须要通过调用父类构造方法来生成父类的对象,但是在普通方法中,因为已经生成父类对象了,所以super语句的位置就没有限制了,不必放在第一行语句。
在定义一个类的时候,如果没有显式地指定该类的父类,那么这个类就会继承java.lang.Object类,它是JDK提供的一个类,Object类是java中所有类的直接或者间接的父类。
通常只要你能说通 xx是xx的一种,就能用继承,
java是单继承的,意味着一个类一次只能从另一个类继承,但是可以从很多不同的类选择一个来继承,比如熊猫,可以从动物继承,也可以成需要被保护的东西继承。被继承的类叫做父类(基类),继承的类叫做子类。java中的继承使用extends关键字。
首先举个简单例子:
public class Child extends Parent
{
publicChild()
{
System.out.println("child");
super(1);
}
publicstatic void main(String[] args)
{
Child child= new Child();
}
}
class Parent
{
publicParent(int i)
{
System.out.println("parent");
}
}
以前真还没有搞清楚继承的具体过程是怎么实现的。
1)首先是这样的,如果一个类继承另外一个类,那么首先要生成父类的对象。
2)这里就有意思了,父类里面有构造方法,那么父类里面的无参构造方法首先会被调用,然后生成父类对象。
3)然后才是调用子类无参构造方法生成子类的对象
也就说在内存中,现在栈内存中生成一个子类的引用,然后在堆内存中生成一个父类的对象,然后再在堆内存里面生成一个子类的对象,子类的对象除了包含子类自己的成员变量之外,还包含了父类的对象。
但是有2个问题:
1)如果父类里面已经定义了有参的构造方法,而无参的构造方法就会被冲掉(也就是系统不会自动为其类生成无参构造方法)。那么编译就会报错。
比如说:Implicit super constructor Parent()is undefined.
解决方法:super关键字。
以前我没有很好的理解super关键字的用法,现在好像清楚了,至少清楚其中一种了。也就是用于显式地调用父类里面的构造函数。
super(括号里面是构造函数的实际参数);
这样就可以引用父类的特定的构造方法。系统就不会按照默认地去寻找父类的无参构造方法了。其实默认地相当于就执行了super();意思就是调用父类的不带参数的构造方法。
注意:如果用super调用父类构造方法的话,必须用在子类构造方法的第一行
几点总结:
1)父类有的,子类都有
2)父类没有的,子类可以增加
3)父类有的,子类可以改变
4)构造方法不能被继承,只能通过super关键字调用 (这有什么区别呢???在csdn上发帖,得到了如下回复)
网上的解释大致是这样的,“ 究其原因,想必是java语言设计者,要求子类有责任保证它所继承的父类尽快进入到一个稳定、完整的状态中。试想,如果没有这个约束,那么子类的某个继承自父类的方法可能会使用到父类中的一些变量,而这些变量并没有进行初始化,从而产生一些难以预料的后果,因此构造子类的对象前,必须构造父类的对象,并将之隐含于子类对象之中,使用关键字super引用父类对象。”
5)方法和属性可以被继承
6)子类的构造方法隐式地调用父类的不带参数的构造方法
7)当父类没有不带参数的构造方法时,子类需要使用super来显式地调用父类的构造方法,super指的是对父类的引用
8)super关键字必须是子类构造方法的第一行语句
方法重写(override):又叫覆写,子类与父类的方法返回类型一样,方法名称一样,参数一样,这样的话子类和父类的方法就构成了重写关系。重写的方法不能使用比被重写的方法更加严格的访问权限,这样做对多态不会造成影响。
为什么要重写呢???父类的方法也许写得很general,比如说一个动物的类,有一个run方法,但是它不可能适用于每种东西,狗有狗的跑法,猫有猫的跑法,所以在定义具体的子类方法的时候,要重写这个方法。
方法重写与方法重载的关系:
1)重载是发生在一个类内部的2个或者多个方法,是平行的关系
2)重写发生在父类与子类之间,是一种层次关系
super.方法名---调用父类的方法
注意:在构造方法中super必须在子类构造方法的第一行语句,因为必须要通过调用父类构造方法来生成父类的对象,但是在普通方法中,因为已经生成父类对象了,所以super语句的位置就没有限制了,不必放在第一行语句。
在定义一个类的时候,如果没有显式地指定该类的父类,那么这个类就会继承java.lang.Object类,它是JDK提供的一个类,Object类是java中所有类的直接或者间接的父类。
本文详细介绍了Java中的继承概念,包括如何实现继承、构造方法的调用流程、super关键字的使用及方法重写的规则。同时,文章还探讨了继承过程中的一些常见问题及其解决方案。
2167

被折叠的 条评论
为什么被折叠?



