Java基础学习笔记 - Day11 - 第四章 引用类型用法总结
Java基础学习笔记 - Day11 - 第四章 引用类型用法总结
4.1 class作为成员变量
4.2 interface作为成员变量
4.3 interface作为方法参数和返回值类型
Java基础学习笔记 - Day11 - 第四章 引用类型用法总结
系统:Win10
JDK:1.8.0_121
IDE:IntelliJ IDEA 2017.3.7

实际的开发中,引用类型的使用非常重要,也是非常普遍的。我们可以在理解基本类型的使用基础上,进一步去掌握引用类型的使用方式。基本类型可以作为成员变量、作为方法的参数、作为方法的返回值,那么当然引用类型也是可以的

4.1 class作为成员变量
在定义一个类Role(游戏角色)时,代码如下:

public class Role {
int id; // 角色id
int blood; // 生命值
String name; // 角色名称
}
1
2
3
4
5
使用int类型表示角色id和生命值,使用String类型表示姓名。此时,String本身就是引用类型,由于使用的方式类似常量,所以往往忽略了它是引用类型的存在。如果我们继续丰富这个类的定义,给Role增加武器,穿戴装备等属性,我们将如何编写呢?
定义武器类,将增加攻击能力:

public class Weapon {
private String name; // 武器名称
private int hurt; // 伤害值

public String getName() {return name;
}public void setName(String name) {this.name = name;
}public int getHurt() {return hurt;
}public void setHurt(int hurt) {this.hurt = hurt;
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
定义穿戴盔甲类,将增加防御能力,也就是提升生命值:

public class Armour {
private String name; // 装备名称
private int protect; // 防御值

public String getName() {return name;
}public void setName(String name) {this.name = name;
}public int getProtect() {return protect;
}public void setProtect(int protect) {this.protect = protect;
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
重新定义角色类:

public class Role {
private int id; // 角色id
private int blood; // 生命值
private String name; // 角色名称
// 添加武器属性
private Weapon weapon;
// 添加盔甲属性
private Armour armour;

public Role() {
}public Role(int id, int blood, String name) {this.id = id;this.blood = blood;this.name = name;
}public int getId() {return id;
}public void setId(int id) {this.id = id;
}public int getBlood() {return blood;
}public void setBlood(int blood) {this.blood = blood;
}public String getName() {return name;
}public void setName(String name) {this.name = name;
}public Weapon getWeapon() {return weapon;
}public void setWeapon(Weapon weapon) {this.weapon = weapon;
}public Armour getArmour() {return armour;
}public void setArmour(Armour armour) {this.armour = armour;
}// 攻击方法
public void attack() {System.out.println(this.name + "使用" + weapon.getName() + "造成" + weapon.getHurt() + "点伤害");
}// 防御方法
public void defense() {System.out.println(this.name + "穿上" + armour.getName() + "增加" + armour.getProtect() + "点防御");
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
测试类:

public class Test {
public static void main(String[] args) {
// 创建Role对象
Role role = new Role(1,616,“盖伦”);
// 创建Weapon对象
Weapon weapon = new Weapon();
weapon.setName(“多兰剑”);
weapon.setHurt(8);
// 创建Armour对象
Armour armour = new Armour();
armour.setName(“反伤甲”);
armour.setProtect(250);
// 设置武器和盔甲
role.setWeapon(weapon);
role.setArmour(armour);

    // 攻击role.attack();// 盔甲role.defense();
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
运行结果:
在这里插入图片描述

类作为成员变量时,对他进行赋值的操作,实际上是赋给该类一个对象

4.2 interface作为成员变量
接口是对方法的封装,对应游戏当中,可以看做是拓展游戏角色的技能。所以,如果想扩展更强大技能,我们在Role中,可以增加接口作为成员变量,来设置不同的技能
定义接口:

// 技能
public interface Skill {
public abstract void Q();
}
1
2
3
4
重新定义角色类:

public class Role {
private int id; // 角色id
private int blood; // 生命值
private String name; // 角色名称
// 添加武器属性
private Weapon weapon;
// 添加盔甲属性
private Armour armour;
// 添加技能
private Skill skill;

public Role() {
}public Role(int id, int blood, String name) {this.id = id;this.blood = blood;this.name = name;
}public int getId() {return id;
}public void setId(int id) {this.id = id;
}public int getBlood() {return blood;
}public void setBlood(int blood) {this.blood = blood;
}public String getName() {return name;
}public void setName(String name) {this.name = name;
}public Weapon getWeapon() {return weapon;
}public void setWeapon(Weapon weapon) {this.weapon = weapon;
}public Armour getArmour() {return armour;
}public void setArmour(Armour armour) {this.armour = armour;
}public Skill getSkill() {return skill;
}public void setSkill(Skill skill) {this.skill = skill;
}// 攻击方法
public void attack() {System.out.println(this.name + "使用" + weapon.getName() + "造成" + weapon.getHurt() + "点伤害");
}// 防御方法
public void defense() {System.out.println(this.name + "穿上" + armour.getName() + "增加" + armour.getProtect() + "点防御");
}// Q技能攻击
public void useQ() {System.out.println("使用Q技能");skill.Q();System.out.println("攻击结束");
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
定义测试类:

public class Test {
public static void main(String[] args) {
// 创建Role对象
Role role = new Role(1,616,“盖伦”);
// 创建技能
Skill skill = new Skill() {
@Override
public void Q() {
System.out.println(" 盖伦的移动速度获得爆发性提升," +
“\n 同时移除身上的所有减速效果。” +
“\n 他的下次攻击将打击敌人的要害部位,” +
“\n 造成额外伤害并将目标沉默。”);
}
};
// 设置技能
role.setSkill(skill);
// 使用技能
role.useQ();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
运行结果:
在这里插入图片描述

我们使用一个接口,作为成员变量,以便随时更换技能,这样的设计更加灵活,增加了程序的拓展性。
接口作为成员变量时,对他进行赋值的操作,实际上,是赋给该接口的一个子类对象

4.3 interface作为方法参数和返回值类型
当接口作为方法的参数时,需要传递什么呢?当接口作为方法的返回值类型时,需要返回什么呢?其实都是他的子类对象。ArrayList类我们并不陌生,查看API我们可以发现,实际上,他是java.util.List接口的实现类。所以,当我们看见List接口作为参数或者返回值类型时,当然可以将ArrayList的对象进行传递或返回
观察如下方法:获取某集合中所有的偶数

public class Test {
public static void main(String[] args) {
// 创建ArrayList集合,并添加数字
ArrayList srcList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
srcList.add(i);
}
/*
获取偶数集合
因为getEvenNum方法的参数是List,而ArrayList是List的子类
所以srcList可以传递
*/
List list = getEvenNum(srcList);
System.out.println(list);

}public static List<Integer> getEvenNum(List<Integer> list) {// 创建保存偶数的集合ArrayList<Integer> evenList = new ArrayList<>();// 遍历集合list,判断元素为偶数时,就添加到evenList中for (int i = 0; i < list.size(); i++) {Integer index = list.get(i);if (index % 2 == 0) {evenList.add(index);}}/*返回偶数集合因为getEvenNum方法的返回值类型时List,而ArrayList是List的子类所以evenList可以返回*/return evenList;
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
运行结果:
在这里插入图片描述

接口作为参数时,传递它的子类对象
接口作为返回值类型时,返回它的子类对象

【Java基础学习笔记】- Day11 - 第四章 引用类型用法总结相关推荐

  1. 尚学堂JAVA基础学习笔记_2/2

    尚学堂JAVA基础学习笔记_2/2 文章目录 尚学堂JAVA基础学习笔记_2/2 写在前面 第10章 IO技术 1. IO入门 2. IO的API 3. 装饰流 4. IO实战 5. CommonsI ...

  2. C++ Primer 学习笔记(第四章:表达式)

    2019独角兽企业重金招聘Python工程师标准>>> ##C++ Primer 学习笔记(第四章:表达式) [TOC] ###4.1 基础 左值和右值: 当一个对象被用作右值的时候 ...

  3. 机器学习理论《统计学习方法》学习笔记:第四章 朴素贝叶斯法

    机器学习理论<统计学习方法>学习笔记:第四章 朴素贝叶斯法 4 朴素贝叶斯法 4.1 朴素贝叶斯法的学习与分类 4.1.1 基本方法 4.1.2 后验概率最大化的含义 4.2 朴素贝叶斯法 ...

  4. Java中大数据数组,Java基础学习笔记之数组详解

    摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...

  5. javascript学习笔记(第四章图片库--初步了解)

    javascript学习笔记(第四章图片库–初步了解) 通过前三章的学习我们已经对这个新的语言有了一个了解,js的语法基本和C语言一致,我们可以通过调用一些document对象中的函数来对实现一些很简 ...

  6. Python入门:对Excel数据处理的学习笔记【第四章】字符串类型处理技术

    注:该学习笔记是根据曾志贤老师编写的<从Excel到Python,用Python轻松处理Excel数据>所学习整理的笔记. 第四章 字符串类型处理技术 目录 第四章 字符串类型处理技术 一 ...

  7. college java (java基础黑皮书)一到四章笔记总结

    college java(1-4) college java (java基础黑皮书) 第一章 java入门 java的地位 java的特点与组成: 简单的java程序 1.系统环境的设置 2源文件的编 ...

  8. Java基础学习笔记(二)_Java核心技术(进阶)

    本篇文章的学习资源来自Java学习视频教程:Java核心技术(进阶)_华东师范大学_中国大学MOOC(慕课) 本篇文章的学习笔记即是对Java核心技术课程的总结,也是对自己学习的总结 文章目录 Jav ...

  9. Java基础学习笔记(三)_Java核心技术(高阶)

    本篇文章的学习资源来自Java学习视频教程:Java核心技术(高阶)_华东师范大学_中国大学MOOC(慕课) 本篇文章的学习笔记即是对Java核心技术课程的总结,也是对自己学习的总结 文章目录 Jav ...

最新文章

  1. 数据库之存储引擎,数据类型-30
  2. 《面向模式的软件体系结构1--模式系统》读书笔记(5)--- 管理
  3. OpenGL 对象的概述
  4. UOJ - #117. 欧拉回路(模板)
  5. 全局变量的异步I/O问题
  6. 实现拓扑图_20源码实现【自动寻路】 —【拓扑图】—网游城市互传最优路径算....
  7. mysql索引类型 normal, unique, full text
  8. ACM模板——拓扑排序
  9. jquery.treeview.js php mysql,jquery.treeview应用
  10. Adobe 再次发布带外更新,修复影响10款产品的漏洞
  11. FastFel解析一个公式的步骤
  12. html div 时间,HTML DIV
  13. 投大数据简历的原则以及在哪些地方投简历最有效?
  14. 东芝 rc100 linux,东芝RC100固态硬盘固件更新提示
  15. html——form表单提交方法submit和button
  16. Centos7安装uwsgi出现关于SSL错误的问题
  17. net中winform教程 浏览器控件,还是微软的WebView2最好用
  18. android内存扩展格式,一文看懂:如何为你的安卓手机选择合适的存储卡
  19. 基于Keras的LSTM多变量时间序列预测(北京PM2.5数据集pollution.csv)
  20. 2014校园招聘总结

热门文章

  1. anaconda安装tensorflow后,matplotlib无法调用的解决方法
  2. 优达学城深度学习之七——TensorFlow卷积神经网络
  3. 【数据库基础知识】oracle client安装及配置
  4. PHP PDO连接PostgreSQL报错 SCRAM authentication requires libpq version 10 or above in解决
  5. python 数据结构 树 dev get items_python数据结构之树(二叉树的遍历)
  6. java 货架高度摆放最优算法_商铺内部空间摆放竟暗藏玄机
  7. python怎么写出正弦图_如何使用python在图像上生成随机正弦条纹?
  8. python自动回复机器人手机版_GitHub - HZQHZA/wxpy: Python 写 微信聊天 根据 自动回复 接入机器人 等等.......
  9. html5 火焰效果图,css3火焰文字特效
  10. java 字符串池 原理_《Java虚拟机原理图解》1.2.2、Class文件中的常量池详解(上)...