java 内部类

一、基础

1、概念

内部类:在类内部中定义类

2、分类

a、成员内部类

b、局部内部类(匿名内部类)

二、成员内部类(类比成员方法和成员变量)

1、语法

package cn.wt.day11.demon;

public class Outer {

    // 成员内部类
    public class Inner{
        // 成员内部类 成员方法
        public void innerMethod(){
            System.out.println("内部类 成员方法");
        }
    }

    // 外部类 成员方法
    public void outerMethod(){
        System.out.println("外部类 成员方法");
    }
}

注意:

a、外部类的修饰词可以使用public和不写

b、成员内部类可以使用public protected (default) private

2、使用成员内部类

a、间接使用

 语法

在外部类成员方法中,将内部类实例化,并使用内部类成员方法

例子

 1 package cn.wt.day11.demon;
 2 
 3 public class Outer {
 4 
 5     // 成员内部类
 6     public class Inner{
 7         // 成员内部类 成员方法
 8         public void innerMethod(){
 9             System.out.println("内部类 成员方法");
10         }
11     }
12 
13     // 外部类 成员方法
14     public void outerMethod(){
15         System.out.println("外部类 成员方法");
16         new Inner().innerMethod();
17     }
18 }
Outer.java
 1 package cn.wt.day11.demon;
 2 
 3 public class Demon {
 4     public static void main(String[] args) {
 5         Outer outer = new Outer();
 6         outer.outerMethod();
 7 //        外部类 成员方法
 8 //        内部类 成员方法
 9     }
10 }
Demon.java

b、直接使用

语法

外部类名称.内部类名称 对象 = new 外部类名称().new 内部类名称();

例子

 1 package cn.wt.day11.demon;
 2 
 3 public class Outer {
 4 
 5     // 成员内部类
 6     public class Inner{
 7         // 成员内部类 成员方法
 8         public void innerMethod(){
 9             System.out.println("内部类 成员方法");
10         }
11     }
12 
13     // 外部类 成员方法
14     public void outerMethod(){
15         System.out.println("外部类 成员方法");
16     }
17 }
Outer.java
 1 package cn.wt.day11.demon;
 2 
 3 public class Demon {
 4     public static void main(String[] args) {
 5         Outer outer = new Outer();
 6         outer.outerMethod();
 7         // 直接使用 成员内部类的方法
 8         Outer.Inner inner = new Outer().new Inner();
 9         inner.innerMethod();
10     }
11 }
Demon.java

 3、同名变量的使用

a、内部类成员方法局部变量

语句:变量

b、内部类成员方法

语法:this.变量

c、外部类成员方法

语法:外部类.this.变量

例子

 1 package cn.wt.day11.demon;
 2 
 3 
 4 public class Outer {
 5     int num = 10;
 6     // 成员内部类
 7     public class Inner{
 8         int num = 20;
 9         // 成员内部类 成员方法
10         public void innerMethod(){
11             int num = 30;
12             System.out.println("内部类 成员方法");
13             System.out.println(num);
14             System.out.println(this.num);
15             System.out.println(Outer.this.num);
16         }
17     }
18 
19     // 外部类 成员方法
20     public void outerMethod(){
21         System.out.println("外部类 成员方法");
22         new Inner().innerMethod();
23     }
24 }
Outer.java
1 package cn.wt.day11.demon;
2 
3 public class Demon {
4     public static void main(String[] args) {
5         Outer.Inner inner = new Outer().new Inner();
6         inner.innerMethod();
7     }
8 }
Demon.java

三、局部成员方法

在方法中定义类,这个类叫做局部内部类

1、语法

package cn.wt.day11.demon02;

public class Outer {
    public void outerMethod(){
        // 局部内部类
        class Inner{
            public void innerMethod(){

            }
        }
    }
}

注意:局部内部类的修饰符为 无

2、使用

 1 package cn.wt.day11.demon02;
 2 
 3 public class Outer {
 4     public void outerMethod(){
 5         // 局部内部类
 6         class Inner{
 7             public void innerMethod(){
 8                 System.out.println("局部内部类 内部方法");
 9             }
10         }
11         new Inner().innerMethod();
12     }
13 }
Outer.java
1 package cn.wt.day11.demon02;
2 
3 public class Demon {
4     public static void main(String[] args) {
5         Outer outer = new Outer();
6         outer.outerMethod();
7     }
8 }
Demon.java

注意:内部类的方法可以使用内部类的成员变量(该成员变量不可变)

四、匿名内部类

1、语法

抽象类(接口)名称 obj = new 抽象类(接口){
        对抽象方法进行overrider  
}

注意:

匿名内部类是局部内部类的一种

可以与匿名对象共同使用

2、例子

 抽象类

