Java学习笔记之---内部类

Java学习笔记之---内部类

(一)成员内部类
  1. 内部类在外部使用时,无法直接实例化,需要借助外部类信息才能实例化
  2. 内部类的访问修饰符可以任意,但是访问范围会受到影响
  3. 内部类可以直接访问外部类的成员,如果出现重名属性,优先访问内部类中定义的
  4. 可以使用外部类.this.成员的方法,访问外部类中同名的信息
  5. 外部类访问内部类信息,需要通过内部类实例,无法直接访问
  6. 内部类编译后.class文件命名:外部类$内部类.class

实例

 

public class People {
    private String name;
    private int age;
    public Heart getHeart(){
        //外部类访问内部类信息,需要通过内部类实例,无法直接访问
        new Heart().temp=12;
        return new Heart();
    }

    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 eat(){
        System.out.println("人会吃东西");
    }
    //内部类的访问修饰符可以任意,但是访问范围会受到影响
    public class Heart{
        int temp=10;
        int age=12;

        public void beat(){
            //内部类可以直接访问外部类的成员,如果出现重名属性,优先访问内部类中定义的
           // System.out.println(name+"的"+age+"心脏在跳动");
            //可以使用外部类.this.成员的方法,访问外部类中同名的信息
            System.out.println(name+"的"+People.this.getAge()+"心脏在跳动");
        }
    }

}
class PeopleTest{
    public static void main(String[] args){

        People a=new People();
        a.setName("zhang");
        a.setAge(10);
        //获取内部类对象实例  方法1:new 外部类.new 内部类
//        People.Heart aa=new People().new Heart();
//        aa.beat();
        //获取内部类对象实例  方法2:外部对象.内部类
//         People.Heart aa=a.new Heart();
//         aa.beat();
         //获取内部类对象实例  方法3:外部类对象.获取方法
        People.Heart aa=a.getHeart();
        aa.beat();
    }
}
(二)静态内部类
  1. 静态内部类中只能访问外部类中的静态成员,如果要访问非静态的成员,需要通过对象实例
  2. 静态内部类实例时,可以不依赖于外部类对象
  3. 可以通过 外部类.内部类.成员 的方式,访问内部类中的静态成员
  4. 当内部类属性于外部类属性同名时,默认直接调用内部类的成员
  5. 如果要访问外部类中的静态属性,可以通过 外部类.属性 的方式
  6. 如果要访问外部类中的非静态属性,可以通过 new 外部类().属性 的方式

实例

public class People {

    private String name;

    private static int age;

    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 eat(){

       Heart c= new Heart();

       c.temp=12;

        System.out.println(c.temp+"人会吃东西");

    }

    //内部类的访问修饰符可以任意,但是访问范围会受到影响

    public static class Heart{

        int temp=10;

        int age=12;



        //静态内部类中只能访问外部类中的静态成员,如果要访问非静态的成员,需要通过对象实例

        public static void say(){

            String ll=new People().getName();

            //如果要访问外部类中的静态属性,可以通过 外部类.属性 的方式

            //如果要访问外部类中的非静态属性,可以通过 new 外部类().属性 的方式

            System.out.println(ll+People.age+new People().getName());



        }

    }



}

class PeopleTest{

    public static void main(String[] args){



        People a=new People();

        a.setName("zhang");

        a.setAge(10);

        //静态内部类实例时,可以不依赖于外部类对象

       People.Heart aa=new People.Heart();

       //当内部类属性于外部类属性同名时,默认直接调用内部类的成员

       People.Heart.say();

    }

}
(三)方法内部类
  1. 定义在方法内部,作用范围也在方法内
  2. 和方法内部成员使用规则一样,class前面不可以添加public,private,protected,static
  3. 类中不能包含静态成员
  4. 类中可以包含final,abstract修饰的成员

实例

public class People {

    private String name;

    private static int age;

    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 Object getHeart(){

        //和方法内部成员使用规则一样,class前面不可以添加public,private,protected,static

        class  Heart{

          //类中可以包含final,abstract修饰的成员

           final int temp=10;

            int age=12;

            public String  beat(){

                System.out.println("心在跳动");

                return "心在跳动";

            }
            }

      return new Heart().beat();
    }
}
class PeopleTest{

    public static void main(String[] args){
        People a=new People();
        a.setName("zhang");
        a.setAge(10);
     System.out.println(a.getHeart());

    }
}
(四)匿名内部类
  1. 匿名内部类没有类型名称,实例对象名称
  2. 编译后的文件名:外部类$数字.class
  3. 无法使用private,public,protected,abstract,static修饰
  4. 无法编写构造方法,可以添加构造代码块
  5. 不能出现静态成员
  6. 匿名内部类可以实现接口,也可以继承父类,但不可兼得
 实例
 public abstract class Person {

    public abstract void read();

}
class PersonTest{

    public void getRead(Person a){

        a.read();

    }

    public static void main(String[] args){

        PersonTest test=new PersonTest();

        //匿名内部类没有类型名称,实例对象名称

        //无法使用private,public,protected,abstract,static修饰

        //匿名内部类可以实现接口,也可以继承父类,但不可兼得

        test.getRead(new Person() {

            //无法编写构造方法,可以添加构造代码块

            {

                //构造代码块

            }

            @Override

            public void read() {

                System.out.println("男生");

            }

        });

        test.getRead(new Person() {

            @Override

            public void read() {

                System.out.println("女生");

            }

        });
    }

}
原文地址:https://www.cnblogs.com/dyddzhp/p/11174184.html