继承

在继承的关系中,子类就是一个父类,也就是说,子类可以被当做父类看待,例如:父类是员工,子类是程序员,那么程序员就是一个员工,代码示例:

// 员工类
public class Employee{
String name;
int age;
} // 程序员类(继承员工类)
public class Programer extends Employee{
} // 主方法
public class Extends {
public static void main(String[] args) {
Programer coder = new Programer();
coder.name = "johny";
coder.age = 20;
System.out.println(coder.name + " " + coder.age); // johny 20
}
}

在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式:

  1. 直接通过子类对象访问成员变量(优先使用自己的,没有则向上找)
  2. 间接通过成员方法访问成员变量(看方法属于谁,就优先用谁的,没有则往上找,找不到就报错)

在父子类的继承关系中,创建子类对象,访问成员方法的规则:

  1. 创建的对象是谁,就优先用谁(优先使用自己的),如果没有就向上找

无论是成员方法还是成员变量,如果没有都是向上找父类,绝不会向下找

区别子类方法中重名的三种变量

局部变量:              直接写成成员变量名

本类中的成员变量:this.成员变量名

父类中的成员变量:super.成员变量名

继承中方法的覆盖

覆盖与方法的重载不同,同样是方法名相同,但覆盖指接收的参数也相同

// 父类
public class Phone {
public void call(){
System.out.println("call");
} public void send(){
System.out.println("send");
}
} // 子类
public class NewPhone extends Phone{
// 方法权限必须大于等于父类
public void call(){
// 调用父类方法
super.call();
// 添加自己的逻辑
System.out.println("show picture");
}
} public class DemoCover {
public static void main(String[] args) {
NewPhone newPhone = new NewPhone();
newPhone.call(); // call \n show picture
}
}

注意事项:

  1. 在子类方法前面写上 @Override,用来检测是不是有效的覆盖重写
  2. 子类方法的返回值必须小于等于父类方法的返回值范围(例如:子类返回String,父类返回Object)
  3. 子类方法的权限必须大于等于父类方法的权限修饰符

  权限修饰符:public > protected > (default) > private

继承中构造方法的访问特点

  1. 子类构造方法中有一个默认隐含的 "super()" 调用,所以一定是先调用的父类构造,再调用的子类构造
  2. 子类构造可以通过 "super" 关键字来调用父类的重载构造(当父类含有多个构造方法)
  3. super 的父类构造方法调用,必须是子类构造方法的第一条语句,且只能调用一次 super 构造

  子类必须调用父类的构造方法,不写则是默认的 super(),写了就调用指定的 super

super 关键字的三种用法

  1. 在子类的成员方法中,使用 super 得到父类的成员变量
  2. 在子类的成员方法中,使用 super 访问父类的成员方法
  3. 在子类的构造方法中,使用 super 访问父类的构造方法

this 关键字的三种用法

super 关键字用来访问父类内容,而 this 关键字用来访问本类内容

  1. 在本类的成员方法中,使用 this 得到本类中的成员变量
  2. 在本类的成员方法中,使用 this 得到本类中的成员方法
  3. 在本类的构造方法中,使用 this 调用本类的重载构造方法(另一个构造方法)

this(…) 调用也必须是构造方法中的第一条语句,且只能使用一次

super 和 this 两种构造使用,不能同时使用

继承的三个特点图解

抽象方法和抽象类

抽象方法:就是在 void 前面加上 abstract 关键字,然后去掉大括号,直接分号结束

抽象类:抽象方法所在的类,必须是抽象类,但抽象类也可以包含非抽象方法, 在 class 前面加上 abstract 关键字

// 这是一个抽象类
public abstract class Animal{
// 这是一个抽象方法,代表吃东西,具体吃什么?不知道
public abstract void eat();
}

如何使用抽象类和抽象方法?

  1. 不能直接 new 抽象类,必须使用子类继承抽象父类
  2. 抽象类中抽象方法和非抽象方法并存
  3. 非抽象子类必须覆盖重写父类的所有的抽象方法
  4. 创建非抽象子类对象时进行使用
