以前自己了解过继承,对很多概念总是特别模糊,今天听了左哥的讲解后,清晰了很多,下面谈谈我的理解:
继承简单来说就是子类继承父类的东西,为什么要用继承,用继承有什么好处呢?假如一个类中有很多属性和方法,而此时另一个类中也需要该类中的很多属性和方法,如果重新写会因为代码较多觉得比较麻烦,这时就可以采用继承,继承的方式为:子类 extends 父类,这样子类就可以直接使用父类中的属性和方法了,但是要注意,子类通过继承关系只能获取父类的非私有权限的属性和方法。如果父类当中有抽象方法,则子类必须重写父类中的抽象方法,当普通类继承抽象类的时候,需要重写抽象类中的抽象方法,一个子类只能继承一个父类,这叫做单继承,而一个父类可以被多个子类继承,这很好理解,一个人只能有一个父亲,而一个父亲可以有多个孩子。
对于继承接口,我们用关键字implements,即:子类 implements 父类,由于接口里全是抽象方法,所以如果是普通类继承接口,则必须重写接口中的所有方法;如果是抽象类继承接口,则可以不用全部重写接口中的方法,因为抽象类中也可以存在抽象方法。一个类可以继承多个接口。
上面提到方法重写,那么为什么要重写呢?举个例子:当一个普通类从抽象类或者接口中继承时,当然会把他们中的抽象方法继承过来,而普通方法中不能有抽象方法,所以必须进行重写,将抽象方法重写成普通方法,重写时,子类的方法名、参数、返回值必须和父类继承过来的方法一致,不同的是自己添加方法体。
自动转型:即子类对象自动转为父类类型。
class A extends B
B a = new A
从上面的代码可知,A类继承了B类,实例化A 类的时候本应该是A a =new A ,而A是B的子类,故A 的对象a可以自动转型为父类B,所以就成了B a = new A。注意一点,转型后的对象,如果子类重写了父类方法,则执行的仍然是重写后的。
多态是一种现象:即同一个类型的对象,执行同一个方法,执行过程不一样。如下面的程序:
public class People {
public void study(){
System.out.println("人类在学习");
}
public void play(){
System.out.println("人类在玩");
}
}
public class Student extends People{
public void study() {
System.out.println("学生在认真的学习");
}
}
public static void main(String[] args) {
People peo = new Student();//自动转型
Student stu = new Student();
People peo1 = new People();
peo.study();
stu.study();
peo1.study();
}
学生在认真的学习
学生在认真的学习
人类在学习
上面代码中peo和peo1都是People类的对象,都是执行study()方法,最后的过程和结果却不一样,这就是多态现象。
构造函数: 形式为: 访问权限 类名(){} 构造函数的作用是用来构造对象,在创建对象的时候执行,并且具有返回值,返回的是对象在内存中的地址。
方法重载:方法重载需要满足以下条件:1.在一个类中 2.方法名相同 3.参数类型、参数个数、参数顺序不一样的方法互为重载方法。
满足上面条件的方法互为重载方法,当然,构造方法也可以重载:如果重载了构造函数,则类中默认的构造方法没有了,如果还需要用到无参的构造方法,则必须显
性定义在类中。
<span style="white-space:pre"> </span>public void study(){
System.out.println("学生在学习");
}
public void study(int a){
System.out.println("学生在学习2");
}
public void study(int c,int d){
<pre name="code" class="java"><span style="white-space:pre"> </span>System.out.println("学生在学习3");
}
public void study(String str){
System.out.println("学生在学习4");
}
public void study(int a,String b){
<pre name="code" class="java"><span style="white-space:pre"> </span>System.out.println("学生在学习5");
}
public void study(String b,int a){
<pre name="code" class="java"><span style="white-space:pre"> </span>System.out.println("学生在学习5");
}
由定义可知:同一个类中以上方法互为重载方法。