[关闭]
@liruiyi962464 2017-03-21T10:55:39.000000Z 字数 3745 阅读 551

面向对象 内部类

java

内部类概念

内部类(Inner Class)

  • 所谓内部类(Inner Class),就是将一个类定义在里一个类的内部,内部的类称之为内部类
  1. public class Outer{
  2. class Inner{
  3. //省略
  4. }
  5. }

内部类的主要特点

  • 内部类可以很好的隐藏可以使用protected、private修饰符
  • 内部类可以直接访问外部类的所有成员,包括私有的成员
    -外部类不能直接访问内部类的成员必须首先要建立内部类的对象才可访问
    -内部类可以解决:间接地去实现多继承,可以避免修改接口而实现同一个类中俩种同名方法调用

成员内部类

成员内部类的特点

  • 成员内部类属于外部类的实例成员,成员内部类可以有所有的修饰方法在成员内部类中访问外部类的成员方法和属性,要使用外部类名.this.成员方法/成员属性的形式
  • 成员内部类的实例使用:外部类名.内部类名 实例名 = 外部类实例名.new 内部类的构造方法(参数)的形式
  • 内部类和外部类的属性和方法不同名时直接访问,如果同名使用外部类名.this.成员方法/属性

成员内部类有以下限制

-成员内部类不能与外部类重名
- 不能在成员内部类定义static属性、方法和类(static、final形式的常量定义除外)因为一个成员内部类实例必然与一个外部类实例**关联**static成员完全可以移到外部类中

成员内部类实例

  1. public class MenberInnerClass {
  2. public static void main(String[] args) {
  3. // 外部类的应用
  4. Outer outer = new Outer();
  5. outer.outerShow();
  6. // 内部类的应用
  7. // 外部类名.内部类名 实例名 = 外部类实例名.new 内部类的构造方法
  8. Outer.Inner inner = outer.new Inner();
  9. inner.innerShow();
  10. }
  11. }
  12. // 外部类
  13. //成员内部类和外部类不能同名
  14. class Outer {
  15. private String name = "张三";
  16. private int num1 = 100;
  17. public void outerShow() {
  18. System.out.println(name);
  19. System.out.println(num1);
  20. /*外部类不可直接访问内部类的属性和方法
  21. System.out.println(num2);
  22. innerShow();*/
  23. //如果访问通过创建一个内部对象
  24. Inner inner = new Inner();
  25. System.out.println("要访问通过创建的一个内部对象");
  26. inner.innerShow();
  27. System.out.println("99999999999");
  28. }
  29. // 内部类
  30. //成员内部类可以用4种修饰符
  31. public class Inner {
  32. /*不能在成员内部类中定义static属性/方法/类
  33. private static int i = 300;
  34. public static inner(){
  35. }*/
  36. private String name = "李四";
  37. private int num2 = 100;
  38. //成员内部类访问外部类的属性方法:外部类名.this.成员方法/属性
  39. //内部类可以访问外部类的成员包括私有成员
  40. public void innerShow() {
  41. System.out.println(name);
  42. System.out.println(num2);
  43. System.out.println("=======");
  44. //内部类可以直接访问外部类的成员
  45. //内部类和外部类的属性和方法不同名时:直接访问,
  46. //如果同名使用外部类名.this.成员方法/属性
  47. System.err.println(Outer.this.name);//与外部类同名
  48. System.err.println(num1);
  49. outerShow();
  50. }
  51. }
  52. }

静态内部类

静态内部类特点

  • 使用static修饰的成员内部类叫做静态内部类
  • 跟外部类没有任何关系,只在生成类名和类定义时有影响,与外部类平级,使用方法与外部类平级的类完全相同
  • 外部类名.内部类名 实例名 = new外部类.内部类类名(参数)

静态内部类有以下限制

  • 不能与外部类重名
  • 不能访问外部类的非静态的属性和方法
  • 外部类不能访问内部类的非静态的属性和方法

