学习内容:三种引用类型用法

  • 一、类作为成员变量
  • 二、接口作为成员变量
  • 三、接口作为方法参数和返回值类型

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

一、类作为成员变量

首先我们创建一个英雄Hero对象,使用 String 类型表示姓名、int类型表示年龄。此时, String 本身就是引用类型,由于使用的方式类似常量,所以往往忽略了它是引用类型的存在。现在我们想要继续丰富这个类的定义,给Hero增加装备Weapon。代码示例如下:

public class Hero {private String name; // 英雄名字private int age; // 英雄的年龄private Weapon weapon; // 武器public Hero() {}public void attack() {System.out.println("年龄为" + age + "的" + name + "用" + weapon.getCode() + "攻击敌方");}public Hero(String name, int age, Weapon weapon) {this.name = name;this.age = age;this.weapon = weapon;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Weapon getWeapon() {return weapon;}public void setWeapon(Weapon weapon) {this.weapon = weapon;}
}

我们再创建一个武器Weapon类,定义武器的名字:

public class Weapon {private String code; // 武器的代号public Weapon() {}public Weapon(String code) {this.code = code;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}
}

最后编写一个测试类,给英雄设置年龄姓名属性,并且给它武器。再在Hero类中添加一个攻击的方法Attack():

public class DemoMain {public static void main(String[] args) {// 创建一个英雄角色Hero hero = new Hero();// 为英雄起一个名字,并且设置年龄hero.setName("男枪");hero.setAge(20);// 创建一个武器对象Weapon weapon = new Weapon("幕刃");// 为英雄配备武器hero.setWeapon(weapon);hero.attack(); // 年龄为20的男枪用幕刃攻击敌方}}

测试类执行的结果如图:

二、接口作为成员变量

接口是对方法的封装,对应游戏当中,可以看作是扩展游戏角色的技能。所以,如果想扩展更强大技能,我们在Hero中,可以增加接口作为成员变量,来设置不同的技能。下面进行代码演示:

还是首先创建一个Hero类,其中除了英雄的名字外,再定义一个接口Skill作为成员变量:

public class Hero {private String name;private Skill skill;public Hero() {}public void attack() {System.out.println("我叫" + name + ",开始释放技能:");skill.use(); // 调用接口中的抽象方法System.out.println("释放技能完成");}public Hero(String name, Skill skill) {this.name = name;this.skill = skill;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Skill getSkill() {return skill;}public void setSkill(Skill skill) {this.skill = skill;}
}

然后我们来创建这个接口,定义一个释放技能的方法:

public interface Skill {void use();}

最后我们来定义一个测试类,在Hero类中定义一个attack方法,该方法调用接口中释放技能的方法use(),在测试类中使用匿名内部类和匿名对象来设置英雄技能:

public class DemoGame {public static void main(String[] args) {Hero hero = new Hero();hero.setName("艾希"); // 设置英雄的名称// 设置英雄技能
//        hero.setSkill(new SkillImpl()); // 使用单独定义的实现类// 还可以改成使用匿名内部类Skill skill = new Skill() {@Overridepublic void use() {System.out.println("眩晕");}};hero.setSkill(skill);// 进一步简化,同时使用匿名内部类和匿名对象hero.setSkill(new Skill() { // 匿名内部类和匿名对象@Overridepublic void use() {System.out.println("减速");}});hero.attack();}}

三、接口作为方法参数和返回值类型

当接口作为方法的参数时,需要传递什么呢?当接口作为方法的返回值类型时,需要返回什么呢?对,其实都是它的子类对象。 ArrayList 类我们并不陌生,查看API我们发现,实际上,它是 java.util.List 接口的实现类。所以,当我们看见 List 接口作为参数或者返回值类型时,当然可以将 ArrayList 的对象进行传递或返回。

下面用一段代码来简单演示:

import java.util.ArrayList;
import java.util.List;/*
java.util.list正是ArrayList所实现的接口。*/
public class DemoInterface {public static void main(String[] args) {// 左边是接口名称,右边是实现类名称,这就是多态写法List<String> list = new ArrayList<>();List<String> result = addNames(list);for (int i = 0; i < result.size(); i++) {System.out.println(result.get(i));}}public static List<String> addNames(List<String> list) {list.add("nxy");list.add("jhn");list.add("wky");list.add("dzy");return list;}}

重学Java(035)——Java基础知识(类作为成员变量、接口作为成员变量、接口作为方法参数和返回值类型)相关推荐

  1. 测试私有方法_Java基础之抽象类、接口作为方法参数和返回值

