您当前的位置: 首页 >  Java

小新爱学习.

暂无认证

  • 1浏览

    0关注

    89博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

一篇文章带你搞懂【Java】中的内部类

小新爱学习. 发布时间:2022-06-12 12:46:33 ,浏览量:1

在这里插入图片描述 在这里插入图片描述

在这里插入图片描述

个人名片:

🐼作者简介:一名大一在校生 🐻‍❄️个人主页:小新爱学习. 🐼个人WeChat:hmmwx53 🕊️系列专栏:零基础学java ----- 重识c语言 🐓每日一句:

文章目录
  • 内部类🐺
    • 1.1内部类概述🐒
    • 1.2成员内部类🐷
    • 1.3局部内部类🐻‍❄️
    • 1.4匿名内部类🐇
    • 1.5匿名内部类在开发中的使用🐧
    • 嵌套类有两种类型:🐯
      • 静态内部类🦕
      • 非静态内部类🦖

内部类🐺

在这里插入图片描述

1.1内部类概述🐒

内部类:就是在一个类中定义一个类,举例:在一个类A的内部定义一个类B,类B就被称为内部类

内部类定义格式:

class OuterClass {   // 外部类
    // ...
    class NestedClass { // 嵌套类,或称为内部类
        // ...
    }
}

范例:

public class Outer {
           public class Inter {
      }
}

要访问内部类,可以通过创建外部类的对象,然后创建内部类的对象来实现。

内部类的访问特点:

  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,必须创建对象

代码示例:

public class Outer {
    private int age = 30;

    public class Inner {
        public void show() {
            System.out.println(age);
        }
    }
    public void method() {
        Inner i = new Inner();
        i.show();
    }
}
1.2成员内部类🐷

在这里插入图片描述

按照内部类中定义的位置不同,可以分为如下两种形式

  •  在类的成员位置:成员内部类
    
  •  在类的局部位置:局部内部类
    

成员内部类,外界创建对象使用:

  • 格式:外部类名.内部类名  对象名 = 外部类对象.内部类对象;
    
  •  范例: Outer.Innter oi = new Outer().new Innter();
    

代码示例:

public class Outer {
    private int num = 10;

    /*public class Inner{
        public void show() {
            System.out.println(num);
        }
    }*/
    private class Inner{
        public void show() {
            System.out.println(num);
        }
    }
    public void method(){
        Inner i=new Inner();
        i.show();
    }

}

/*
     测试类
 */
public class InnerDemo {
    public static void main(String[] args) {
        //创建内部类对象,并调用方法
        //格式:外部类名.内部类名  对象名 = 外部类对象.内部类对象;
        //Outer.Innter oi = new Outer().new Innter();
        //oi.show();
        Outer o = new Outer();//创建外部类对象,调用method方法,间接访问成员内部类私有属性
        o.method();

    }
}

不过要注意的是,当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:

  •   外部类.this.成员变量
    
  •    外部类.this.成员方法
    
  • 内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。比如上面的例子,如果成员内部类Inner用private修饰,则只能在外部类的内部访问,如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。这一点和外部类有一点不一样,外部类只能被public和包访问两种权限修饰。我个人是这么理解的,由于成员内部类看起来像是外部类的一个成员,所以可以像类的成员一样拥有多种权限修饰。

1.3局部内部类🐻‍❄️

局部内部类是在方法中定义的类,所以外界是无法直接使用的,需要在方法中创建对象并使用 该类可以使直接访问外部类的成员,也可以访问方法内的局部变量

代码示例:

public class Outer {
    private int num = 10;

    public void method(){

        class Inner{
            int num1= 30;
            public void show(){
                System.out.println(num);
                System.out.println(num1);
            }
        }
        Inner i = new Inner();
        i.show();
    }
}

/*
 测试类
 */
public class OuterDemo {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.method();
    }
}

控制台输出:10 30

注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。

  • 局部内部类:定义在方法中的内部类
  • 不能使用一些修饰符public private…
  • 局部内部类只能定义在方法当中使用
  • 局部内部类当中是不能包含静态变量

