内部类的学习2

java 复制代码
package oop.innerclass.a03innerclassdemo03;

public class Outer {
    private int a=10;
    class Inner{
        private int a=20;
        public void show(){
            int a=30;
            System.out.println(a);//30
            System.out.println(this.a);//20
            System.out.println(Outer.this.a);
        }
    }
}
package oop.innerclass.a03innerclassdemo03;

public class Test {
    public static void main(String[] args) {
        Outer.Inner oi=new Outer().new Inner();
        oi.show();
    }
}

静态内部类

静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象。

创建静态内部类对象的格式:

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

java 复制代码
package oop.innerclass.a04innnerclassdemo04;

public class Outer {
    int a=10;
    static int b=20;
    static class Inner{
        public void show1(){
            System.out.println("非静态的方法");
           Outer o=new Outer();
            System.out.println(o.a);
            System.out.println(b);
        }
        public static void show2(){
            System.out.println("静态的方法");
            Outer o=new Outer();
            System.out.println(o.a);
            System.out.println(b);
        }
    }
}
package oop.innerclass.a04innnerclassdemo04;

public class Test {
    public static void main(String[] args) {
Outer.Inner oi=new Outer.Inner();
oi.show1();
Outer.Inner.show2();
    }
}

局部内部类:将内部类定义在方法里面就叫局部内部类,类似于方法里面的局部变量。

外界无法直接使用,需要在方法内部创建对象并使用。

该类可以直接访问外部类的成员,也可以访问方法内的局部变量。

java 复制代码
package oop.innerclass.a05innerclassdemo05;

public class Outer {
    int b=20;
   public void show(){
       int a=10;
       //局部内部类
       class inner{
String name;
int age;
public void method1(){
    System.out.println(a);
    System.out.println(b);
    System.out.println("局部内部类中的method1方法");
}
          // public static void method2(){
           //    System.out.println("局部内部类中的method2静态方法");
         //  }
       }
      //创建局部内部类的对象
       inner i=new inner();
       System.out.println(i.name);
       System.out.println(i.age);
       i.method1();
   }
}
package oop.innerclass.a05innerclassdemo05;

public class Test {
    public static void main(String[] args) {
Outer o=new Outer();
o.show();
    }
}

匿名内部类:本质上就是隐藏了名字的内部类。

格式:

new 接口名或类名(){

重写方法;

};

java 复制代码
package oop.innerclass.a06innerclassdemo06;

public abstract class Animal {
    public abstract void eat();
}
package oop.innerclass.a06innerclassdemo06;

public class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }
}package oop.innerclass.a06innerclassdemo06;

public interface Swim {
    public abstract void swim();
}
package oop.innerclass.a06innerclassdemo06;

public class Test {
    public static void main(String[] args) {
new Swim(){

    @Override
    public void swim() {
        System.out.println("重写了游泳的方法");
    }
};
//Dog d=new Dog();
//method(d);
method(
    new Animal(){

        @Override
        public void eat() {
            System.out.println("狗吃骨头");
        }
    }
    );
new Animal(){

    @Override
    public void eat() {
        System.out.println("重写eat方法");
    }
};
    }
    public static void method(Animal a){
        a.eat();
    }
}
package oop.innerclass.a06innerclassdemo06;

public class Test2 {
    public static void main(String[] args) {
 Swim s=   new Swim(){

        @Override
        public void swim() {
            System.out.println("重写之后的swim方法");
        }
    };
 s.swim();
        new Swim(){
            @Override
            public void swim() {
                System.out.println("重写之后的swim方法");
            }
        }.swim();
    }
}

使用场景:

当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象,如果实现类只要使用一次,就可以用匿名内部类简化代码。

相关推荐
灰子学技术1 小时前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
老毛肚1 小时前
MyBatis体系结构与工作原理 上篇
java·mybatis
阿蒙Amon1 小时前
TypeScript学习-第10章:模块与命名空间
学习·ubuntu·typescript
AI绘画哇哒哒1 小时前
【干货收藏】深度解析AI Agent框架:设计原理+主流选型+项目实操,一站式学习指南
人工智能·学习·ai·程序员·大模型·产品经理·转行
风流倜傥唐伯虎1 小时前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
二十雨辰1 小时前
[python]-AI大模型
开发语言·人工智能·python
Yvonne爱编码1 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
Re.不晚2 小时前
JAVA进阶之路——无奖问答挑战1
java·开发语言
你这个代码我看不懂2 小时前
@ConditionalOnProperty不直接使用松绑定规则
java·开发语言
pas1362 小时前
41-parse的实现原理&有限状态机
开发语言·前端·javascript