【JAVA】内部类

什么是内部类

将一个类定义在另一个类的内部,这个类就称为内部类。

内部类的分类 

内部类可以分为四类:

  • 成员内部类
  • 静态内部类
  • 局部内部类
  • 匿名内部类

 成员内部类

成员内部类:就是位于外部类成员位置的类。

特点:可以使用外部类中所有的成员变量和成员方法,包括private私有的。

public class Demo1 {
    //成员内部类
    private int n=10;

    public int sumN(){
        for (int i = 0; i < 10; i++) {
            n++;
            new Demo1Inner().AddN();//内部类一般在本类中使用
        }
        return n;
    }
    //内部类指在类的内部定义的类
    //内部类可以直接使用本类中的成员,即使是private私有的
    //成员内部类
    class Demo1Inner{
        public void AddN(){
            if (n%2==0){
                n--;
            }
        }
    }
}
public class DemoTest {
    public static void main(String[] args) {
        System.out.println(new Demo1().sumN());
    }
}

静态内部类

静态内部类:被 static 所修饰的内部类,按位置分,属于成员内部类,但也可以称作静态内部类,也常叫做嵌套内部类。

特点:不能使用外部类的非static成员变量和成员方法。

public class StaticInner {
    //静态内部类
    static private int n = 10;//静态成员变量

    public int sumN() {
        for (int i = 0; i < 10; i++) {
            n++;
            new Demo1Inner().AddN();//内部类一般在本类中使用
        }
        return n;
    }

    //静态内部类只能访问外部类中的静态成员
    static class Demo1Inner {
        public void AddN() {
            if (n % 2 == 0) {
                n--;
            }
        }
    }
}

局部内部类

局部内部类:就是定义在一个方法或者一个作用域里面的类。

特点:主要是作用域发生了变化,只能在自身所在方法和属性中被使用。

public class Demo2 {
    //局部内部类,定义在一个方法或者一个作用域里面的类
    private int n=10;

    public int sumN(){
        for (int i = 0; i < 10; i++) {
            n++;
            //局部内部类,只能在自身所在方法和属性中被使用
            class Demo1Inner{
                public void AddN(){
                    if (n%2==0){
                        n--;
                    }
                }
            }
        }
        return n;
    }


}

匿名内部类

匿名内部类:一个没有名字的类,是内部类的简化写法。只在本类中使用的功能,定义在内部类中,实现封装,需要使用时new 内部类就可以。只使用一次的情况,我们可以在使用的地方,使用匿名内部类来直接重写。

匿名的特点:

  • 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。
  • 内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否为 private 的。
  • 内部类声明成静态的,就不能随便访问外部类的成员变量,仍然是只能访问外部类的静态成员变量。

匿名内部类的意义:实现封装性,隐藏起来,外界不知道里面的代码,间接实现多继承。

import java.util.Arrays;
import java.util.Comparator;

public class AnimalTest {
    /*
    匿名内部类,只在本类中使用的功能,定义在内部类中,实现封装,需要使用时new 内部类就可以。
    内部类的意义:实现封装性,隐藏起来,外界不知道里面的代码,间接实现多继承
     */
    public static void main(String[] args) {
        Animal animal1=new Animal(4,"金毛");
        Animal animal2=new Animal(5,"柯基");
        Animal animal3=new Animal(2,"拉布拉多");
        Animal animal4=new Animal(6,"哈士奇");

        Animal[] animals={animal2,animal1,animal4,animal3};
        //需要多次使用时,我们可以在新建一个类来实现Compare接口
        //Animal年龄从小到大排序
        Arrays.sort(animals,new MyCompare());//使用Arrays中的sort()需要实现Comparable接口中的CompareTo方法
        //Compare接口,比较器
        System.out.println("Animal年龄从小到大排序"+Arrays.toString(animals));
        System.out.println();

        //只使用一次的情况,我们可以在使用的地方,使用匿名内部类来直接重写
        //Animal年龄从大到小排序
        Arrays.sort(animals, new Comparator<Animal>() {
            @Override
            public int compare(Animal o1, Animal o2) {
                return o2.age-o1.age;
            }
        });
        System.out.println("Animal年龄从大到小排序"+Arrays.toString(animals));

    }
}
public class Animal {
    int age;
    String name;

    public Animal(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Animal{" +
                "age=" + age +
                ", name=" + name +
                '}';
    }
}
import java.util.Comparator;

public class MyCompare implements Comparator<Animal> {

//为Animal开发排序比较类
    @Override
    public int compare(Animal o1, Animal o2) {
        return o1.age-o2.age;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值