因为局部内部类是‘属于方法的’,而static是‘属于类的’,两者相矛盾 局部内部类当中可以包含局部变量,使用的局部变量的本质是final变量 在方法中new出局部类,会在堆中开辟空间,若局部内部类使用了栈中该方法栈帧的成员变量,一旦方法栈帧出栈,堆中的成员变量就无法找到指向的元素,会空指针异常 为了避免这种情况,只能将方法中的成员变量设为static或final,但是static又不能设,所以只能设置为final 当堆中一个对象没有人引用 它并不是直接就销毁

1.4匿名内部类🐇

前提:存在一个类或者接口,这里的了类可以是具体类也可以是抽象类

  • 格式:
  • new 类名或接口名(){ 重写方法; };

  • 范例:
new Inter(){   //new-》对象没有名字,且继承或者实现了该接口的子类的匿名对象
    public void show() {
        
        }
}

本质: 是一个继承了该类或者实现了该接口的子类的匿名对象

代码示例: Outer类:

public class Outer {
    public void method(){
     /*   new Inter(){
            @Override
            public void show() {
                System.out.println("匿名内部类");
            }
        };*/   //对象
      /*  new Inter(){
            @Override
            public void show() {
                System.out.println("匿名内部类");
            }
        }.show();*/   // 对象调方法

       Inter i =  new Inter(){
            @Override
            public void show() {
                System.out.println("匿名内部类");
            }
        };
       i.show();

    }
}

测试类: OuterDemo

public class OuterDemo {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.method();

    }
}

接口类:Inter

public interface Inter {
    void show();
}

1.5匿名内部类在开发中的使用🐧

代码示例: 测试类:JumppingDemo

/*
  测试类
 */
public class JumppingDemo {
    public static void main(String[] args) {
        //需求:创建接口操作类对象,调用method方法
        JumppingOperator jo = new JumppingOperator();
//        Jumpping j = new Jumpping();//不能实例化
        Jumpping j = new Cat();
        jo.method(j);

        System.out.println("----------------");
        jo.method(new Jumpping() {
            @Override
            public void jump() {
                System.out.println("猫可以跳高了");
            }
        });//注意
        jo.method(new Jumpping(){
            @Override
            public void jump() {
                System.out.println("你在狗叫什么");
            }
        });
    }
}


操作类:

/*
 跳高接口操作类,里面有一个方法,方法的参数是接口名
 */
public class JumppingOperator {
    public void method(Jumpping j){//new Cat();
        j.jump();
    }
}

猫类,实例化:

public class Cat implements Jumpping{
    @Override
    public void jump() {
        System.out.println("猫可以跳高了");
    }
}

跳高接口

/*
   跳高接口
 */
public interface Jumpping {
    void jump();
}

嵌套类有两种类型:🐯

要访问内部类,可以通过创建外部类的对象,然后创建内部类的对象来实现。

嵌套类有两种类型:

  •  非静态内部类
    
  •  静态内部类
    
静态内部类🦕

静态内部类是 在内部类前面加上static 静态内部类是 不需要创建外部对象

  •  Outter.Inner in = new Outter.Inner();
    

在静态内部类当中, 没有外部类引用 意思是他在堆中开辟的空间 里面没有存放外部类的地址 静态内部类,是可以访问外部类的静态成员 但是不能直接访问外部类中的非静态成员变量 如果想要访问外部类中的非静态成员变量 可以new一个外部类出来: new Outer().age

访问静态内部类当中的静态成员: Outter.Inner.color 不需要new内部类,直接把内部类当对象用 静态内部类当中不仅可以定义静态成员也可以定义非静态成员 调用方法如出一辙

非静态内部类🦖

非静态内部类是一个类中嵌套着另外一个类。 它有访问外部类成员的权限, 通常被称为内部类。

由于内部类嵌套在外部类中,因此必须首先实例化外部类,然后创建内部类的对象来实现。

关注
打赏
1663374351
查看更多评论
立即登录/注册

微信扫码登录

0.0492s