Java面向对象笔记 • 【第3章 继承与多态】
3.1.1 自定义包
如果在程序中没有声明包,类将被存放在default的包中,该方式不被提倡。
语法:
package 包名
包命名规范:
包的命名规范应当体现出项目资源良好的划分
自定义标签类所在包命名规范:公司名称.开发组名称.项目名称
例如:com.java.explorer
3.1.2 包的导入
语法:
import 包名.类名
示例:
·
import java.util.*; //导入java.util包中所有的类
import java.util.ArrayList; //导入java.util包中的ArrayList类
示例:在Hero类中使用Tree类,Hero类与Tree类不在同一个包中
package com.java.oriented.dota.scene;
public class Tree {public void clear(){ //具体业务逻辑}
}package com.java.oriented.dota.figure;
//由于Tree类与Hero类不在同一个包中,所以需要使用import关键字导入包
import com.java.oriented.dota.scene.Tree;
public class Hero {public void eatTree(Tree tree){//调用树对象的clear()方法,吃掉的树在地图中消失tree.clear();}
}
3.1.3 包的访问权限
一个包中具有缺省访问权限的成员只能在同一个包中被引用。
如果一个包中的成员的访问权限为 public,那么这些成员才能被其他包中的类所引用。
package com.java.oriented.dota.scene;
public class Tree {void clear(){ //去掉public //具体业务逻辑}
}package com.java.oriented.dota.figure;
//由于Tree类与Hero类不在同一个包中,所以需要使用import关键字导入包
import com.java.oriented.dota.scene.Tree;
public class Hero {public void eatTree(Tree tree){//调用树对象的clear()方法,吃掉的树在地图中消失tree.clear();}
}
3.2 继承
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例 域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
3.2.1 继承概述
- 继承是面向对象程序设计的一个重要特征,它是通过继承原有类派生出子类,进而构造出更为复杂的子类。
- 子类既有新定义的行为特征,又继承了原有类的行为特征。
- 父类与子类存在着包含与被包含的关系,是一种is-a的关系。
- 在Java中继承可以在现有类的基础上进行功能的扩展,这样能够更加快速地开发出新类,使新类不仅可以复用当前类的特征和行为,而且还可以定义自己的特征和行为。
Java继承语法:
[修饰符] class 子类名 extends 父类名{//类定义部分
}
父类也称作基类或超类
3.2.2 继承的实现
示例:定义父类武器,以及子类圣剑和长矛
public class Weapon { //父类 武器String name;//武器名int attackValue;//攻击值//构造方法public Weapon(String name, int attackValue) {System.out.println("--执行武器父类Weapon的构造方法--");this.name = name;this.attackValue = attackValue;}//攻击方法public void attack(){System.out.println("武器名:"+name+"\t"+"攻击值:"+attackValue);}
}
public class Sword extends Weapon{ //圣剑 子类public Sword(String name, int attackValue) {super(name, attackValue);}
}
public class Spear extends Weapon{ //圣剑 长矛//构造方法public Spear(String name,int attackValue) {super(name, attackValue);}
}
public class ExtendsTest { // 测试类public static void main(String[] args){Sword word = new Sword("圣剑",300);word.attack();Spear spear = new Spear("长矛",250);spear.attack();}
}
3.3 重载和重写
3.3.1 重载
方法重载的规则:
方法名称必须相同。
参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)。
方法的返回类型可以相同也可以不相同。
仅仅返回类型不同不足以成为方法重载。
示例:在Book类中定义3个互为重载的方法,它们分别计算不同情形下图书的价格。
public class Book {//定义3个重载方法public float getPrice(){ return 100;}public float getPrice(int page){return (float)(page*0.1);}public float getPrice(int page ,float discount){return (float) (page*discount);}public static void main(String[] args) {Book book=new Book();//创建Book对象System.out.println("default图书价格:"+book.getPrice());System.out.println("根据页数计算图书价格:"+book.getPrice(268)); System.out.println("根据页数和折扣计算图书格:"+book.getPrice(360,0.2f));}
}
3.3.2 重写
在子类中可以根据需要对从父类中继承来的方法进行重写。
重写的方法和被重写的方法必须具有相同方法名称、参数列表和返回类型。重写方法不能使用比被重写的方法更严格的访问权限。
重写方法不能声明抛出比被重写方法范围更大的异常类型。
重写是外壳不变,核心变。也就是说方法名不变,参数不变,具体实现可以改变。一般是在父类中声明方法,在子类中重写。重载是方法名不变,但参数一定要变。而且重载的方法一般都写在一个类中。
示例:在子类鸵鸟中重写父类飞鸟的飞翔方法
public class Bird { // 父类 飞鸟//Bird类的fly()方法public void fly(){System.out.println("我在蓝天白云间自由的飞翔...");}
}
public class Ostrich extends Bird{// 子类 鸵鸟public void fly(){ //重写父类方法System.out.println("我只能在陆地上拍拍翅膀奔跑...");}public void prey(){ //捕食方法fly();System.out.println("执行捕食方法");}public static void main(String[] args) {Ostrich ostrich=new Ostrich();ostrich.prey(); //调用ostrich对象的prey()}
}
3.3.3 重写覆盖问题
示例:子类鸵鸟捕食时将使用父类飞鸟的飞翔功能。
public class Ostrich extends Bird{public void fly(){System.out.println("我只能在陆地上拍拍翅膀奔跑...");}//捕食方法public void prey(){//在prey()方法中使用super关键调用父类的fly()方法super.fly();System.out.println("执行捕食方法");}public static void main(String[] args) {//创建Ostrich对象Ostrich ostrich=new Ostrich();ostrich.prey();//调用ostrich对象的fly()}
}
3.4 多态
3.4.1 多态应用
示例:指向子类的父类引用在执行重写方法时所体现的多态性
//父类 人物
public class Figure {protected String name;public void attack(){//此处不进行具体的攻击操作,不同职业的英雄攻击方式不同}public void run(){ System.out.println("在奔跑");}
}//子类 战士
public class Warrior extends Figure{//重写父类的attack()方法public void attack(){System.out.println(this.name+"正在物理攻击......");}
}
//子类 法师
public class Master extends Figure {//重写父类的attack()方法public void attack(){ System.out.println(this.name+"正在魔法攻击......");} public static void main(String[] args) {Figure master=new Master();master.name="恶魔巫师";Figure warrior=new Warrior();warrior.name="撼地神牛";master.attack();warrior.attack();}
}
总结:
1.声明包的语句是“package 包名”,该语句必须放在第一行,导入类的语句是 “import 包名.类名”。
2.继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例 域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
3.子类继承父类的语法是:“[修饰符] class 子类名 extends 父类名”。
4.重载就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。
5.重写就是在子类方法重写父类方法,重写的方法和被重写的方法必须具有相同方法名称、参数
列表和返回类型。
6.多态是指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
7.在编译时,可以通过父类的引用指向子类对象,而在运行时,则通过父类所指向的子类对象,调用子类中重写父类的方法。
Java面向对象笔记 • 【第3章 继承与多态】相关推荐
- 【JAVA SE】第七章 继承和多态
第七章 继承和多态 文章目录 第七章 继承和多态 一.继承 1.概念 2.继承的特性 2.继承关键字 3.构造器 4.子类重写父类方法的规则 二.多态 1.概念 2.多态的优点 3.多态存在的三个必要 ...
- Java面向对象——基础2 封装、继承、多态
目录 Java基础知识图解 一.方法的重载 1.1重载是什么? 1.2重载的例子 1.3判断重载练习 1.4重载小结 1.5可变个数的形参 说明: 二.方法参数的值传递机制 2.1基本数据类型的参数 ...
- Java面向对象三大特性(封装、继承、多态)
文章目录 前言 一.封装 1. 封装的概念 2. private实现封装 3. getter和setter方法 4.封装的好处 二.继承 1. 继承的概念 2. extends实现继承 3. supe ...
- java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super
目录点击跳转 包 包的命名方法 导入包中的类 系统包的介绍 **注意事项** 继承 基础知识 构造方法 **基础语法** `protected`修饰符 组合 `this`和`super`关键字 `th ...
- 《Java 核心技术 卷1》 笔记 第五章 继承(3)
5.1.6 抽象类 有时候我们无法说出具体是什么,只能用于标识一个类型,比如图形,就可作为抽象类.虽然无法具体描述图形,但是图形通常都有面积.周长.这种时候就可用抽象类标识. 抽象类使用abstrac ...
- Java 学习笔记:第一章 Java入门
Java 学习笔记:第一章 Java入门 1.1 计算机语言发展史以及未来方向 1.2 常见编程语言介绍 C语言 C++ 语言 Java语言 PHP 语言 Object-C和Swift 语言 Java ...
- Java语言程序设计(基础篇) 第十一章 继承和多态
第十一章 继承和多态 11.1 引言 面向对象的编程允许你从已经存在的类中定义新的类,这称为继承. 11.2 父类和子类 1.继承使得你可以定义一个通用的类(既父类),之后扩充该类为一个更加特定的类( ...
- java 继承与多态 习题_JAVA基础 第4章继承与多态_练习题_200910
Java基础第4章练习题大外软件学院 第4章继承与多态 一.选择题 1. 编译和运行以下两文件结果是( D ). //文件P1.java package MyPackage; class P1{ vo ...
- JAVA面向对象程序设计-FeiGe快递系统-继承II
JAVA面向对象程序设计-FeiGe快递系统-继承 package com.caishui.model;public class TestSon {public static void main(St ...
- Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态
Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...
最新文章
- 写代码:使用while循环实现输出1,2,3,4,5,7,8,9,11,12
- Windows安装Python3
- faster-rcnn移植过程中出现错误
- 用GCD来处理大量for loop任务
- 访问tomcat manager应用遇到的403 access denied错误
- Linux工作笔记-根据PID查询进程是否存在(进程管理相关程序中常用)
- 数学rect什么意思_数学怎么审题?孩子必须知道的几个点!
- oracle biee 11g客户端连接OCI 10g/11g数据源时报错
- PHP总结:几个陷阱
- 我的2018春招实习+秋招总结【前端开发】
- 第48次《中国互联网络发展状况统计报告》发布--报告解读
- 去除马赛克,有办法了 附运行教程
- 泛微OA系统排名?泛微OA办公系统怎么选?什么是用户口碑最好的泛微OA系统?
- 程序猿段子_程序员段子
- AIML标签中srai不起作用的原因
- 【Java集合】集合是什么?为什么要用集合?
- Winsock网络编程头文件及库文件的设置
- .NET CoreRT AOT原生程序编译使用的一些小建议
- 浙江大学计算机学霸作息,浙大学霸学子作息表:精确到分钟!最怕优秀的人比我们还努力!...
- TCP的TIME WAIT快速回收与重用
热门文章
- Hetero-Center Loss for Cross-Modality Person Re-Identification阅读笔记
- html中如何加视频背景音乐,怎么用html设置背景音乐
- 有关Best-effort理解的相关资料汇总
- android 蜂巢平台,Android 3.2来临 蜂巢系统平板详解析
- ASP.NET支持多语言
- SQL Server 2008系统的系统数据库
- php重构求圆柱圆锥的体积,将一个体积是120立方厘米的圆柱形木料削成一个最大的圆锥,削去的比剩下的多______立方厘米....
- 2021-06-29 MySql(未完待续)
- windows优化大师怎么用_手机内存不够?最好用的存储空间清理工具分享给你
- Arduino提高篇20—S50卡数据读写