1.成员内部类的介绍及使用:

package Day_13.demo01;
//ctrl+shift+F9 = recompile body.java
public class Body { //外部类 Body.classpublic class Heart{ //成员内部类, Body$Heart.class//内部类的方法public void beat(){System.out.println("心脏跳动,蹦蹦蹦");System.out.println("我叫:"+name);}}//外部类的成员变量private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}//外部类的方法public void methodBody(){System.out.println("外部类的方法");//Heart heart = new Heart();//heart.beat();new Heart().beat();}
}package Day_13.demo01;
/*
如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类
身体和心脏的关系,又如汽车和发动机的关系分类:
1.成员内部类
2.局部内部类(包含匿名内部类)成员内部类的定义格式
修饰符 class 外部类名称{修饰符 class 内部类名称{}
}
注意:内用外,可以随意访问;外用内,需要内部类对象如何使用成员内部类?有两种方式:
1.间接方式:在外部类的方法当中,使用内部类;然后main只是调用外部类的方法
2.直接方式:公式:
类名称 对象名 = new 类名称();
外部类名称.内部类名称 对象名= new 外部类名称().new 内部类名称();*/
public class demo01InnerClass {public static void main(String[] args) {Body body = new Body();//外部类的对象//通过外部类的对象,调用外部类的方法,里面间接在使用内部类Heartbody.methodBody();//按照公式写:Body.Heart heart = new Body().new Heart();heart.beat();}
}

2.内部类的重名变量如何访问

package Day_13.demo01;
//如果出现了重名现象,那么格式是:外部类名称.this.外部类成员变量名
public class Outer {int num = 10; //外部类的成员变量public class Inner /*extends Object*/{int num = 20; //内部类的成员变量public void methodInner(){int num = 30;  //内部类方法的局部变量System.out.println(num);//10 局部变量,就近原则System.out.println(this.num); //20 内部类的成员变量System.out.println(Outer.this.num);//30 外部类的成员变量}}
}package Day_13.demo01;public class demo02InnerClass {public static void main(String[] args) {// 外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();Outer.Inner obj = new Outer().new Inner();obj.methodInner();}
}

3.局部内部类定义

package Day_13.demo02;
/*
如果一个类是定义在一个方法内部的,那么这就是一个局部内部类
“局部”,只有当前所属的方法才能使用它,出了这个方法外面就不能用了定义格式:
修饰符 class 外部类名称{修饰符 返回值类型 外部类方法名称(参数列表){class 局部内部类名称 {//..}}
}小结一下类的权限修饰符:
public > protected > (default) > private
1.定义一个类的时候,权限修饰符规则
1.外部类 public / (default)
2.成员内部类 public / protected / (default) /private
3.局部内部类 什么都不能写*/
public class Outer {public void methodOuter(){class Inner { //局部内部类int num = 10;public void methodInner(){System.out.println(num);}}Inner inner = new Inner();inner.methodInner();}
}package Day_13.demo02;public class demoMain {public static void main(String[] args) {Outer obj = new Outer();obj.methodOuter();}
}package Day_13.demo02;
/*
局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是有效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);}}}
}

4.匿名内部类和匿名对象

package Day_13.demo03;public interface MyInterface {void method1(); //抽象方法void method2();
}package Day_13.demo03;public class MyInterfaceImpl implements MyInterface{@Overridepublic void method1() {System.out.println("实现类覆盖重写了方法111");}@Overridepublic void method2() {System.out.println("实现类覆盖重写了方法222");}
}package Day_13.demo03;
/*
如果接口的实现类,或者是父类的子类,只需要使用唯一的一次
那么这种情况下就可以省略掉该类的定义,而改为使用【匿名内部类】匿名内部类的定义格式:
接口名称 对象名= new 接口名称(){//覆盖重写所有抽象方法
};对格式进行解析”new 接口名称(){...}“进行解析:
1.new代表创建对象的动作
2.接口名称就是匿名内部类需要实现哪个接口
3.{...}这才是匿名内部类的内容注意的内容:
1.匿名内部类,在【创建对象】的时候只能使用唯一一次
如果希望多次创建对象,而且类的内容一样的话,只能使用单独的实现类
2.匿名对象,在【调用方法】的时候,只能调用唯一一次
如果希望同一个对象调用多次方法,必须给对象起个名字
3.匿名内部类是省略了【实现类/子类名称】,但匿名对象是省略了【对象名称】
强调:匿名内部类和匿名对象不是一回事!!!*/public class demoMain {public static void main(String[] args) {//多态MyInterface impl = new MyInterfaceImpl();impl.method1();impl.method2();//MyInterface some = new MyInterface();错误写法//使用匿名内部类,但不是匿名对象,对象名称就叫objAMyInterface objA = new MyInterface() { //没有名称,匿名 局部内部类@Overridepublic void method1() {System.out.println("匿名内部类实现了方法111A!");}@Overridepublic void method2() {System.out.println("匿名内部类实现了方法222A!");}};objA.method1(); //匿名内部类实现了方法!objA.method2();//使用了匿名内部类,而且是匿名对象new MyInterface() { //没有名称,匿名 局部内部类@Overridepublic void method1() {System.out.println("匿名内部类实现了方法!111B");}@Overridepublic void method2() {System.out.println("匿名内部类实现了方法!222B");}}.method1(); //匿名内部类实现了方法!//objB.method2();因为匿名对象无法调用第二次方法,所以需要再创建一个匿名内部类的匿名对象new MyInterface() { //没有名称,匿名 局部内部类@Overridepublic void method1() {System.out.println("匿名内部类实现了方法!111B");}@Overridepublic void method2() {System.out.println("匿名内部类实现了方法!222B");}}.method2();}
}

5.类作为成员变量类型

package Day_13.demo04;
//游戏当中的英雄角色类
public class Hero {private String name;//英雄名字private Weapon weapon; //英雄武器private int age; //英雄年龄public void attack(){System.out.println("年龄为"+age+"的"+name+"用"+weapon.getCode()+"攻击敌方");}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 int getAge() {return age;}public void setAge(int age) {this.age = age;}public Hero(String name, Weapon weapon, int age) {this.name = name;this.weapon = weapon;this.age = age;}public Hero() {}
}package Day_13.demo04;public class Weapon {private String code;//武器的代号public Weapon(String code) {this.code = code;}public Weapon() {}public String getCode() {return code;}public void setCode(String code) {this.code = code;}
}package Day_13.demo04;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);//年龄为20的盖伦用多兰剑攻击敌方hero.attack();}
}

6.接口作为成员变量类型

package Day_13.demo05;public class Hero {private String name;private Skill skill;public String getName() {return name;}public void attack(){System.out.println("我叫"+name+",开始释放技能:");skill.use();System.out.println("释放技能完成");}public void setName(String name) {this.name = name;}public Skill getSkill() {return skill;}public void setSkill(Skill skill) {this.skill = skill;}public Hero(String name, Skill skill) {this.name = name;this.skill = skill;}public Hero() {}
}package Day_13.demo05;public interface Skill {void use();//抽象方法
}package Day_13.demo05;public class SkillImpl implements Skill{@Overridepublic void use() {System.out.println("Biu~Biu~");}
}package Day_13.demo05;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("pia~pia~");}};//可以使用匿名对象和匿名实现类(匿名内部类)hero.setSkill(new Skill() {@Overridepublic void use() {System.out.println("Da~Da");}});hero.attack();}
}

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