静态内部类实例

  1. public class StaticInnerClass {
  2. public static void main(String[] args) {
  3. //外部类名.内部类名 实例名 = new外部类.内部类类名(参数)
  4. Outer.Inner inner = new Outer.Inner();
  5. inner.innerShow();
  6. }
  7. }
  8. class Outer{
  9. private String name = "大师兄";
  10. private int num1 =100;
  11. private static int num2 = 200;
  12. public void outerShow(){
  13. System.out.println(name);
  14. System.out.println(num1);
  15. }
  16. //静态内部类
  17. static class Inner{
  18. private String name = "二师兄";
  19. private int num3 =300;
  20. private static int num4 = 400;
  21. public void innerShow(){
  22. System.out.println(name);
  23. System.out.println(num2);
  24. }
  25. }
  26. }

匿名内部类

匿名内部类特点

  • 是没有名称的内部类,没办法引用它们,必须在创建的时候,作为new语句的一部分来声明并创建它们的实例
  • 必须继承一个类(抽象的、非抽象的都可以)或者一个接口
  • 如果父类(或者父接口)是抽象类,则匿名内部类必须实现其所有抽象方法
  • 可以定义代码块,用于实例的初始化,但是不能定义静态代码块

匿名内部类语法

  1. new interface/superclass(){
  2. //类体
  3. }
  • 这种形式的new语句声明一个新的匿名类,他对一个给定的类进行扩展,或者实现一个给定的接口,并同时创建该匿名类的一个新实例

匿名内部类实例

  1. public class TestAnomousclass {
  2. public static void main(String[] args) {
  3. // TODO Auto-generated method stub
  4. Person person = new Person();
  5. //Dog dog = new Dog();
  6. //Cat cat = new Cat();
  7. //狗
  8. person.feed(new IAnimal() {
  9. @Override
  10. public void eat() {
  11. // TODO Auto-generated method stub
  12. System.out.println("Dog-----肉");
  13. }
  14. });
  15. //猫000000000000
  16. person.feed(new IAnimal() {
  17. @Override
  18. public void eat() {
  19. // TODO Auto-generated method stub
  20. System.out.println("Cat-----鱼");
  21. }
  22. });
  23. }
  24. }
  25. class Person {
  26. public void feed(IAnimal animal) {
  27. animal.eat();
  28. }
  29. }
  30. interface IAnimal {
  31. public abstract void eat();
  32. }
  33. class Dog implements IAnimal{
  34. @Override
  35. public void eat() {
  36. // TODO Auto-generated method stub
  37. System.out.println("Dog-----肉");
  38. }
  39. }
  40. class Cat implements IAnimal{
  41. @Override
  42. public void eat() {
  43. // TODO Auto-generated method stub
  44. System.out.println("Cat-----鱼");
  45. }
  46. }

局部内部类

局部内部类特点

  • 定义在代码块、方法体内的类叫做局部内部类
  • 局部内部类访问外部类的属性和方法使用“外部类名.this.属性名”和“外部类名.this.方法名(参数)”的形式
  • 对外部世界完全隐藏,只能在其作用域内生成对象

局部内部类有以下限制

  • 不能加访问修饰符,因为它不是类成员
  • 不能与外部类重名
  • 访问作用域的局部变量,该局部变量需要使用final修饰

局部内部类实例

  1. public class LocalInnerClass2 {
  2. public static void main(String[] args) {
  3. Outer outer = new Outer();
  4. outer.outerShow();
  5. }
  6. }
  7. class Outer {
  8. private String name = "张三";
  9. private int num1 = 100;
  10. public void outerShow() {
  11. int num2 = 300;
  12. // 局部内部类不能加访问修饰符
  13. class Inner {
  14. private String name = "李四";
  15. private int num3 = 400;
  16. public void innerShow() {
  17. System.out.println(name);
  18. System.out.println(num2);
  19. }
  20. }
  21. Inner inner = new Inner();
  22. inner.innerShow();
  23. }
  24. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注