自学内容网 自学内容网

Java基础知识03(内部类)【24.11.25】

类的5大成员:属性,方法,构造器,代码块,内部类 

1.内部类的分类

(1)定义在外部类局部位置上(比如:方法内)

1)局部内部类(有类名)

样例如下:

package com.temporary.mid_term;

class Outer1 {

    private int a = 1;

    public void m1(){
        System.out.println("方法m1被调用");
    };

    public void m2() {

        class Inner {

            public void f1() {
                m1();//直接调用
                System.out.println("a=" + a);
            }

//局部内部类可以访问外部类的所有成员,包括私有的}
        }//内部类结束
//创建对象
        Inner inner = new Inner();
        inner.f1();
        {//代码块也可以定义内部类}
        }
    }
}
public class Outer{
    public static void main(String[] args) {
        Outer1 outer = new Outer1();
        outer.m2();
    }
}

测试结果:

 

细节如下:

1.可以直接访问外部类所有成员

2.不能添加访问修饰符,相当于局部变量,但是可以用final修饰,就是不能用public,加了final就不能被继承

3.作用域:仅仅定义在它的方法或代码块中

4.外部类可以创建局部类的对象,然后调用方法即可

5.外部其他类例如main不能访问局部内部类

6.如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,可以使用(外部类名.this.成员)

例如我在内部类再次定义属性a=10,再调用时就是输出a=10,如果我一定要访问外部类的属性a;可以用Outer1.this.a的形式,谁调用了m1,谁就是Outer2.this

2)匿名内部类(Anonymous Class无类名)重点!!!

细节如下:

1.基本语法:new 类或接口(参数列表)

2.匿名内部类只使用一次

3.语法:

new 类/接口(参数列表){

};

测试用例:

package com.temporary.mid_term;

public class AnonymousInnerClass {
    public static void main(String[] args) {
        Outer2 outer = new Outer2();
outer.method();

    }
}
  class Outer2<Amimal> {//外部类
        private int a = 10;
        public void method(){
            //基于接口的匿名内部类
            //想使用IA接口,传统方式就是写一个类实现该接口,创建对象
            //如果我只想实现一次的话比如Animal接口很多动物都要实现就得创建很多类很多
            //可以用内部类用来简化
            IA tiger = new IA() {
                //运行类型是匿名内部类,编译类型是IA
                @Override
                public void cry() {
                    System.out.println("匿名内部类重写了cry方法");
                }
            };
            System.out.println("tiger的运行类型=" + tiger.getClass());
            tiger.cry();//重写了要重新调用才能实现目的
            //基于类的匿名内部类
             Father father = new Father("jack"){
                 @Override
                 public void Test() {

                     System.out.println("匿名内部类重写了test方法");
                 }
             };//带分号
            System.out.println("father的运行类型=" + father.getClass());
            father.Test();
 Animal  animal = new Animal(){
     @Override
     public void eat() {
         System.out.println("小狗吃骨头");
     }
 };
 animal.eat();
            System.out.println(animal.getClass());


    }
    interface IA{
public void cry();
    }
    class Father{
public Father(String name){
    System.out.println("name=" + name);
}
public void Test(){
    System.out.println(123);}
    }
    //再定义一个抽象类
      abstract class Animal{
        public Animal() {
        }
//抽象方法中没有方法体
 abstract void eat();
    }

    }

3)成员内部类(没有static修饰)

简述:成员内部类式定义在外部类的成员位置,并且没有static修饰

细节:

1.可以直接访问外部类的所有成员,包括私有的

2.可以添加任意修饰符(四个)

3.作用域:成员内部类访问外部类成员(直接访问),外部类访问成员内部类(创建对象再访问),外部其他类访问成员内部类:

Outer01 outer01 = new Outer01();

Inner01 inner01 = outer01.new Inner01();

//

Inner01 inner01 = new Outer().new Inner01();

//使用一个方法获取

Inner inner01 = new Outer01().getInner01();

 代码样例:


public class Inner01 {//内部类
    private int n1 = 10;
    public String name = "张三";
    //成员内部类
    class Inner02{
        public void say(){
            System.out.println("n1=" + n1 + " ,name=" + name);
        }
    }
    //写方法
    public void t1(){
        Inner02 inner02 = new Inner02();
        inner02.say();
    }

}

4)静态内部类(使用static修饰)

介绍:静态内部类就是定义在外部类的所有静态成员,并且有static修饰

细节:

1.可以直接访问外部类的所有静态成员,包括私有的,但是不能直接访问非静态成员

2.可以访问任意修饰符,其地位就是一个成员

3.外部其他类怎么访问???

Outer01 .Inner01 j = new Outer01.inner01();//前提式满足访问权限,内部类不能私有


原文地址:https://blog.csdn.net/2302_79648928/article/details/143582883

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!