1 package cn.wt.day11.demon03;
2 
3 public abstract class Person {
4     public abstract void show();
5 
6     public abstract void anotherMethod();
7 }
Person.java
 1 package cn.wt.day11.demon03;
 2 
 3 public class demon {
 4     public static void main(String[] args) {
 5         // 匿名内部类
 6         Person person = new Person() {
 7             @Override
 8             public void show() {
 9                 System.out.println("抽象类的匿名内部类");
10             }
11 
12             @Override
13             public void anotherMethod() {
14                 System.out.println("使用另一个方法");
15             }
16         };
17         person.show();
18         person.anotherMethod();
19         // 匿名对象 和 匿名内部类一起使用
20         new Person(){
21             @Override
22             public void show() {
23                 System.out.println("匿名对象的匿名内部类");
24             }
25 
26             @Override
27             public void anotherMethod() {
28                 System.out.println("匿名对象的另一个方法");
29             }
30         }.show();
31     }
32 }
demon.java

接口

1 package cn.wt.day11.demon03;
2 
3 public interface Hero {
4     public abstract void show();
5 
6     public abstract void attack();
7 }
Hero.java
 1 package cn.wt.day11.demon03;
 2 
 3 public class Demon01 {
 4     public static void main(String[] args) {
 5         // 接口的匿名内部类
 6         Hero hero = new Hero() {
 7             @Override
 8             public void show() {
 9                 System.out.println("我是盗贼");
10             }
11 
12             @Override
13             public void attack() {
14                 System.out.println("我用打击攻击敌人");
15             }
16         };
17         hero.show();
18         hero.attack();
19         // 接口匿名内部类 + 匿名对象
20         new Hero(){
21             @Override
22             public void show() {
23                 System.out.println("匿名对象,我是射击猎");
24             }
25 
26             @Override
27             public void attack() {
28                 System.out.println("好几年没玩了,忘记武器叫什么名字了");
29             }
30         }.attack();
31     }
32 }
Demon01.java

五、类做为成员变量

 1 package cn.wt.day11.demon04;
 2 
 3 public class Hero {
 4     private String name;
 5     private int age;
 6     private Weaper weaper;
 7 
 8     public Hero() {
 9     }
10 
11     public Hero(String name, int age, Weaper weaper) {
12         this.name = name;
13         this.age = age;
14         this.weaper = weaper;
15     }
16 
17     public String getName() {
18         return name;
19     }
20 
21     public void setName(String name) {
22         this.name = name;
23     }
24 
25     public int getAge() {
26         return age;
27     }
28 
29     public void setAge(int age) {
30         this.age = age;
31     }
32 
33     public Weaper getWeaper() {
34         return weaper;
35     }
36 
37     public void setWeaper(Weaper weaper) {
38         this.weaper = weaper;
39     }
40 
41     public void show(){
42         System.out.println(this.name + ",今年" + this.age + "岁,拿着" + this.weaper.getNickname());
43     }
44 }
Hero.java
 1 package cn.wt.day11.demon04;
 2 
 3 public class Weaper {
 4     private String nickname;
 5 
 6     public Weaper() {
 7     }
 8 
 9     public Weaper(String nickname) {
10         this.nickname = nickname;
11     }
12 
13     public String getNickname() {
14         return nickname;
15     }
16 
17     public void setNickname(String nickname) {
18         this.nickname = nickname;
19     }
20 }
Weaper.java
 1 package cn.wt.day11.demon04;
 2 
 3 public class Demon {
 4     public static void main(String[] args) {
 5         Hero hero = new Hero();
 6         hero.setName("哪吒");
 7         hero.setAge(3);
 8         hero.setWeaper(new Weaper("浑天绫"));
 9         hero.show();
10     }
11 }
Demon.java

六、接口做为成员变量

 1 package cn.wt.day11.demon05;
 2 
 3 public class Hero {
 4     private String name;
 5     private Attack attack;
 6 
 7     public Hero() {
 8     }
 9 
10     public Hero(String name, Attack attack) {
11         this.name = name;
12         this.attack = attack;
13     }
14 
15     public String getName() {
16         return name;
17     }
18 
19     public void setName(String name) {
20         this.name = name;
21     }
22 
23     public Attack getAttack() {
24         return attack;
25     }
26 
27     public void setAttack(Attack attack) {
28         this.attack = attack;
29     }
30 
31     public void show(){
32         System.out.println(this.name + "攻击的拟声词");
33         // 注意:调用接口的抽象方法
34         this.attack.attack();
35     }
36 }
Hero.java
1 package cn.wt.day11.demon05;
2 
3 public interface Attack {
4     public abstract void attack();
5 }
Attack.java
 1 package cn.wt.day11.demon05;
 2 
 3 public class Demon {
 4     public static void main(String[] args) {
 5         Hero hero = new Hero();
 6         hero.setName("艾希");
 7         hero.setAttack(new Attack() {
 8             @Override
 9             public void attack() {
10                 System.out.println("棒棒棒");
11             }
12         });
13         hero.show();
14     }
15 }
Demon.java
posted @ 2020-01-24 22:50  市丸银  阅读(128)  评论(0编辑  收藏  举报