package Day_13.demo05;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("迪丽热巴");list.add("古力娜扎");list.add("马儿扎哈");return list;}
}

8.发红包案例(略)

9.JShell 的使用

脚本:

退出JShell:     /exit

10.编译器的两点优化

自动补上强转

2021-03-10:java第十三天:成员内部类、匿名内部类和匿名对象、接口的使用、JShell相关推荐

  1. 第三次学JAVA再学不好就吃翔(part22)--匿名对象

    学习笔记,仅供参考 面向对象 匿名对象 什么是匿名对象 没有名字的对象 匿名对象应用场景 只调用一次方法的时候可以用匿名对象.调用多次的时候不适合使用,匿名对象调用完就是垃圾. 匿名对象可以作为实际参 ...

  2. 【2021.03.10】段描述符与段选择子、GDT、LDT

    要点回顾 前文提到,当写入一个段寄存器的时候,只给了一个16位的数值,但是段寄存器有96位. 那么剩下的80位从哪里来的?这个16位的数值是随便写的吗? Windbg指令 指令 功能 r 查看寄存器 ...

  3. java匿名内部对象_JavaSE 学习参考:匿名内部类和匿名对象

    匿名内部类也就是没有名字的内部类.这种类的定义之所有没有名称,因为其仅用在使用之处,其他地方也无需要使用.通常和new运算符同时定义类和创建对象.匿名类必须显示地指明其要继承和父类或接口.由匿名类创建 ...

  4. java匿名内部类及匿名对象

    如果接口的实现类(或者是父类的子类)只需要使用唯一的一次, 那么这种情况下就可以省略掉该类的定义,而改为使用[匿名内部类].(匿名内部类就是不用在新的文件中写它的实现接口类而已) 匿名内部类的定义格式 ...

  5. E.03.10 Coffee Drinking Tied to Lower Risk of Heart Failure

    2021.03.10 文章目录 [课程导读] [英文原文] [外刊原文] [课程导读] 咖啡与健康的关系一直备受关注.近期一项新的研究发现,喝咖啡与降低罹患心脏衰竭的长期风险具有相关性.那么到底每天喝 ...

  6. Java基础复习-4-抽象类、内部类、接口

    目录 抽象类 一.概述 二.代码实例 **实例解析** 内部类 内部类分为:成员内部类,局部内部类以及匿名内部类 不同种类类的修饰符 局部内部类的final 匿名内部类(重要) 匿名对象是什么呢?请看 ...

  7. Java 学习笔记(8)——匿名对象与内部类

    一般在编写代码时可能会遇到这样的场景--在某些时候,我需要定义并某个类,但是只会使用这一次,或者是某个类对象只会使用一次,为它们专门取名可能会显的很麻烦.为了应对这种情况,Java中允许使用匿名对象和 ...

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

    学习内容:三种引用类型用法 一.类作为成员变量 二.接口作为成员变量 三.接口作为方法参数和返回值类型 实际的开发中,引用类型的使用非常重要,也是非常普遍的.我们可以在理解基本类型的使用方式基础上,进 ...

  9. java基础(十三)-----详解内部类——Java高级开发必须懂的

    java基础(十三)-----详解内部类--Java高级开发必须懂的 目录 为什么要使用内部类 内部类基础 静态内部类 成员内部类 成员内部类的对象创建 继承成员内部类 局部内部类 推荐博客 匿名内部 ...