// 抽象父类
public abstract class Animal{
public Animal(){
System.out.println("抽象父类构造方法执行");
}
// 抽象方法
public abstract void eat();
public abstract void sleep();
} // 抽象子类
public abstract class Dog extends Animal{
@Override
public void eat(){
System.out.println("dog eat meat");
}
} // 间接子类
public class JinMao extends Dog {
@Override
public void sleep(){
System.out.println("JinMao in his sleeping");
}
}
public class HaShiQi extends Dog {
@Override
public void sleep(){
System.out.println("HaShiQi in his sleeping");
}
} public class DemoAbstract{
public static void main(String[] args){
JinMao jinMao = new JinMao();
jinMao.eat();
jinMao.sleep(); HaShiQi haShiQi = new HaShiQi();
haShiQi.eat();
haShiQi.sleep();
}
} // 执行结果
抽象父类构造方法执行
dog eat meat
JinMao in his sleeping
抽象父类构造方法执行
dog eat meat
HaShiQi in his sleeping

发红包的案例

  User 基类

 public class User {
private String name;
private int money; // 无参构造
public User(){
}
// 全参构造
public User(String name, int money){
this.name = name;
this.money = money;
} public void setName(String name) {
this.name = name;
}
public void setMoney(int money) {
this.money = money;
}
public String getName() {
return name;
}
public int getMoney() {
return money;
} // show 方法
public void show(){
String str = String.format("my name is %s, i have %d yuan", this.name, this.money);
System.out.println(str);
}
}

  群主类

 import java.util.ArrayList;
import java.util.Scanner; public class Manager extends User {
public Manager(){};
public Manager(String name, int money){
super(name, money);
} // 发红包
public ArrayList<Integer> send(){
while (true){
// 确定发多少钱,发多少个?
Scanner scanner = new Scanner(System.in);
int money = scanner.nextInt();
int count = scanner.nextInt(); // 发出的红包不得大于群主的总金额
if (money > super.getMoney()){
String str = String.format("your balance is %d ! please re-select");
System.out.println(str);
continue;
} // 确定每个红包有多少钱?
int avg = money / count;
int remainder = money % count; // 余数,就是零头 // 塞钱进红包
ArrayList<Integer> set = new ArrayList<>();
for (int i=0; i<count-1; i++){
set.add(avg);
}
// 把零头放到最后一个红包
set.add(avg + remainder); // 减去余额
super.setMoney(super.getMoney() - money);
return set;
}
}
}

  成员类

 import java.util.ArrayList;
import java.util.Random; public class Member extends User{
public Member(){};
public Member(String name, int money){
super(name, money);
}; // 收红包
public void receive(ArrayList<Integer> arrayList){
// 随机收取一个红包
Random random = new Random();
int index = random.nextInt(arrayList.size());
int cash = arrayList.remove(index);
System.out.println(String.format("i got was %d yuan", cash));
// 修改余额
super.setMoney(super.getMoney() + cash);
}
}

主程序

 import java.util.ArrayList;

 public class MainStart {
public static void main(String[] args) {
// 拉人建群
Manager manager = new Manager("manager", 5000);
Member johny = new Member("johny", 10);
Member anson = new Member("anson", 0);
Member tom = new Member("tom", 0); // 发红包
ArrayList<Integer> set = manager.send();
// 收红包
johny.receive(set);
anson.receive(set);
tom.receive(set); // 活动结束之后都有多少钱?
manager.show();
johny.show();
anson.show();
tom.show();
}
}

ending ~

