尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Java 面向对象高级 内部类

Java 面向对象高级 内部类 5. 内部类5.1 什么是内部类内部类在一个类里面再定义一个类publicclassOuter{//外部类publicclassInner{//内部类}}5.2 为什么会有内部类eg:需求写一个javabean类描述汽车属性品牌车龄颜色发动机品牌发动机使用年限publicclassCar{StringcarName;intcarAge;intcarColor;StringengineName;intengineAge;}上述写法的问题发动机两个属性应该为一类没有体现出来解决内部类publicclassCar{StringcarName;intcarAge;intcarColor;classEngine{StringengineName;intengineAge;}}总结内部类表示的事物是外部类的一部分内部类单独出现没有任何意义5.3 内部类的分类成员内部类了解静态内部类了解局部内部类了解匿名内部类重点Lambda表达式 方法引用5.3.1 成员内部类定义写在成员位置属于外部类成员eg:publicclassCar{//外部类StringcarName;intcarAge;intcarColor;privateclassEngine{//成员内部类StringengineName;intengineAge;}}编写成员内部类的注意点成员内部类可被一些修饰符修饰eg:private, 默认,protected,public,static等private只能在本类中使用啥都没只能在同一个包中使用protect本包和其他包的子类中可使用public所有地方都能用static静态内部类在成员内部类里面JDK16之前不能定义静态变量JDK16开始才可以定义静态变量获取成员内部类的两种方式外部类编写方法对外提供内部类对象使用场景private修饰内部类时publicInnergetInstance(){returnnewInner();}接收OuteronewOuter();Objectinnero.getInstance();注意内部类私有则获取的内部类类型不能写Outer.Inner利用多态写内部类的父类此处即Object直接创建使用场景除了 第一种方法的场景格式外部类名.内部类名 对象名 外部类对象.内部类对象;范例Outer.Inner oi new Outer().new Inner();成员内部类如何获取外部类的成员变量就近原则获取外部类成员变量Outer.this.变量名;packageoopinnerclass.demo2;publicclassOuter{inta10;classInner{inta20;publicvoidshow(){inta30;System.out.println(a);//30System.out.println(this.a);//20System.out.println(Outer.this.a);//10}}}packageoopinnerclass.demo2;publicclassText{staticvoidmain(){Outer.InneroinewOuter().newInner();oi.show();}}内部类的内存图5.3.2 静态内部类加static关键字的内部类注意事项静态内部类只能访问外部类中的静态变量和静态方法如果在静态内部类中想要访问外部类非静态的内容需要创建外部类的对象创建静态内部类的对象外部类名.内部类名 对象名 new 外部类名.内部类名();eg:Outer.Inner oi new Outer.Inner();tips只要是静态的东西都可以用类名点直接获取调用静态内部类中非静态方法的格式先创建对象用对象调用eg:oi.show1();调用静态内部类中静态方法的格式外部类名.内部类名.方法名();eg:Outer.Inner.show2();注意先创建对象用对象调用也可以调用静态方法但不提倡5.3.3 局部内部类将内部类定义在方法里面就叫做局部内部类类似于方法里面的局部变量外界无法直接使用需在方法内部创建对象才能使用publicclassOuter{publicvoidshow(){inta10;//局部内部类classInner{Stringname;intage;publicvoidmethod1(){System.out.println(局部内部类中的method1方法);}publicvoidmethod2(){System.out.println(局部内部类中的method2静态方法);}}//创建局部内部类的对象InnerinewInner();System.out.println(i.name);System.out.println(i.age);i.method1();i.method2();}}该类可直接访问外部类的成员也可直接访问方法内的局部变量publicclassOuter{intb20;publicvoidshow(){inta10;//局部内部类classInner{publicvoidmethod1(){System.out.println(a);System.out.println(b);}}}}OuteronewOuter();o.show();5.3.4 匿名内部类就是一个没有名字的内部类隐藏了名字的内部类可写在成员位置也可写在局部位置作用在继承一个类或者实现一个接口的时候少写一个文件也就是lambda的前置知识点定义格式没有名字的java类继承、实现重写方法创建对象可以理解为是一个没有名字的Java类的对象new类名或者接口名(){重写方法;};newInter(){publicvoidshow(){...}};例子要求在测试方法类中调用下面的gowimming方法传统方式调用gowimming方法新建Java文件在文件中新建Student类实现重写方法创建学生对象调用方法packageoopinnerclass.demo4;publicclassText{staticvoidmain(){StudentsnewStudent();goSwimming(s);}publicstaticvoidgoSwimming(Swims){s.swim();}}packageoopinnerclass.demo4;publicinterfaceSwim{publicabstractvoidswim();}packageoopinnerclass.demo4;publicclassStudentimplementsSwim{Overridepublicvoidswim(){System.out.println(学生游泳);}}问题如果Student类只用到一次那么这个Java文件单独新建有点浪费匿名内部类的作用少定义一个java文件packageoopinnerclass.demo4;publicinterfaceSwim{publicabstractvoidswim();}packageoopinnerclass.demo4;publicclassText{staticvoidmain(){//多态SwimsnewSwim(){Overridepublicvoidswim(){System.out.println(游泳~);}};goSwimming(s);}publicstaticvoidgoSwimming(Swims){s.swim();}}解释没有名字的java类大括号Swim就是这个没有名字的java类实现了swim接口重写方法在大括号中重写swim所有的抽象方法创建对象new关键字作用的是后面这个没有名字的java类创建了他的对象整体创建了一个Swim实现类的对象只不过这个类没有名字而已使用场景如果实现类只要使用一次就可以用匿名内部类简化代码Lambda表达式的前置知识点
返回列表