内部类

  • 内部类
    • 内部类的概念
    • 内部类的使用
    • 内部类的同名变量访问
  • 局部内部类(包含匿名内部类)
    • 局部内部类定义
    • 局部内部类的final问题
    • 匿名内部类
  • 类作为成员变量类型
  • 接口作为成员变量类型
  • 接口作为方法的参数或者返回值

内部类

内部类的概念

内部类类似于:人中的心脏
具体分为:
1.成员内部类
成员内部类的定义格式:
修饰符 class 外部类名称 {
修饰符 class 内部类名称 {

}

}

注意:内用外,随意访问;外用内,需要内部类对象

public class ExternalClass {        //外部类public class Heart {        //成员内部类public void method01() {System.out.println("内部类方法" + name);}}private String name;public void method02() {System.out.println("外部类方法");}
}

内部类的使用

使用方式:
1.间接方式:在外部类的方法中,使用内部类,然后main只是调用外部类的方法。
2.直接方式:
公式:类名称 对象名 = new 类名称();
外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();

public class ExternalClass {        //外部类public class Heart {        //成员内部类public void method01() {System.out.println("内部类方法" + name);}}private String name;public void method02() {System.out.println("外部类方法");new Heart().method01();}
}
public class Obj {public static void main(String[] args) {ExternalClass newObj = new ExternalClass();newObj.method02();ExternalClass.Heart newBody = new ExternalClass().new Heart();newBody.method01();}
}

内部类的同名变量访问

如果出现重名现象,那么格式为:外部类名称.this.外部类成员变量名

public class InnerClass {int num = 10;public class Inner {int num = 20;public void method() {int num = 30;System.out.println(num);  //30System.out.println(this.num);  //20System.out.println(InnerClass.this.num);  //10}}
}
public class Obj {public static void main(String[] args) {InnerClass.Inner obj = new InnerClass().new Inner();obj.method();}
}

局部内部类(包含匿名内部类)

局部内部类定义

如果一个类是定义在一个方法内部的那么这就是一个局部内部类
“局部”:只有当前所属的方法才能使用它,出了这个方法外面就不能用了

定义格式:

修饰符 class 外部类名称 {修饰符 返回值类型 外部类方法名称(参数列表){class 局部内部类名称 {...}}
}

定义一个类的时候,权限修饰符规则:
1.外部类:public / (default)
2.成员内部类:public / protected / (default) / private
3.局部内部类: 什么都不能写

public class Outer {public void method01() {class Inner {int num = 10;public void methodInner() {System.out.println(num);}}Inner inner = new Inner();inner.methodInner();}
}
public class Obj {public static void main(String[] args) {Outer outer = new Outer();outer.method01();}
}

局部内部类的final问题

局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是有效final的
备注:从Java 8 +开始,只要局部变量事实不变,那么final关键字可以省略

原因:
1.new出来的对象在堆内存中
2.局部变量是跟着方法走的,在栈内存中
3.方法运行结束后,立刻出栈,局部变量就会消失
4.但是new出来的对象会在堆中持续存在,直到垃圾回收消失

public class MyOuter {public void methodOuter() {int num = 10;class MyInner {public void methodInner() {System.out.println(num);}}}
}

匿名内部类

如果接口的实现类(或者是父类的子类),只需要使用唯一的一次。
那么这种情况下就可以省略该类的定义,而改为使用匿名内部类

匿名内部类的定义格式:

接口名称 对象名 = new 接口名称() {//覆盖重写所有抽象方法
}
public class InnerObj {public static void main(String[] args) {InnerInterface inter = new InnerInterface() {            //大括号内的为匿名内部类@Overridepublic void method() {System.out.println("匿名内部类实现了方法");}};obj.method();}
}

对格式"new 接口名称() {…}"进行解析:
1.new代表创建对象的动作
2.接口名称就是匿名内部类需要实现哪个接口
3.{…}这才是匿名内部类的内容

注意:
1.匿名内部类,在创建对象的时候只能使用唯一一次,如果希望多次创建对象,而且类的内容一样的话,那么就必须使用单独定义的实现类了
2.匿名对象,在调用方法的时候,只能调用唯一一次,如果希望同一个对象,调用多次方法,那么必须给对象起个名字。
3.匿名内部类是省略了实现类/子类名称,但是匿名对象是省略了对象名称

public class DemoPractice {public static void main(String[] args) {new InnerInterface() {@Overridepublic void method() {System.out.println("匿名内部类实现了方法");}}.method();}
}

类作为成员变量类型

public class Weapon {private String name;public Weapon() {}public Weapon(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
public class DemoCom {private String name;private Weapon weapon;         //成员变量为类public DemoCom() {}public DemoCom(String name, Weapon weapon) {this.name = name;this.weapon = weapon;}public void method() {System.out.println(name + "用" + weapon.getName() + "攻击了" + "外星人");}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 class DemoMain {public static void main(String[] args) {DemoCom demoCom = new DemoCom();demoCom.setName("小新");Weapon weapon = new Weapon("动感超人光波");demoCom.setWeapon(weapon);demoCom.method();}
}

接口作为成员变量类型

public interface Skill {void use();
}
public class Hero {private String name;private Skill skill;public Hero() {}public Hero(String name, Skill skill) {this.name = name;this.skill = skill;}public String getName() {return name;}public void method() {System.out.println(name + "使用了动感光波,并且说:");skill.use();}public void setName(String name) {this.name = name;}public Skill getSkill() {return skill;}public void setSkill(Skill skill) {this.skill = skill;}
}
public class DemoClass {public static void main(String[] args) {Hero hero = new Hero();hero.setName("小新");Skill skill = new Skill() {@Overridepublic void use() {System.out.println("哇哈哈哈,我就是动感超人!");}};hero.setSkill(skill);hero.method();}
}

接口作为方法的参数或者返回值

import java.util.ArrayList;
import java.util.List;public class Practice {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("小新");list.add("风间");list.add("妮妮");list.add("正男");return list;}
}

2021.5.10笔记 内部类相关推荐

