当前位置: 首页 / 技术分享 / 正文
好程序员大数据培训分享大数据实用教程系列之继承

2019-12-11

BigData 好程序员 大数据培训 大数据教程

好程序员大数据培训分享实用教程之继承,首先讲一下继承的基本概念

如果有多个类中有相同的特征和行为(属性和方法),并且这多个类之间从逻辑上讲是有一定的关联的。那么此时,我们可以将这些共同的部分单独写到一个类中。

>

> > Monkey: name, age, gender,  walk(), sleep(), eat()

> >

> > Tiger: name, age, gender,  walk(), sleep(), eat()

> >

> > Elephent:  name, age, gender,  walk(), sleep(), eat()

>

> > 可以将上述三种类中,共同的部分提取出来

> >

> > Animal: name, age, gender,  walk(), sleep(), eat()

>

此时,被提取出的这个类,称作是--**父类**,基类,超类

>

具有相同特征的那些类,称作是--**子类**,派生类

>

> > A类派生出B类:AB的父类,BA的子类

>

他们之间的关系,是 **继承**:子类继承自父类

 

关键字:**extends**

 

用来描述两个类之间的继承关系

>

> ```java

> class Monkey extends Animal {}

> // Monkey继承自Animal

> // MonekyAnimal的子类,AnimalMonkey的父类

> ```

 

#### 继承中的特点

 

1. Java语言是单继承的,一个类只能有一个父类,一个类可以有多个子类

 

   > 在某些语言中是支持多继承的。例如:C++python...

   >

   > 但是在多继承中,会有一个问题:二义性。

   >

   > 虽然很多语言都抛弃了多继承,但是还是会用其他的方式来间接的实现类似多继承。

   >

   > 例如:在java中是用接口实现的。

   >

   >  

   >

   > Java中所有的类都直接或者简介的继承自 **Object** 

 

2. 子类可以访问到父类中能看的见的成员

 

   > 能看得见的:访问权限

 

3. 构造方法不能继承。

 

为什么要用继承?

 

1. 为了降低代码冗余度

 

2. 为了给一个类拓展功能。

 

   > 如果某一个类给我们提供的功能不能满足我们的需求了,而且此时我们还不能修改这个类。那么我们要第一时间想到继承。

 

#### 继承中的构造方法

 

一个对象在实例化的时候,需要先去实例化从父类继承到的成员

>

在实例化父类部分的时候,默认使用父类中的无参构造

>

>  

>

问题:如果父类中没有无参构造,或者父类中的无参构造子类无法访问(使用private修饰无参构造),则此时子类对象无法完成实例化。

>

解决:

>

> 1. 给父类中添加一个子类能够访问到的无参构造方法

>

> 2. 在子类的构造方法中,手动调用父类中能够访问到的构造方法,来实例化父类部分

 

#### 方法的重写

 

继承中最重要的一个知识点

 

重写,又叫做覆写,值得是对同样的一个方法,用子类的实现覆盖掉父类的实现。

 

> @Override:

>

>  是一个注解,常用在方法的重写中。表示在进行方法重写之前,进行一个验证。验证这个方法,到底是不是在重写父类中的方法。这个注解,可以添加,也可以不添加。但是,一般情况下,我们都是要加上去的

 

在重写的时候需要注意的问题:

>

> 1. 访问权限问题:

>

>    子类方法的访问权限不能比父类方法中的访问权限低,要大于等于父类方法的访问权限

>

>    public > protected > default > private

>

> 2. 关于返回值类型:在重写的时候,要求方法名和参数必须和父类中方法相同

>

>    子类方法的返回值类型可以和父类方法中返回值类型相同。也可以是父类方法中返回值类型的子类型。

>

> 3. 关于异常的抛出。

 

####final关键字

 

修饰 意义                                   |

| ---- | -------------------------------------- |

变量 这个变量的值不能改变,就是常量         |

类   表示是一个最终类,这个类无法被继承     |

