内部类分为四种
1. 实例内部类
2. 静态内部类
3. 局部内部类
4. 匿名内部类
1.实例内部类
地位:就相当于类的实例属性。也就是调用的时候总是需要new
package com.innerclass;
public class Outer {
//外部类 属性和方法
int a=1;
public void show(){
System.out.println("外部类的show方法");
}
//研究2:外部类调用内部类的成员
public static void main(String[] args) {
System.out.println(new Outer().new Inner().a);
new Outer().new Inner().show();
}
//实例成员--地位等同于成员属性或成员方法
public class Inner{
int a=2;
//研究1:内部类调用外部类的成员
public void show(){
System.out.println("内部类的show方法");
//内部类调用外部类的属性或方法
System.out.println(new Outer().a);
new Outer().show();
//内部类调用内部类的属性或方法
System.out.println(new Outer().new Inner().a);
}
}
}
静态内部类
地位:就相当于实体类的静态变量
- 在静态内部类中调用静态内部类的静态属性或方法时,只需要 类名.内部类名.静态变量或方法
- 在静态内部类中调用静态内部类的实例属性或方法时,需要 类名.new 内部类名().实例变量或方法
- 在静态内部类中调用外部类的实例属性或方法时,需要new 外部类名().属性或方法
- 在静态内部类中调用外部类的静态属性或方法时,只需要 外部类名.属性或方法
- 在外部类中调用静态内部类的实例属性或方法时,需要new 静态内部类名().属性或方法
- 在外部类中调用静态内部类的静态属性或方法时,需要静态内部类名.属性或方法
package com.innerclass;
public class Outer2 {
int a=5;
static int b=6;
public void show1(){
System.out.println("外部类实例方法");
}
public static void show2(){
System.out.println("外部类静态方法");
}
public static void main(String[] args) {
//研究2:外部类调用内部类的成员
new Inner().a=666;
new Inner().show1();
Inner.b=888;
Inner.show2();
}
//静态内部类
static public class Inner{
int a=55;
static int b=66;
public void show1(){
System.out.println("内部类的实例方法");
}
public static void show2(){
System.out.println("内部类的静态方法");
}
//研究1:内部类种如何调用外部类的成员
public static void main(String[] args) {
//调用外部和内部的实例属性和方法
System.out.println(new Outer2().a);
new Outer2().show1();
System.out.println(new Inner().a);
new Inner().show1();
//调用外部或内部的静态属性和方法
System.out.println(Outer2.b);
System.out.println(Inner.b);
Outer2.show2();
Inner.show2();
}
}
}
局部内部类
地位:相当于方法中的一个变量
package com.innerclass;
public class Outer3 {
int a=3;
static int b=99;
public void show(){}
public void show1(){
Outer3.this.show1();
int a=5;
//地位等同 一个 局部变量
class Inner1{
int a=6;
public void show(){}
public void show1(){
Outer3.this.show();
Inner1.this.show();
this.show();
show();
//内 调 外
System.out.println(a);
System.out.println(new Outer3().a);
new Outer3().show();
Outer3.this.show();
System.out.println(Outer3.b);
System.out.println("内部类的show");
}
}
//外 调 内
new Inner1().show1();
}
public static void main(String[] args) {
}
}
匿名内部类
抽象类或接口可以不用写具体的实现类
Inkbox接口
package com.innerclass.nm;
@FunctionalInterface
public interface Inkbox {
String color();
}
Paper接口
package com.innerclass.nm;
public interface Paper {
String size();
}
实体类Pinter
package com.innerclass.nm;
public class Printer {
private Inkbox inkbox;
private Paper paper;
public void show(){
System.out.println("在 "+paper.size()+"纸张上用 "+inkbox.color()+" 墨盒打印");
}
public Inkbox getInkbox() {
return inkbox;
}
public void setInkbox(Inkbox inkbox) {
this.inkbox = inkbox;
}
public Paper getPaper() {
return paper;
}
public void setPaper(Paper paper) {
this.paper = paper;
}
}
测试类
package com.innerclass.nm;
public class TestPrinter {
public static void main(String[] args) {
Printer p = new Printer();
/*p.setInkbox(new Inkbox() {
@Override
public String color() {
return "黑白";
}
});
p.setInkbox(new Inkbox() {
@Override
public String color() {
return "彩色";
}
});*/
p.setInkbox( ()-> "彩色");
p.setPaper(() -> "A4");
p.show();
}
}