Java 面向对象_继承的更多相关文章

  1. Java面向对象_继承——基本概念以及管理化妆品实例分析

    一.继承的基本概念: 1.继承是面向对象三大特征之一 2.被继承的类成为父类(超类),继承父类的类成为子类(派生类) 3.继承是指一个对象直接使用另一个对象的属性和方法 4.通过继承可以实现代码重用 ...

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

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

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

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

  4. Java面向对象的继承

    继承也是面向对象的又一重要特性,继承是类于类的一种关系,通俗来说狗属于动物类,那么狗这个类就继承了动物类 java中的继承是单继承的,一个类只能继承与一个父类 子类继承父类之后,子类就拥有了父类的所有 ...

  5. Java核心基础第5篇-Java面向对象_类和对象

    Java面向对象之类和对象 一.面向对象概述 Java是完全的面向对象编程(Object Oriented Programming),简称OOP. 面向对象编程的思维方式更加符合大家的日常生活,因为我 ...

  6. JAVA面向对象之继承

    继承: 子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法 class 子类 extends 父类 { } 继承的特性: 子类拥有父类非private的属性,方法. 子类可以拥有自己 ...

  7. Java:[面向对象:继承,多态]

    本文内容: 继承 多态 首发时期:2018-03-23 继承: 介绍: 如果多个类中存在相同的属性和行为,可以将这些内容抽取到单独一个类中,那么多个类(子类)无需再定义这些属性和行为,只要继承那个类( ...

  8. Java面向对象之继承extends 入门实例

    一.基础概念 (一)继承的好处: 1.继承:提高了代码的复用性. 2.让类与类之间产生了关系,给多态这个特征提供了前提. (二)继承的种类: 1.单继承:一个类只能有一个父类. 2.多继承:一个类可以 ...

  9. Java 面向对象之继承和重写OverWrite,重写和重载的区别,抽象类

    01继承的概述 A:继承的概念 a:继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系 b:在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作 ...

随机推荐

  1. golang 不足

    滴滴出行技术总监:关于技术选型的那些事儿 原创: 杜欢 InfoQ 2017-02-26   https://mp.weixin.qq.com/s/6EtLzMhdtQijRA7Xrn_pTg     ...

  2. mac上运行shell脚本遇到回车字符错误

    今天运行一段其他人给的shell脚本,遇到如下问题,这个脚本的内容如下: dname=\((dirname "\)PWD") mkdir ${dname}"/rom_pu ...

  3. NetHogs监控Linux的每个进程流量

    在日常运维环境中,我们肯定会遇到以下这种需求: 1.网络流量异常,不知道是哪个程序的流量爆涨? 2.日常需要监控网络实时的流量进去数据 面试装逼系列|这篇文章,让运维监控不再成为你的短板! 学会这 1 ...

  4. log4j:ERROR setFile(null,true) call failed.错误解决

    首先说明,我是用hive执行bin/hiveserver2时出现的这个错误.如下图所示,红框中的内容也清晰的告诉我们出错的原因和文件路径. 之后,我查看了一下该路径.发现我用的是beifeng的用户, ...

  5. 算法习题---3.11换抵挡装置(UVa1588)

    一:题目 给你连个长度分别为n1,n2且每列高度只为1或2的长条,然后将他们拼在一起,高度不能超过3,问他们拼在一起的最短长度 二:实现思路 1.获取主动轮和从动轮的数据. 2.主动轮不动,从动轮从左 ...

  6. java生成二维码打印到浏览器

    java生成二维码打印到浏览器   解决方法: pom.xml的依赖两个jar包: <!-- https://mvnrepository.com/artifact/com.google.zxin ...

  7. python 中的一些基础算法:递归/冒泡/选择/插入

    递归算法 如果一个函数包含了对自己的调用,那么这个函数就是递归的. 比如我们计算下1-7乘法的计算: def func(n): if n ==1 : return 1 return n*func(n- ...

  8. PPT做交互效果

    1 做交互效果(点击一个按钮,弹出某个框或者跳转到某个页面)其实就是若干个PPT页面,利用给按钮增加超链接或者动作 达到点击一个按钮 跳转到另外一个PPT的效果. 2 选择一个形状组件(或者其他组件) ...

  9. python配置yum源

    import subprocess import sys import os def main(): try: subprocess.call(["yum install wget -y;c ...

  10. npm镜像指定用淘宝镜像去下载

    使用npm下载,蜗牛,使用cnpm又觉得那啥,所以.把cnpm也就是淘宝镜像绑定成npm下载的代理,这样使用npm的时候其实是用淘宝镜像去下载,这感觉,good! 1. npm config set ...