黑马程序员————面向对象之继承

------- android培训java培训、期待与您交流! ----------

众所周知,面向对象思想有三大特征:封装,继承,多态。

下面详细说说继承。

 

多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承单独     的那个类即可。多个类成为子类,单独的这个类成为父类或者超类。子类可以直接访问父类中的非私有的属性和行为。

Java通过extends关键字让类与类之间产生继承关系。

格式:

                   class 子类名 extends 父类名 {}

举例:

         class Person {

         public void eat() {

                   System.out.println("吃饭");

         }

        

         public void sleep() {

                   System.out.println("睡觉");

         }

}

 

class Studentextends Person {}

 

class Teacherextends Person {}

 

classExtendsDemo {

         public static void main(String[] args){

                   Student s = new Student();

                   s.eat();

                   s.sleep();

                   System.out.println("-------------");

                  

                   Teacher t = new Teacher();

                   t.eat();

                   t.sleep();

         }

}

继承的好处:

1、  提高了代码复用性

2、  提高了代码的维护性

3、  让类与类之间产生了关系,提供了多态的前提

继承的弊端:打破了封装性

 

Java中继承的特点:

1、  java只支持单继承,不支持多继承(容易带来安全隐患)

2、  java支持多层继承(继承体系)

继承的注意事项:

1、  子类只能继承父类所有非私有的成员(成员变量和成员函数);

2、  子类不能继承父类的构造方法,但可以super关键字访问父类的构造方法;

3、  千万不要为了获取其他类的功能,简化代码而继承,必须是类与类之间有所属关系才可以继承。

 

我们知道类的组成有:成员变量,构造函数和成员函数。那么在子父类关系形成以后,类的组成部分之间的关系是怎么样的       呢?

1、  成员变量

1)  子类中的成员变量和父类中的成员变量名称不一样,这时子类中既有本类中自定义的成员变量,也有从父类中            继承的非私有的成员变量;

2)  子类中的成员变量和父类中的成员变量名称一样,那么在子类方法中访问这个成员变量的查找顺序如下:

a)  现在子类方法中的局部范围找,找到了就使用

b)  然后在子类的成员范围找,找到了就使用

c)  再在父类的成员范围找,找到了就使用

d)  如果都找不到,就报错

总之一句话:就近原则。

但是如果我们不仅要访问子类中的成员变量,也要同时访问父类中的同名成员变量呢?这时候可以通过super关键字访问父类     中的成员变量:super.成员变量。

2、  构造函数

1)  子类中所有的构造方法默认都会访问父类中空参数的构造函数。

因为子类会继承父类中的数据,可能还会使用父类中的数据,所以子类在初始化之前一定要完成父类数据的初始化。

注意:子类每一个构造函数的第一条默认语句都是:super();

2)  如果父类构造函数中没有无参数的构造函数,那么在不改变父类构造函数的前提下子类必须

a)  通过super关键字在构造函数中调用父类的带参数构造函数

b)  通过this关键字调用本类中的其他构造方法。

子类中一定要有一个构造函数访问父类中的构造函数,否则父类数据就没有初始化。并且this语句和super                     语句必须出现在子类构造函数的第一条语句上。

3、  成员函数

1)  子类中的方法和父类中的方法的声明不一样,那么子类既有本类方法,同时也具有父类方法

2)  子类中的方法和父类中的方法声明一样,这种现象叫做方法重写。

     当子类继承了父类,沿袭了父类中的功能到子类中,但是子类虽然具备该功能,但是功能的内容却和父类不一                  致,这时没有必要重新定义新功能,而是使用重写特性,保留父类的功能定义,并覆盖功能内容。

   举例:手机有打电话功能,而现在出了一款新型手机,在打电话的同时能对通话内容进行录音,显然这款新型手机  是手机的子类,本身具备打电话功能,只不过功能有点不同而已,这时候就可以用到函数的重写特性。

手机类:

class Phone{

   private String name;

   public void call{

   System.out.prinltn(“call”);

}

}

新款手机:

class NewPhone extends Phone{

   public void call{

             super.call();//通过super关键字访问父类成员

            System.out.println(“record”);

   }

}

函数重写的注意事项:

a)  父类中的私有函数不能被重写

b)  必须保证子类权限大于等于父类权限,才可以重写,否则编译失败

c)  父类中的静态函数,子类也必须通过静态函数进行复写



你可能感兴趣的:(java学习,面向对象)