继承 与 接口

继承(上):

1. 提高了代码的重用性

2. 让类与类之间产生关系,有了这个关系,才有多态性

注意:千万不要为了获取其他功能,简化代码而继承:

必须是类与类之间有所属关系才可以继承,所属关系 is a。

在java语言中只能是单继承,不支持多继承。

因为:多继承容易带来安全隐患,当多个父类有相同的功能,

当功能内容不同时,子对象不确定运行哪一个。

但是java保留这种机制,用另一种形式表示:多实现。

并且存在多层继承,也就是一个继承体系。

如何使用一个继承体系中的功能?

要想使用体系,先查阅体系父类的描述,因为父类中定义的是体系中共性功能。

通过了解共性功能,就可以知道该体系的基本功能。

为什么具体调用时,创建最子类的对象?

1. 因为有可能父类不能创建对象。

2. 创建子类对象可以使用最多功能,包括基本的还有特有的

简单的一句话:     查阅父类功能,创建子类对象使用功能。

聚集:has a

1. 聚合:球员 和 球队

2. 组合:更紧密    人 和 手

1.变量

如果子类中出现非私有的同名成员变量时

子类要访问本类中的变量,用this

子类要访问父类中的同名变量,用super

super 和 this的使用基本使用几乎一致

this代表的是本类对象的引用

super代表的是父类对象的引用

clas Fu{

public String num = 4;

}

class Zi extends Fu{

int num = 5;

public void show(){

S.o.p(num);

}

}

输出结果:5

假如注销public  String num = 5;

输出结果 : 4

结论:super 和 this 指向同一个对象,父类(super)的引用指向子类的对象。

javase 7.png

子父类中的函数(重写,覆盖)

当子类出现和父类一模一样的函数时,

当子类对象调用该函数,会运行子类函数的内容。

如同父类的函数被覆盖一样。

这种情况就叫做重写(覆盖)

当子类继承父类,沿袭父类的功能,到子类中

但是子类虽然具备该功能,但是功能的内容却和父类不一致,

这时,没有必要定义新的功能,而是使用覆盖特殊,保留父类的功能定义,并且重写功能的内容

public class Tel{

public void show (){

s.o.p("number");

}

}

class NewTel extends Tel{

public NewTel(){

super(); //第一行必须

}

public void show(){

super.show();

s.o.p("name");

s.o.p("pic");

}

}

覆盖:1. 子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败

2. 静态只能覆盖静态

子父类构造函数:

不能覆盖:因为覆盖名称要一模一样,而构造函数是跟类名走,不可能存在覆盖。

子类对象进行初始化时,同时也会调用父类的构造函数。

因为在子类的构造函数中默认会调用父类的构造函数通过super();

为什么子类一定要访问父类的构造函数

因为父类中的数据在子类中直接获取,所以子类建立时需要查看父类是如何

对这些数据进行初始化的。所以子类在初始化时,先要访问一下夫列的构造函数

如果要访问父类中指定的构造函数,可以通过手动的定义的super语句的方式制定

注意:super语句在子类构造函数的第一行

结论: 子类的所有的构造函数默认都会访问父类空参数的构造函数

因为子类每一个构造函数的第一行内都有隐式的父类构造函数

当父类中没有空参数的构造函数,在子类中必须手动的通过super语句形式来指

定访问父类中 的构造函数,当然子类的构造函数的第一行也可以手动的指定this语句来访问

本类中的构造函数。子类中的构造函数至少有一个构造函数访问父类的构造函数

final 关键字:作为一个修饰符,相当于一个死锁永远打不开,也变不了。

1. 可以修饰类,函数,变量。

2. 被final修饰的类不可以被继承。避免被继承,被子类复写功能。

3. 被final修饰的方法都不可以 被复写。

4. 被final修饰的变量是一个常量,只能赋值一次,即可以修饰成员变量,又可以修饰局部变量

当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都会给这个取一个名字

而且这个值不需要更改,所以加上final修饰。常量的书写规范是所有的单词都要大写,并且每个单词之间用下划线分隔开.

5. 内部类定义在类中的局部位置时只能访问局部被final修饰的变量。

继承(下):

抽象类

当多个类中出现相同的功能,但是功能主体不一样。

这是可以进行向上抽取,这时只能抽取功能定义,而不抽取功能主体。

抽象类的特点:

1. 抽象方法一定在抽象类中。

2. 抽象方法和抽象类都必须被abstract关键字修饰。

3. 抽象类不可以用new创建对象,因为调用抽象方法没有意义。

4. 抽象类中方法要想被使用,必须由子类复写这个类的所有的抽象方法后,被子类对象调用

如果子类只覆盖了部分的抽象方法,那么该子类还是个抽象类。

特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类创建对象。

模版方法设计模式

什么是模版方法?

在定义动能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分时。

那么这时就将不确定的部分暴露出去,由子类去完成。

示例代码:

public class Demo2 {

public static void main(String args[]){

new GetTimes().getTime();

}

}

abstract class GetTime{

public void getTime(){//final 确保方法不会被重写

Long start = System.currentTimeMillis();

doThing();

Long end = System.currentTimeMillis();

System.out.println("工作时间 = " + -(start - end));

}

public abstract void doThing();//暴露一个抽象方法给子类去实现想要做的具体事情

}

class GetTimes extends GetTime{

public void doThing(){//子类实现父类的抽象方法,去干具体想干的事情

for(int i = 0 ; i < 10000; i ++)

System.out.print(i);

}

}

