Java 面向对象_继承
继承
在继承的关系中,子类就是一个父类,也就是说,子类可以被当做父类看待,例如:父类是员工,子类是程序员,那么程序员就是一个员工,代码示例:
// 员工类
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
}
}
在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式:
- 直接通过子类对象访问成员变量(优先使用自己的,没有则向上找)
- 间接通过成员方法访问成员变量(看方法属于谁,就优先用谁的,没有则往上找,找不到就报错)
在父子类的继承关系中,创建子类对象,访问成员方法的规则:
- 创建的对象是谁,就优先用谁(优先使用自己的),如果没有就向上找
无论是成员方法还是成员变量,如果没有都是向上找父类,绝不会向下找
区别子类方法中重名的三种变量
局部变量: 直接写成成员变量名
本类中的成员变量: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
}
}
注意事项:
- 在子类方法前面写上 @Override,用来检测是不是有效的覆盖重写
- 子类方法的返回值必须小于等于父类方法的返回值范围(例如:子类返回String,父类返回Object)
- 子类方法的权限必须大于等于父类方法的权限修饰符
权限修饰符:public > protected > (default) > private
继承中构造方法的访问特点
- 子类构造方法中有一个默认隐含的 "super()" 调用,所以一定是先调用的父类构造,再调用的子类构造
- 子类构造可以通过 "super" 关键字来调用父类的重载构造(当父类含有多个构造方法)
- super 的父类构造方法调用,必须是子类构造方法的第一条语句,且只能调用一次 super 构造
子类必须调用父类的构造方法,不写则是默认的 super(),写了就调用指定的 super
super 关键字的三种用法
- 在子类的成员方法中,使用 super 得到父类的成员变量
- 在子类的成员方法中,使用 super 访问父类的成员方法
- 在子类的构造方法中,使用 super 访问父类的构造方法
this 关键字的三种用法
super 关键字用来访问父类内容,而 this 关键字用来访问本类内容
- 在本类的成员方法中,使用 this 得到本类中的成员变量
- 在本类的成员方法中,使用 this 得到本类中的成员方法
- 在本类的构造方法中,使用 this 调用本类的重载构造方法(另一个构造方法)
this(…) 调用也必须是构造方法中的第一条语句,且只能使用一次
super 和 this 两种构造使用,不能同时使用
继承的三个特点图解

