内部类的学习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();
    }
}

使用场景:

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

相关推荐
DBA小马哥2 分钟前
Oracle迁移实战:如何轻松跨越异构数据库的学习与技术壁垒
数据库·学习·oracle·信创·国产化平替
无敌最俊朗@5 分钟前
STL-vector面试剖析(面试复习4)
java·面试·职场和发展
暮乘白帝过重山17 分钟前
ArkTS ForEach 参数解析:组件与键值生成器
开发语言·数据库
PPPPickup20 分钟前
easychat项目复盘---获取联系人列表,联系人详细,删除拉黑联系人
java·前端·javascript
【上下求索】28 分钟前
学习笔记095——Ubuntu 安装 lrzsz 服务?
运维·笔记·学习·ubuntu
LiamTuc28 分钟前
Java构造函数
java·开发语言
三途河畔人34 分钟前
Pytho基础语法_运算符
开发语言·python·入门
长安er39 分钟前
LeetCode 206/92/25 链表翻转问题-“盒子-标签-纸条模型”
java·数据结构·算法·leetcode·链表·链表翻转
Benmao⁢44 分钟前
C语言期末复习笔记
c语言·开发语言·笔记·leetcode·面试·蓝桥杯
adsadswee1 小时前
Qt 样式与 QLinearGradient 渐变详解
开发语言·qt·qt样式表·qlineargradient·qss渐变效果