回顾封装

关于面向对象三大特性,我们可以很自信的回答:封装、继承、多态

之前学习的封装,可以很直观的理解为了保护数据,我们在idea中可以用alt+insert进行一个选择



constructer构造方法

getter和setter方法就是对封装的一个体现,我们一般将类中的数据设为private,这样new对象时可以防止用户对数据进行修改,而getter和setter方法的建立就是为了进行修改和获得数据

这样更能体现封装性

继承

多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可。

其中,多个类可以称为子类,单独那一个类称为父类、超类(superclass)或者基类。

继承描述的是事物之间的所属关系,这种关系是: is-a 的关系。

上面的是一个基本的概述,很明显的可以看出只要我们有一个相似的属性,我们可以提取公共性质,形成一个父类,后面再有其他的类需要进行继承这些属性和方法的时候,我们就可以不需要重写那些已经写过的方法。

我们也可以对继承的方法进行覆盖重写。具体容后再说

继承的定义:

就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。

继承的好处:

  1. 提高代码的复用性。
  2. 类与类之间产生了关系,是多态的前提。

继承的格式:

class 父类 {
...
}
class 子类 extends 父类 {
...
}

我们在子类中进行一个变量的定义,如果定义父类中未曾出现的变量,这是可以吗?

答案是可以的,子类中出现与父类不同的变量,是可以的。

子父类中出现了同名的成员变量时,在子类中需要访问父类中非私有成员变量时,需要使用super 关键字,修饰父类成员变量,类似于之前学过的 this 。

使用格式:

super.父类成员变量名

Fu 类中的成员变量是非私有的,子类中可以直接访问。若Fu 类中的成员变量私有了,子类是不能直接访问的。通常编码时,我们遵循封装的原则,使用private修饰成员变量,那么如何访问父类的私有成员

变量呢?对!可以在父类中提供公共的getXxx方法和setXxx方法。

我们需要进行父类方法的重写,我们应该如何去操作呢?

如果子类父类中出现重名的成员方法,这时的访问是一种特殊情况,叫做方法重写 (Override)。

方法重写 :子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。声明不变,重新实现。

建议:在子类重写的方法体上@override

注:

  1. 子类方法覆盖父类方法,必须要保证权限大于等于父类权限。
  2. 子类方法覆盖父类方法,返回值类型、函数名和参数列表都要一模一样。

重载(overroad):可以不同的参数列表

关于构造方法:

  1. 构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的。
  2. 构造方法的作用是初始化成员变量的。所以子类的初始化过程中,必须先执行父类的初始化动作。子类的构造方法中默认有一个super() ,表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用(super方法只能出现在构造方法的第一行)

super和this的含义

super :代表父类的存储空间标识(可以理解为父亲的引用)。

this :代表当前对象的引用(谁调用就代表谁)。

super和this的用法

  1. 访问成员
this.成员变量 ‐‐ 本类的
super.成员变量 ‐‐ 父类的
this.成员方法名() ‐‐ 本类的
super.成员方法名() ‐‐ 父类的
  1. 访问构造方法
this(...) ‐‐ 本类的构造方法
super(...) ‐‐ 父类的构造方法

子类的每个构造方法中均有默认的super(),调用父类的空参构造。手动调用父类构造会覆盖默认的super()。super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现。

继承的特点

Java是单继承,不是多继承,也就是说一个类只允许有一个父亲

java支持多层继承

class A{}
class B extends A{}
class C extends B{}

最顶层的父类(祖宗)也就是object类

抽象类

父类中的方法,被它的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了。我们把没有方法主体的方法称为抽象方法。Java语法规定,包含抽象方法的类就是抽象类。

定义:

  • 抽象方法 : 没有方法体的方法。
  • 抽象类:包含抽象方法的类。

抽象的单词是abstract,所以抽象的方法也用abstract进行一个修饰。

抽象方法只有方法名,没有方法体

定义格式:

修饰符 abstract 返回值类型 方法名 (参数列表);

代码举例:

public abstract void run();

抽象类

如果一个类包含抽象方法,那么这个类必须是抽象类

定义格式:

abstract class 类名字 {
}

代码举例:

public abstract class Animal {
public abstract void run();
}

继承抽象类的子类必须重写父类所有的抽象方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该父类的抽象方法,否则,从最初的父类到最终的子类都不能创建对象,失去意义。

注意事项:

关于抽象类的使用,以下为语法上要注意的细节,虽然条目较多,但若理解了抽象的本质,无需死记硬背。

  1. 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。
  2. 抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。
  3. 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
  4. 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
  5. 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。

关于继承的小案例,发红包

这里给出具体代码,加深理解,我就不进行诠释了

Person类:

package cn.qioha.test;

public class Person {
private String name;
private int money; public Person() {
} public Person(String name, int money) {
this.name = name;
this.money = money;
}
public void show(){
System.out.println("my name is"+name+",money is"+money);
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getMoney() {
return money;
} public void setMoney(int money) {
this.money = money;
}
}

Manager类:

package cn.qioha.test;

import java.util.ArrayList;

public class Manager extends Person{
public Manager(String name, int money) {
super(name, money);
}
public ArrayList<Integer> send(int totalMoney,int count){
ArrayList<Integer> list = new ArrayList<>();
int money = super.getMoney();
super.setMoney(super.getMoney()-totalMoney);
if(totalMoney > money){
System.out.println("your money not enough");
return list;
}
int m = totalMoney / count;
for (int i = 0; i < count - 1; i++) {
list.add(m);
}
int n = totalMoney % count;
list.add(m+n);
return list;
}
}

Member类:

package cn.qioha.test;

import java.util.ArrayList;
import java.util.Random; public class Member extends Person{
public Member(String name, int money) {
super(name, money);
}
public void resive(ArrayList<Integer> list){
int num = new Random().nextInt(list.size());
int money = list.remove(num);
super.setMoney(super.getMoney()+money);
}
}

demo(实例类):

package cn.qioha.test;

import java.util.ArrayList;

public class demo {
public static void main(String[] args) {
Manager ma = new Manager("peter",100);
Member q = new Member("anna",0);
Member w = new Member("nana",0);
Member e = new Member("qing",0); ma.show();
q.show();
w.show();
e.show();
ArrayList<Integer> list = new ArrayList<>();
list = ma.send(40,3);
q.resive(list);
w.resive(list);
e.resive(list); System.out.println("================");
ma.show();
q.show();
w.show();
e.show();
}
}

doc文档注释我就没有进行一个撰写了,因为比较的简单,希望各位同行多多指教!

面向对象之继承以及抽象(Java实现)的更多相关文章