  1. 2021李宏毅机器学习笔记--21 Anomaly Detection

    2021李宏毅机器学习笔记--21 Anomaly Detection(异常侦测) 摘要 一.问题描述 二.Anomaly异常 三.Anomaly Detection(异常侦测)做法 3.1 Bina ...

  2. 《java编程思想》学习笔记——内部类五

    2019独角兽企业重金招聘Python工程师标准>>> 10.5 在方法和作用域内的内部类 1.可以在一个方法里面或者任意的作用域内定义内部类.这么做有两个理由: (1)实现某类型的 ...

  3. 李迟2021年10月知识总结

    本文为 2021 年 10 月知识总结. 研发编码 C / C++ 无. golang 写了数字签名.数字信封的测试示例,了解了 RSA .AES 加解密,知道 AES 的密钥长度必须大于16字节. ...

  4. 【报告分享】2021全球10大金融科技趋势-蚂蚁集团.pdf(附下载链接)

    大家好,我是文文(微信:sscbg2020),今天给大家分享蚂蚁集团.支付宝和Garnter于2020年10月联合发布的报告<2021全球10大金融科技趋势.pdf>. 金融科技是技术驱动 ...

  5. 2021年10月国产数据库排行榜:达梦反超OceanBase夺榜眼,TDSQL实现“四连增”,数据生态加速建设

    2021年10月国产数据库排行榜已在墨天轮发布,本月共有150家数据库参与排名.我们可以用"半江瑟瑟半江红"来形容10月份数据库分数涨跌情况.除去分数没有变化的数据库,分数上涨和下 ...

  6. 抑郁症/新药等最新研究成果进展(2021年10月)

    Neuroscience:基于甲基供体的疗法或能改善机体的氧化性压力 从而有望治疗人类抑郁症和焦虑症 2021-10-15报道,近日,一篇发表在国际杂志Neuroscience上题为"Eff ...

  7. 计算机视觉最新进展概览2021年10月31日到2021年11月6日

    参考计算机视觉最新进展概览2021年10月31日到2021年11月6日 - 云+社区 - 腾讯云 1.Learning Distilled Collaboration Graph for Multi- ...

  8. codewars练习(javascript)-2021/2/10

    文章目录 codewars-js练习 2021/2/10 github 地址 [1]<7kyu>[Hells Kitchen] codewars-js练习 2021/2/10 github ...

  9. 2021年10月24日马丁加德纳聚会线上主题分享开启通知

    早点关注我,精彩不错过! 一年一度的Martin Gardner趣味数学盛会又要在本周末如期而至了!今年MatheMagician会继续参加并带来最新的数学魔术主题分享! 快点收藏会议地址,定好闹钟来 ...

最新文章

  1. 基于VMware vSphere 5.0的服务器虚拟化实践(8)
  2. java笔试之字符串反转
  3. (三)PHP网页架站
  4. k8s修改端口访问:nodeport暴露的端口范围修改
  5. facebook工具xhprof的安装与使用-分析php执行性能
  6. openjdk-7支持版本_长期支持对OpenJDK意味着什么?
  7. [vue] vue在组件中引入插件的方法有哪些?
  8. 第三章网络安全基础考试要点及真题分布
  9. Ceph (2) - 安装Ceph集群方法 2:使用cephadm配置Nautilus版Ceph集群
  10. mysql 禁止存储过程_为什么阿里巴巴禁止使用存储过程?
  11. 计算机组成原理—浮点数
  12. Redis入门指南--五种类型及其基本指令
  13. matlab 矩阵规定化,Matlab实现直方图规定化
  14. 物业为什么要用微小区SaaS系统进行管理
  15. 企业文化海报设计模板,企业文化经典标语挂图素材
  16. 随机产生一个五位数以内的数
  17. Trun On ACID(Detlete Update) On Hive
  18. 利用docx4j完美导出word文档(标签替换、插入图片、生成表格)
  19. HBuilderX 开发工具
  20. 爬取武汉所有的公交站名

热门文章

  1. 什么蓝牙耳机打电话效果最好?通话效果好的无线蓝牙耳机
  2. MPAndroidChart 自定义 X 轴、Y 轴标签,v3.1.0 如何避坑。
  3. Matlab2016b 下载显示【弹出dvd1并插入dvd2以继续】解决
  4. python indexof函数_indexof()方法
  5. 控制面板里打印服务器显示叹号,win7系统打印机显示叹号无法打印的解决方法...
  6. mysql 5.7版本的默认密码修改
  7. kali默认登录密码
  8. Python math.sqrt() 方法
  9. 何谓真正的”背景调查“!
  10. 九幽2015年Q3 WP市场份额细分报告