接口

当抽象类中的方法都是抽象的,那么该类可以通过接口的形式表示。

class 用于定义类     interface用于定于接口

接口定义时,格式特点:

1. 接口的常见定义: 常量,抽象方法

2. 接口中的成员都是有固定的修饰符

常量: public static final

方法: public abstract

记住:接口中的成员都是public的

接口: 是不可以被创建对象,因为有抽象方法。

需要在被子类实现,子类对接口中的抽象方法全部覆盖以后,子类才可以实例化。

否则子类还是一个抽象类

·     接口可以被类多实现,也是对多继承转换形式。

继承 与 接口

时间: 2025-01-15 14:29:36

继承 与 接口的相关文章

继承与接口1

下面程序输出什么: #include<iostream> using namespace std; class A { public: void virtual f(){ cout<<"A"<<endl; } }; class B:public A{ public: void virtual f(){ cout<<"B"<<endl; } }; int main() { A* pa=new A();//定义

Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇

Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript时,可以选择面向过程的方式编程,显得高效:但在实际工作中,遇到的项目需求和框架较大的情况下,选择面向对象的方式编程显得尤其重要,Javascript原生语法中没有提供表述面向对象语言特性的关键字和语法(如extends.implement).为了实现这些面向对象的特性,需要额外编写一些代码,如下.

关于Java中继承和接口的理解

关于Java中继承和接口的理解 Java语言中,为了实现代码重用,设计了继承这一机制,但是,其设计成单继承,这样设计是有原因的,如下图: Figure1:deadly diamond of death 此图问题称为菱形问题(diamond problem),就是说,当A的子类B和C同时实现了A中的方法,则同时继承了B和C的子类D在调用该方法时会出现混乱,无法得知该调用哪一个方法. 既然不能实现多继承,我们就会考虑把很多方法就写在父类里,或者继承抽象类,实现其方法,但是,这样会导致一个问题,比如说

黑马程序员——JAVA学习笔记四(继承、接口、内部类)

1,    通过extends关键字让类与类之间产生继承关系.多个类中存在相同属性和行为时,将这些内容抽取到单独的一个类中,那么多个类无需定义这些属性和行为,只要继承那个类即可,已存在的类叫做超类,基类,或父类.新类称为子类,派生类,孩子类. 子类可以直接访问父类中的非私有的属性和行为.子类无法继承父类中私有的内容.JAVA不支持多继承,只支持单继承,多实现. 继承提高了代码复用性,让类与类之间产生了关系.为多态提供了前提. 2,    super关键字代表父类中成员变量内存空间的标示.两个作用

面向对象,继承和接口的使用理解

面向对象: 将你要将各种小类组合成一个大类的时候,面向对象的思想只需要在大类中添加一个小类的实例.这样可以提升代码的重用率. 继承: 当需要对父类进行扩张来得到一个拥有一些额外方法或者属性的时候使用.当父类的一些东西需要重写时使用也相当重要.抽象类:抽象类.中的抽象方法必须被实现,而可以有非abstract的方法和数据.这就区别于接口使得它更加灵活.在某些特定方法只会在这个类的子类中需要使用的时候,就没有必要特地为这个方法书写一个接口.抽象类用于抽象一个实际物品的时候特别有效. 接口: 因为接口

编写高质量代码改善C#程序的157个建议——建议56:使用继承ISerializable接口更灵活地控制序列化过程

建议56:使用继承ISerializable接口更灵活地控制序列化过程 接口ISerializable的意义在于,如果特性Serializable,以及与其像配套的OnDeserializedAttribute.OnDeserializingAttribute.OnSerializedAttribute.OnSerializingAttribute.NoSerializable等特性不能完全满足自定义序列化的要求,那就需要继承ISerializable了. 以下是格式化器的工作流程:如果格式化器

从头认识java-7.5 怎样通过继承扩展接口?

我们这一章节来讨论一下怎样通过继承扩展接口. 接口跟类一样,具有继承的特性,但是他只是继承接口,不继承类. package com.ray.ch07; interface WhatPersonCanDo { void run(); void sleep(); } interface WhatSingerCanDo extends WhatPersonCanDo { void sing(); } class Singer implements WhatSingerCanDo { @Override

基础学习day07---面向对象三---继承,接口与 抽象类

一.继承 1.1.继承概念 将对象的共性抽取出来.提取出一个单独的类. 继承使用复用以前的代码非常容易,能够大大的缩短开发周期,降低开发成本,同时增加程序的易维护性 继承使重一个类A能够直接使用另外一个类B的属性和方法的一种途径 类A可以有自己的属性和方法通过 extends 关键字让类与类之间产生继承关系. 让类和类之间产生了关系,有了这个关系,才有了多态的特性. 注意:千万不要为了获取其他类的功能,简化代码而继承. 必须是类与类之间有所属关系才可以继承,所属关系是 is  a.的关系 1.2

12.面向对象(继承/super/接口/抽象类)

面向对象继承与派生继承继承顺序继承原理子类调用父类的方法(super)组合接口接口的概念:接口的概念解释和使用:python中的接口:抽象类 面向对象 继承与派生 继承 什么是继承?继承是一种创建新的类的方式 class A: pass class B(A): pass 在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或者超类,新建的类称为派生类或者子类 python中类的继承分为,单继承和多继承. 查看继承的方法B.__bases__ 如果没有指定基类,python的类会默