Java面向对象学习笔记-----内部类

夏果果 1月前 ⋅ 187 阅读

内部类的概念与分类

 

如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另-一个类。

例如:身体和心脏的关系。又如:汽车和发动机的关系。

 

分类:

1.成员内部类

2.局部内部类(包含匿名内部类)

 

成员内部类的定义和使用

 

成员内部类的定义格式:

修饰符class外部类名称{
   修饰符 class 内部类名称{
      ...
   }
   ...
}

注意:内用外,随意访问:外用内,需要内部类对象。

 

使用成员内部类有两种方式

1.间接方式。在外部类的方法当中,使用内部类:然后main只是调用外部类的方法。

2.直接方式,公式:

类名称 对象名 = new 类名称();

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

 

public class Body {//外部类
    public class Heart{//成员内部类
        //内部类的方法
        public void methodA(){
            System.out.println("心脏跳动");
            //访问外部类的成员变量
            System.out.println("我叫" + name);
        }
    }
    //外部成员变量
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;//外部类调用内部类
    }

    //外部类的方法
    public void method(){
        System.out.println("外部类的方法");
        new Heart().methodA();
    }
}


public class Demo02Inner {
    public static void main(String[] args) {
        //外部类对象
        Body body = new Body();
        //通过外部类的对象,调用外部类的方法,里面间接在使用内部类Heart
        body.method();
        System.out.println("====================");

        //按公式写
        Body.Heart heart = new Body().new Heart();
        heart.methodA();
    }
}

 

内部类的同名变量访问

 

//如果出现了重名现象,那么格式是,外部类名称。this.外部类成员变量名

public class Outer {
    int num = 10;//外部类的成员变量
    public class Inner{
        int  num = 20;//内部类的成员变量
        public void method(){
            int num = 30;//内部类方法的成员变量
            System.out.println(num);//局部变量 就近原则
            System.out.println(this.num);//内部类的成员变量
            System.out.println(Outer.this.num);//外部类的成员变量
        }
    }
}


public class Demo02InnerOuter {
    public static void main(String[] args) {
        Outer.Inner inner = new Outer().new Inner();
        inner.method();
    }
}

 

局部内部类定义

 

如果一个类是定义在一个方法内部的, 那么这就是一个局部内部类 。

“局部”。只有当前所属的方法才能使用它,出了这个方法外面就不能用了。

定义格式:

修饰符class 外部类名称{

   修饰符 返回值类型 外部类方法名称(参数列表) {

      Class 局部内部类名称{

         // ...

      }

   }

}

 

小节一下类的权限修饰符:

public. > protected > (default) 》private

定义一个类的时候,权限修饰符规则:

1.外部类: public / (default)

2.成员内部类,public / protected / (default) / private

3.局部内部类:什么都不能写

 

public class Outer {
    public void methodOuter(){
        class Inner{//局部内部类
            int num = 20;
            public void methodInner(){
                System.out.println(num);//20
            }
        }
        Inner innner = new Inner();
        innner.methodInner();
    }
}


public class Demo04Main {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.methodOuter();
    }
}

 

 

局部内部类的final问题

 

局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是[有效final的]

备注,从Java 8+开始,只要局部变量事实不变,那么final关键字可以省略。

原因:

  1. new出来的对象在堆内存当中。

2.局部变量是跟着方法走的,在栈内存当中。

  1. 方法运行结束之后,立刻出栈,局部变量就会立刻消失。

4.但是new出来的对象会在堆当中持续存在,直到垃圾回收消失。

 

 

匿名内部类

 

如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,

那么这种情况下就可以省略掉该类的定义,而改为使用[匿名内部类]。

 

匿名内部类的定义格式:

接口名称_对象名= new接口名称() {

// 覆盖重写所有抽象方法

};
public interface MyInnerface {
    public void method();
}

public class Demo05Main {
    public static void main(String[] args) {
        MyInnerface inner = new MyInnerface() {
            @Override
            public void method() {
                System.out.println("匿名方法执行啦");
            }
        };
        inner.method();
    }
}

全部评论: 0

    我有话说: