内部类

  • 内部类
    一般情况下,我们把类定义成独立的单元。有些情况下,我们把一个类放在另一个类的内部定义,称为内部类。
  • 内部类的作用
    1.内部类提供了更好的封装。只能让外部类直接访问,不允许同一个包中的其他类直接访问。
    2.内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。但外部类不能访问内部类的内部属性。
  • 内部类的使用场合:由于内部类提供了更好的封装性,并且可以很方便的访问外部属性。所以,通常内部类在只为所在外部类提供服务的情况下优先使用。
  • 内部类分类
    1.成员内部类:非静态内部类,静态内部类。
    2.匿名内部类:适合那种只需要使用一次的类。
    3.局部内部类:定义在方法内部。作用域只限于本方法,用的非常少。
package day15.Demo1;

public class TestInnerClass1 {
    public static void main(String[] args) {
        //创建一个外部类实例
        OuterClass out = new OuterClass();

        // 创建一个非静态内部类的一个实例
        OuterClass.InnerClass1 in1 = out.new InnerClass1();
        in1.getOuterClassName();    

        //创建一个静态内部类的一个实例
        OuterClass.InnerClass2 in2  = new OuterClass.InnerClass2();
        String s = in2.getName();
        System.out.println(s);

    }
}

class OuterClass{
    private String name = "OuterClass";
    private int age = 10;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    //非静态成员内部类
    class InnerClass1{
        private String name = "InnerClass1";
        private int age = 100;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        //非静态内部类调用外部类的属性和方法
        public void getOuterClassName(){
            System.out.println(OuterClass.this.name);
            System.out.println(OuterClass.this.getAge());
        }
    }

    //静态成员内部类
     static class  InnerClass2{
        private String name = "InnerClass2";
        private int age = 1000;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
    }   
}
package day15.Demo1;

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

public class TestInnerClass2 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Person [] p = new Person[5];
        String name = null;
        Integer age = 0;
        for(int i = 0; i < p.length; i++){
            name = input.next();
            age = input.nextInt();
            p[i] = new Person(name, age);
        }
        System.out.println("输入的人的名字和年龄:");
        for(int i = 0; i < p.length; i++){
                System.out.println(p[i].getName() + "\t" + p[i].getAge());
        }

        //调用局部内部类Mycomparator对数组进行排序
//      Arrays.sort(p, p[0].getMyComparator());
//      System.out.println("排序后的人的名字和年龄:");
//      for(int i = 0; i < p.length; i++){
//              System.out.println(p[i].getName() + "\t" + p[i].getAge());
//      }

        //用匿名内部类对数组进行排序
        Arrays.sort(p, new Comparator<Person>(){
            public int compare(Person o1, Person o2) {
                return o1.getAge() - o2.getAge();
            }
        });
        System.out.println("排序后的人的名字和年龄:");
        for(int i = 0; i < p.length; i++){
                System.out.println(p[i].getName() + "\t" + p[i].getAge());
        }
    }
}
class Person{
    private String name;
    private Integer age;
    public Person(String name, Integer age){
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    //局部内部类
    public Comparator getMyComparator(){
        class MyComparator implements Comparator <Person>{
            public int compare(Person o1, Person o2) {
                return o1.age - o2.age;
            }
        }
        return new MyComparator();
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值