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 }
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 }
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 }
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 }
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 }
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 }
三、局部成员方法
在方法中定义类,这个类叫做局部内部类
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 }
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 }
注意:内部类的方法可以使用内部类的成员变量(该成员变量不可变)
四、匿名内部类
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 }
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 }
接口
1 package cn.wt.day11.demon03; 2 3 public interface Hero { 4 public abstract void show(); 5 6 public abstract void attack(); 7 }
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 }
五、类做为成员变量
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 }
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 }
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 }
六、接口做为成员变量
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 }
1 package cn.wt.day11.demon05; 2 3 public interface Attack { 4 public abstract void attack(); 5 }
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 }