抽象方法和抽象类
抽象方法:就是在 void 前面加上 abstract 关键字,然后去掉大括号,直接分号结束
抽象类:抽象方法所在的类,必须是抽象类,但抽象类也可以包含非抽象方法, 在 class 前面加上 abstract 关键字
// 这是一个抽象类
public abstract class Animal{
// 这是一个抽象方法,代表吃东西,具体吃什么?不知道
public abstract void eat();
}
如何使用抽象类和抽象方法?
- 不能直接 new 抽象类,必须使用子类继承抽象父类
- 抽象类中抽象方法和非抽象方法并存
- 非抽象子类必须覆盖重写父类的所有的抽象方法
- 创建非抽象子类对象时进行使用
// 抽象父类
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 面向对象_继承的更多相关文章
- Java面向对象_继承——基本概念以及管理化妆品实例分析
一.继承的基本概念: 1.继承是面向对象三大特征之一 2.被继承的类成为父类(超类),继承父类的类成为子类(派生类) 3.继承是指一个对象直接使用另一个对象的属性和方法 4.通过继承可以实现代码重用 ...
- Java面向对象之继承(一)
目录 Java面向对象之继承 引言 继承的特点 语法格式 父子类的关系 继承要点 重写父类方法 继承中的构造器 继承中的super关键字 ... Java面向对象之继承 继承是面向对象的第二大特征,是 ...
- 【Java基础】【08面向对象_继承&方法&final】
08.01_面向对象(代码块的概述和分类)(了解)(面试的时候会问,开发不用或者很少用) A:代码块概述 在Java中,使用{}括起来的代码被称为代码块. B:代码块分类 根据其位置和声明的不同,可以 ...
- Java面向对象的继承
继承也是面向对象的又一重要特性,继承是类于类的一种关系,通俗来说狗属于动物类,那么狗这个类就继承了动物类 java中的继承是单继承的,一个类只能继承与一个父类 子类继承父类之后,子类就拥有了父类的所有 ...
- Java核心基础第5篇-Java面向对象_类和对象
Java面向对象之类和对象 一.面向对象概述 Java是完全的面向对象编程(Object Oriented Programming),简称OOP. 面向对象编程的思维方式更加符合大家的日常生活,因为我 ...
- JAVA面向对象之继承
继承: 子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法 class 子类 extends 父类 { } 继承的特性: 子类拥有父类非private的属性,方法. 子类可以拥有自己 ...
- Java:[面向对象:继承,多态]
本文内容: 继承 多态 首发时期:2018-03-23 继承: 介绍: 如果多个类中存在相同的属性和行为,可以将这些内容抽取到单独一个类中,那么多个类(子类)无需再定义这些属性和行为,只要继承那个类( ...
- Java面向对象之继承extends 入门实例
一.基础概念 (一)继承的好处: 1.继承:提高了代码的复用性. 2.让类与类之间产生了关系,给多态这个特征提供了前提. (二)继承的种类: 1.单继承:一个类只能有一个父类. 2.多继承:一个类可以 ...
- Java 面向对象之继承和重写OverWrite,重写和重载的区别,抽象类
01继承的概述 A:继承的概念 a:继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系 b:在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作 ...
随机推荐
- python 简化数据结构的初始化一
写在前面 在it行业混了差不多十年了,懊悔自己开始写博客的时间太晚.有那么一天就开始写了,也不知道自己会不会坚持写下去.不知不觉日子过到了今天,回头看看,也算是坚持写了.现在写博客的感觉好奇怪,一天天 ...
- Docs-.NET-C#-指南-语言参考-预处理器指令:#warning(C# 参考)
ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#warning(C# 参考) 1.返回顶部 1. #warning(C# 参考) 2015/07/20 #warning 允许 ...
- sql注入攻击的预防函数-如何防御sql注入
1.预编译 2.捆绑变量各种过滤 用到的函数: addslashes htmlspecialchars mysql_escape_string($string) mysql_real_escape ...
- react图片自适应组件
import * as React from 'react'; import 'animate.css/animate.css' import {AutoImg} from "./style ...
- [Java复习] 缓存Cache part1
1. 在项目中是如何使用缓存的?为什么要用?不用行不行?用了可能会有哪些不良后果? 结合项目业务,主要两个目的:高性能和高并发.缓存走内存,天然支持高并发. 不良后果: 缓存与DB双写不一致 缓存雪崩 ...
- c语言 正则表达式 IP地址
#include <stdio.h> #include <string.h> #include <regex.h> #define SUBSLEN 10 /* 匹配 ...
- 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_16-课程预览功能开发-接口测试
cms和课程的微服务重启 从数据库内找一条数据 进入到了断点 拼装课程信息 ,然后进行远程调用 抛出异常 可能是开了两个cms服务的事,负载均衡 到了另外一个服务里面 ,关掉一个 把02关掉,重启cm ...
- 怎样提交社区项目Karbor的Bug?
1.登录社区Karbor Launchpad地址: https://bugs.launchpad.net/karbor/+filebug 输出bug简介,点击Next按钮. 2.填写Bug描述,完成B ...
- Struts2中action接收中文参数为乱码解决方法
老实说,中文乱码问题是每个程序员会经常遇到的问题,而且也是一个很头疼的问题.网上很多关于解决中文乱码的帖子,看几个之后你会发现大都是一样的.但是我们照着做,却还是无法解决乱码问题.我也是看了好多帖子, ...
- 波特词干(Porter Streamming)提取算法无代码单纯理解
最近写东西提到这个算法,要看一下,结果网上都是直接根据代码解释,对于我这种菜鸟在刚开始看一个算法的时候真心不想直接看代码学.奈何都是各种语言的代码,么得办法.先走了一遍,有了大致的了解,翻译成自己的话 ...