方法 表示是一个最终方法,这个方法无法被重写 |

 

#### super关键字的使用

 

super表示对父类的引用。

 

用在构造方法中,可以使用super()调用父类的构造方法

在普通的方法中可以调用父类的方法

 

#### 访问权限修饰符

 

用来描述一个类、方法、属性、接口、枚举...能够被访问到的一个范围

>

访问权限一共有四种:

>

公开(public

>

保护(protected

>

包(default / package

>

私有(private

>

> public > protected > default > private

>

对应的访问权限修饰符一共有三个:

>

> publicprotectedprivate

>

> > 注:包权限没有访问权限修饰符,如果一个方法、属性、类...没有使用任意的访问权限修饰符来修饰,那么他的访问权限就是包权限

 

访问权限  可以修饰什么 可以访问的范围                                 |

| --------- | ------------ | ---------------------------------------------- |

| private   | 类成员       只能在当前的类中访问                           |

| default   | 类成员、类   只能在当前的包中进行访问                       |

| protected | 类成员       可以在当前的包中访问,也可以在跨包的子类中访问 |

| public    | 类成员、类   可以在项目中任意的位置进行访问                 |

 

 

#### Object

 

> Object这个类是所有类的父类,在Java中,所有的类都直接或者间接的继承自Object

>

Object类中,定义了一些我们比较常用的方法。

 

```java

/**

 * 返回一个对象的字符串表示形式。

 * 这个方法,在一个对象需要转型成字符串类型的时候,自动调用

 * 例如:在控制台输出、和字符串做拼接

 */

public String toString() {

    return "";

}

 

/**

 * 获取一个对象的类型(Class对象)

 */

public Class<?> getClass();

 

/**

 * 用来比较两个对象是否相同的,在Object类中,默认还是比较两个对象的地址

 * 可以重写equals,实现自己的比较的规则

 * 1、如果othernull,返回结果一定是false

 * 2、如果this == other,返回结果一定是true

 * 3、如果thisother的类型不同,返回结果一定是false

 * 4、如果x.equals(y) == true,那么 y.equals(x) 一定也得是true

 * 5、如果x.equals(y) == true, y.equals(z) == true, 那么 x.equals(z) 一定也得是true

 *

 * 如果两个对象用来比较是否相同,尽量使用equals来比较。

 * 如果两个基本数据类型是否相同,不要使用equals,直接使用==即可

 */

public boolean equals(Object other) {

    return (this == other);

}

 

/**

 * 获取一个对象的哈希码、散列码。

 * 如果在一个对象没有在一个散列序列中的话,没有任何作用。

 * 但是,如果一个对象是存储在一个散列序列中,这个方法有大作用。

 * 散列序列: HashSetHashMap...

 */

public int hashCode() ;

 

/**

 * 析构方法

 * 在实例化一个对象的时候,会执行构造方法。当这个对象被销毁之前,会执行这个析构方法。

 */

protected void finalize() throws Throwable { }


好程序员开班动态

More+
  • HTML5大前端 <高端班>

    开班时间:2020-02-17(北京)

    开班盛况

    开班时间:2020-03-02(深圳)

    预约报名
  • 大数据+人工智能 <好程序员严选班>

    开班时间:2019-12-23(北京)

    开班盛况
  • 大数据+人工智能 <好程序员班>

    开班时间:2020-02-24(杭州)

    预约报名

    开班时间:2020-02-17(北京)

    开班盛况
  • JavaEE分布式开发 <高端班>

    开班时间:2020-03-09(北京)

    预约报名
  • Python全栈+人工智能 <高端班>

    开班时间:2019-07-22(北京)

    开班盛况
  • 云计算开发 <高端班>

    开班时间:2020-02-24(北京)

    预约报名
在线咨询
免费试听
入学教程
立即报名

Copyright 2007-2019 北京千锋互联科技有限公司 .All Right 京ICP备12003911号-5 京公安网11010802011455号