最新文章

  1. DOS命令大全 黑客必知的DOS命令集合
  2. myeclipse快捷键大全
  3. MYSQL的深入学习--优化步骤
  4. if you can not get the full version within 1 minute
  5. 《Go语言圣经》学习笔记 第五章函数
  6. 有关西电的课程学分相关问题:必修课、选修课、补考、重修、学分
  7. frameset在html5下用什么代替_速速围观!冬至吃货地图来啦~蚌埠的吃货们,你们今天吃什么?...
  8. 2013_nanjing_online
  9. 使用web3j构建以太坊钱包
  10. 经验:Windows To Go准备工作
  11. js 滚动条自动滚动到最底部
  12. 详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
  13. ftp客户端使用详细说明【linux和windows】
  14. 网络安全-技术与实践 书本习题练习
  15. Win11怎么设置开机启动项?
  16. Hexo主题制作指南
  17. 北京python培训班价格
  18. 反相器 CMOS制造(Fabrication)与布局(Layout)
  19. HTTP协议状态及报文组成 - 一文通读
  20. 吸墨涂料市场现状及未来发展趋势

热门文章

  1. .NET基础知识快速通关(10)
  2. 过程(Sub和Function)
  3. 微信小程序授权获取头像昵称的最新形式——头像昵称填写
  4. html get请求方法,获取Get请求字符串
  5. 计算机软件水平考试分数线,计算机软件资格水平考试分数线
  6. 诺学网c++视频教程在线观看+打包下载
  7. 便携式移动打印协议CPCL介绍
  8. nginx配置url重定向_Nginx配置URL重写
  9. WLAN二层旁挂组网与三层旁挂组网
  10. 学会这个思维帮你轻松年赚50w!