  1. Java基础---继承、抽象、接口

    一.概述         继承是面向对象的一个重要特征.当多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继那个类即可.这时,多个类可以称为子类,单 ...

  2. java四大特性理解(封装继承多态抽象)

    封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...

  3. Java面向对象(继承、抽象类)

    面向对象 今日内容介绍 u 继承 u 抽象类 第1章 继承 1.1 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成 ...

  4. 【Java基础】【08面向对象_继承&方法&final】

    08.01_面向对象(代码块的概述和分类)(了解)(面试的时候会问,开发不用或者很少用) A:代码块概述 在Java中,使用{}括起来的代码被称为代码块. B:代码块分类 根据其位置和声明的不同,可以 ...

  5. Java基础语法<八> 继承 多态 抽象 反射

    1.超类和子类 超类和子类 父类与子类 多态: 一个对象变量可以指示多种实际类型的现象称为多态 一个变量可以引用父类对象,也可以引用其子类对象,这就是多态. 不能将一个超类的引用赋给子类变量,因为调用 ...

  6. Java面向对象之继承(一)

    目录 Java面向对象之继承 引言 继承的特点 语法格式 父子类的关系 继承要点 重写父类方法 继承中的构造器 继承中的super关键字 ... Java面向对象之继承 继承是面向对象的第二大特征,是 ...

  7. Java入门 - 面向对象 - 01.继承

    原文地址:http://www.work100.net/training/java-inheritance.html 更多教程:光束云 - 免费课程 继承 序号 文内章节 视频 1 概述 2 继承的特 ...

  8. JAVA学习线路:day01面向对象(继承、抽象类)

    所有的文档和源代码都开源在GitHub: https://github.com/kun213/DailyCode上了.希望我们可以一起加油,一起学习,一起交流. day01面向对象[继承.抽象类] 今 ...

  9. Java ,python面向对象的继承及其区别

    JAVA JAVA继承基本样式 class Demo extends Object{ Demo(int a){ this(); } Demo(){ super(); } } java默认继承Objec ...

随机推荐

  1. class 类前向声明

    /*   使用前向引用声明虽然可以解决一些问题,但它并不是万能的.需要注意的是,   尽管使用了前向引用声明,但是在提供一个完整的类声明之前,不能声明该类的对象,   也不能在内联成员函数中使用该类的 ...

  2. 温故知新-Mysql锁&事务&MVCC

    文章目录 锁概述 锁分类 MyISAM 表锁 InnoDB 行锁 事务及其ACID属性 InnoDB 的行锁模式 注意 MVCC InnoDB 中的 MVCC 参考 你的鼓励也是我创作的动力 Post ...

  3. Centos7快速安装RocketMQ

    1. 为什么要用MQ 消息队列是一种"先进先出"的数据结构 其应用场景主要包含以下3个方面 应用解耦 系统的耦合性越高,容错性就越低.以电商应用为例,用户创建订单后,如果耦合调用库 ...

  4. Java实现圆柱体表面积和体积的计算

    题目描述: Java编程实现圆柱体表面积和体积的计算,要求从键盘上输入圆的半径和高,然后输出结果. 题目分析: 首先定义Circle类,然后在main方法中创建Circle类的对象c,利用对象c访问其 ...

  5. 被迫重构代码,这次我干掉了 if-else

    本文收录在个人博客:www.chengxy-nds.top,技术资源共享,一起进步 最近公司貌似融到资了!开始发了疯似的找渠道推广,现在终于明白为啥前一段大肆的招人了,原来是在下一盘大棋,对员工总的来 ...

  6. CSS中的float和margin的混合使用

    在最近的学习中,在GitHub上找了一些布局练习,我发现了我自己对布局超级不熟悉(很难受). 在以前的学习中,感觉使用CSS就记住各个属性的功能就OK了,但是呢?真的很打脸.不说了,太伤心了,进入正题 ...

  7. Windows安装多个python解释器

    Windows安装多个python解释器 ​ 在windows10系统下安装两个不同版本的的python解释器,在通常情况下编译执行文件都是没问题的,但是加载或下载包的时候pip的使用就会出现问题,无 ...

  8. Node.js 学习笔记(二)

    express是nodejs的一个轻量级框架. express的功能很简单, 功能依赖中间件. 安装:在你的项目文件价里打开cmd窗口,在里面使用npm工具(就是在cmd里输入 npm install ...

  9. salesforce零基础学习(九十八)Type浅谈

    在Salesforce的世界,凡事皆Metadata. 先通过一句经常使用的代码带入一下: Account accountItem = (Account)JSON.deserialize(accoun ...

  10. 【JMeter_10】JMeter逻辑控制器__ForEach控制器<ForEach Controller>

    ForEach控制器<ForEach Controller> 业务逻辑: ForEach控制器一般与用户自定义变量/JDBC结果变量一起使用,可以认为他就是一种遍历型循环,该节点下的脚本内 ...