    不同修饰符使用细节 常用来修饰类.方法.变量的修饰符 public 权限修饰符,公共访问, 类,方法,成员变量 protected 权限修饰符,受保护访问, 方法,成员变量 默认什么也不写 也是一种权 ...

  2. 使用反射获得jar包中的类、方法、参数、返回值类型,然后动态加载jar包运行方法

    其实我的需求是在系统中 测试用户导入的jar包,所有网上找了很多解决方案,踩过很多坑,再加上以前搞c++的,对java不是很熟, 这里特意记录下,算是基本满足需求了 使用反射获得jar包中的类.方法. ...

  3. JAVA学习笔记第八天——接口作为方法参数和返回值、多态、内部类

    一.回顾: 权限修饰符: public -> protected -> (default) ->private 重写: 1.方法名和参数列表一致 2.子类中重写的方法, 返回值类型[ ...

  4. Java基础二十二:函数式接口介绍,函数式接口作为方法参数、返回值,Supplier接口、Consumer接口、Predicate接口、Function接口基本介绍及其案例小练习

    函数式接口 1. 函数式接口概念及基本使用 1.函数式接口:有且仅有一个抽象方法的接口,函数式接口就是Lambda表达式使用的前提 2. Java中的函数式编程体现的就是Lambda表达式,所以函数式 ...

  5. java学习笔记-基础知识-2023.3.29

    学习网站:https://www.sxt.cn/Java_jQuery_in_action/History_Direction.html 刷题网站 牛客网专题-spring java sql 第一章 ...

  6. 【Java】【基础知识】【Java的基本使用】

    [Java][基础知识][Java的基本使用] 基于jdk8 仅个人理解,或有疏漏 基于 java疯狂讲义 第三版和第四版 java核心技术卷一 第十版和第十一版 廖雪峰java课程 一.基本数据与结 ...

  7. Java原理性基础知识整理[详细]

    文章目录 Java程序编译过程 编译型和解析型语言 命名规范 编程风格 大括号 非C风格的数组声明 阿里巴巴Java开发手册 On Java 8 Google Java 编程风格指南 基本数据类型 整 ...

  8. 重学JavaSE 第11章 : 常用类API、String、日期API、比较器、BigDecimal、System等

    文章目录 一.字符串相关的类 1.1.String类的概述 1.2.理解String的不可变性 1.3.String不同实例化方式的对比 1.4.String不同拼接操作的对比 1.4.1.Strin ...

  9. java输出结果校验_2. Bean Validation声明式校验方法的参数、返回值

    你必须非常努力,才能干起来毫不费力.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习. ✍前言 ...

最新文章

  1. c#控制IE浏览器自动点击等事件WebBrowser,mshtml.IHTMLDocument2
  2. 如何在一个程序集中序列化在另一个中反序列化
  3. 【控制】《多智能体系统的动力学分析与设计》徐光辉老师-第3章-采样环境下带有领航者的二阶多智能体系统的一致性
  4. 约束流–没有Drools规则语言的现代Java约束
  5. Tomcat 全攻略
  6. 昨天,A站受黑客攻击千万条用户数据外泄,量子加密能救得了吗?
  7. centos6.8下安装dc2012
  8. 自己搭建了一个简单实用的Web版记事本
  9. 财经职业技能测试的软件,2020技能 2.财经管理类 职业技能测试考试大纲(试行)...
  10. 电场在计算机专业的应用,电磁学在电力系统中的应用
  11. EPLAN如何保护电气图纸
  12. python指数函数ks检验_python指数函数不正确的指数值
  13. 内容公链Contentos首席科学家不建议刚毕业的年轻人直接从事区块链开发
  14. 数据库中的锁机制(数据库中有哪些锁)
  15. python可视化---阶梯图step()
  16. -----------------------------------SQL2005的安装问题汇总 --------------------------
  17. java利用commons-email.jar发送邮件
  18. Windows7下查看CRUX 3.0虚拟机里面的linux ext2和ext3文件系统教程
  19. 【SemiDrive源码分析】【X9芯片启动流程】30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一)
  20. ISP嵌入式平台/成像sensor

热门文章

  1. 简单记录 html2canvas网页中的图片无法显示的问题
  2. 你的下一台电脑,可能没有主机
  3. java 图像特效之老照片
  4. 英语知识点整理day24-谚语学习(O字母开头)
  5. pandas中的字符串处理函数
  6. 怎么彻底删除聊天记录?教你两招
  7. 一年300多万吨垃圾变宝贝 起到循环再利用
  8. Friend's Video List
  9. 海盗王仿官方做的天赋系统,比它的好用
  10. 程序员界有哪些经典的笑话?……