Java中内部类的四大模板
成员内部类
**特点:**成员内部类的级别等同于成员方法
调用时需要外部类的对象 并用外部类的对象来创建内部类的对象,至于内部类内部与普通类内有区别。
//客户端创建外部对象并调用成员
package com.it.template;
import javax.swing.*;
/**
* @Date 2019/8/9 7:57
* @Created by hfh
* @Description TODO
* 成员内部类的对象要借助外部类的对象才能创建
*/
public class MemberClassTest {
public static void main(String[] args) {
//方式一:先创建外部类对象 再用外部类对象创建内部类对象
MemberInnerClass memberInnerClass = new MemberInnerClass();
memberInnerClass.print();//姓名:LiBai年龄:22 外部类调用外部属性
//内部类对象 借助外部类对象
/* MemberInnerClass.Inner inner = memberInnerClass.new Inner();
inner.print();//姓名:DuFu年龄:DuFu 内部对象调用内部属性
//方式二:一步到位的创建
MemberInnerClass.Inner inner1 = new MemberInnerClass().new Inner();
inner1.print();//姓名:DuFu年龄:18*/
}
}
//类结构
/**
* @Date 2019/8/9 7:42
* @Created by hfh
* @Description
* 成员内部类的使用
* 特点 成员内部类的级别等同于成员方法
* 调用时需要外部类的对象 并用外部类的对象来创建内部类的对象
*/
public class MemberInnerClass {
//外部类属性的封装
private int age = 22;
private String name = "LiBai";
//并通过getter setter公开私有对象 在setter中可以设置属性范围达到安全输入的目的
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//外部构造器 用来创建外部对象 和初始化对象
public MemberInnerClass() {
}
public MemberInnerClass(int age, String name) {
this.age = age;
this.name = name;
}
//外部类自己的方法
public void print(){
System.out.println("姓名:"+getName()+"年龄:"+getAge());
}
//成员内部类 和成员方法同级别 类内部和普通类 一样的使用方法
public static class Inner{
//内部类属性封装
private int age = 18;
private String name = "DuFu";
//并通过getter setter公开私有对象 在setter中可以设置属性范围达到安全输入的目的
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//内部类构造器 用来创建内部对象 和初始化对象
public Inner() {
}
public Inner(int age, String name) {
this.age = age;
this.name = name;
}
//内部类自己的方法
public void print(){
//此处默认调用内部类属性,就近原则。当然可以调用外部属性 用外部名.this.属性名的方式
//例如MemberInnerClass.this.getName()
System.out.println("姓名:"+getName()+"年龄:"+getAge());
}
}
}
静态内部类
特点:静态内部类相当于把成员内部类归类化 此时的静态内部类与外部类同级别
创建对象时不需要节制外部类对象
package com.it.template;
import javax.swing.*;
/**
* @Date 2019/8/9 7:57
* @Created by hfh
* @Description TODO
* 成员内部类的对象要借助外部类的对象才能创建
*/
public class MemberClassTest {
public static void main(String[] args) {
//方式一:先创建外部类对象 再用外部类对象创建内部类对象
MemberInnerClass memberInnerClass = new MemberInnerClass();
memberInnerClass.print();//姓名:LiBai年龄:22 外部类调用外部属性
//内部类对象 借助外部类对象
/* MemberInnerClass.Inner inner = memberInnerClass.new Inner();
inner.print();//姓名:DuFu年龄:DuFu 内部对象调用内部属性
//方式二:一步到位的创建
MemberInnerClass.Inner inner1 = new MemberInnerClass().new Inner();
inner1.print();//姓名:DuFu年龄:18*/
}
}
//类结构 只是把成员内部类的class关键字前面加上static关键字
package com.it.template;
/**
* @Date 2019/8/9 8:19
* @Created by hfh
* @Description TODO
*/
public class StaticInnerClass {
//外部类属性的封装
private int age = 22;
private String name = "LiBai";
//并通过getter setter公开私有对象 在setter中可以设置属性范围达到安全输入的目的
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//外部构造器 用来创建外部对象 和初始化对象
public StaticInnerClass () {
}
public StaticInnerClass (int age, String name) {
this.age = age;
this.name = name;
}
//外部类自己的方法
public void print(){
System.out.println("姓名:"+getName()+"年龄:"+getAge());
}
//静态内部类 和普通类没有区别 ,类内部和普通类 一样的使用方法
public static class Inner{//相当于把成员内部类归类话语外部类内有区别
//静态内部类属性封装
private int age = 18;
private String name = "DuFu";
//并通过getter setter公开私有对象 在setter中可以设置属性范围达到安全输入的目的
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//静态内部类构造器 用来创建内部对象 和初始化对象
public Inner() {
}
public Inner(int age, String name) {
this.age = age;
this.name = name;
}
//静态内部类自己的方法
public void print(){
System.out.println("姓名:"+getName()+"年龄:"+getAge());
}
}
}
局部内部类
特点:确切的说外部类不知道局部内部类的存在,局部内部类的级别与局部属性一样,存在栈中,用完就会消失,因此局部内部类的调用必须要在宿主方法里完成(包括对象的创建,成员的调用)
//客户端创建对象 成员的调用
package com.it.template;
/**
* @Date 2019/8/8 9:43
* @Created by hfh
* @Description TODO
*/
public class LocalTest {
public static void main(String[] args) {
//创建外部类对象 外部对象不知道内部对象的存在
LocalInner localInner = new LocalInner();
localInner.print();
}
}
//类结构
package com.it.template;
/**
* @Date 2019/8/8 9:39
* @Created by hfh
* @Description TODO
*/
public class LocalInner {
//外部类属性
private int age = 88;
private String name = "LiBai";
//外部类构造
public LocalInner() {
}
public LocalInner(int age, String name) {
this.age = age;
this.name = name;
}
//外部类构造
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//外部类方法
public void print() {
System.out.println(getAge() + " " + getName());
//局部内部类与局部属性一个级别 因此不能有访问修饰符
class Inner {
//内部类属性
private int age = 18;
private String name = "DuFu";
//内部类构造
public Inner() {
}
public Inner(int age, String name) {
this.age = age;
this.name = name;
}
//内部类setter getter
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setNamr(String name) {
this.name = name;
}
//内部类方法
public void print() {
System.out.println(getAge() + " " + getName());
}
}
//局部内部类额的对象只能在方法里面使用 因此在外部不能创建对象
Inner inner = new Inner();
inner.print();//局部对象调用局部类方法
}
}
匿名内部类
特点 :借助接口用接口类型变量接收类体
//客户端
package com.it.template;
/**
* @Date 2019/8/8 9:50
* @Created by hfh
* @Description TODO
*/
public class NonameTest {
public static void main(String[] args) {
NoNameOutter noNameOutter = new NoNameOutter();
noNameOutter.print();
noNameOutter.noNameInner.print();
//88 NoNameOutter
//inner
}
}
//匿名 类接口
package com.it.template;
public interface NoNameInner {
public void print();
}
//类体
package com.it.template;
/**
* @Date 2019/8/8 9:46
* @Created by hfh
* @Description TODO
*/
public class NoNameOutter {
//外部类属性
private int age = 88;
private String namr = "NoNameOutter";
//外部类构造
public NoNameOutter() {
}
public NoNameOutter(int age, String namr) {
this.age = age;
this.namr = namr;
}
//外部类构造
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getNamr() {
return namr;
}
public void setNamr(String namr) {
this.namr = namr;
}
//外部类方法
public void print() {
System.out.println(getAge() + " " + getNamr());
}
//nonameInner lamda表达式
NoNameInner noNameInner = ()->{
System.out.println("inner");
};
}