【零基础学Java】—内部类的概念与分类(三十)

简介: 【零基础学Java】—内部类的概念与分类(三十)

访问控制修饰符

Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类

public : 对所有类可见。使用对象:类、接口、变量、方法

protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。

我们可以通过以下表来说明访问权限:

二、内部类的概念与分类

  • 如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类
  • 例如:身体和心脏的关系;汽车和发动机的关系

内部类的分类:成员内部类和局部内部类(包含匿名内部类)

成员内部类的定义格式:

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

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

二、如何使用成员内部类

  • 间接方式:在外部的方法当中,使用内部类;然后main只是调用外部类的方法
  • 直接方式:外部类名称.内部类名称 对象名=new 外部类名称().new 内部类名称();
/*
分类:
成员内部类:
局部内部类(包含匿名内部类):
成员内部类的定义格式:
修饰符 class 外部类名称 {
      修饰符 class 内部类名称{
      //……
      }
      //……
}
注意:内用外,随意访问;外用内,需要借助内部类对象
 */
public class Body {//外部类
    public class Heart{//成员内部类
        public void beat(){
            System.out.println("心脏跳动,蹦蹦蹦!");
            System.out.println("我叫 :"+name);
        }
    }
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Body(String name) {
        this.name = name;
    }
    //外部内的方法
    public void methodBody(){
        System.out.println("外部类的方法");
        new Heart().beat();//匿名对象
    }
}
public class Democlass {
    public static void main(String[] args) {
        Body body=new Body("张三");//外部内的对象
        body.methodBody();
        // 外点内 new外点new内
         Body.Heart heart=new Body("张三").new Heart();
         heart.beat();
    }
}

三、内部类重名的问题

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

public class Outer {
    int num=10;//外部内的成员变量
    public  class Inner{
        int num=20;// 内部类的成员变量
        public void methodInner(){
            int num=30;
            System.out.println(num);//30内部类方法的局部变量
            System.out.println(this.num);//20内部类的成员变量
            System.out.println(Outer.this.num);//10外部类的成员变量
        }
    }
}
public class InnerClass {
    public static void main(String[] args) {
        Outer.Inner obj=new Outer().new Inner();
        obj.methodInner();
    }
}

四、局部类的定义

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

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

定义格式:
 修饰符 class 外部类名称 {
        修饰符  返回值类型 外部内方法名称(参数列表){
             class 局部内部类名称{
             //……
             }
        }
 }
public class Outer {
    public  void  methodOuter(){
        class Inner{//局部内部类
            int num=10;
            public void methodInner(){
                System.out.println(num);
            }
        }
        Inner inner=new Inner();
        inner.methodInner();
    }
}
public class demo05 {
    public static void main(String[] args) {
        Outer obj=new Outer();
        obj.methodOuter();
    }
}

类的权限修饰符:public 》protected 》(default)》private

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

1、外部类:public/(default)

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

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

五、局部内部类的final问题

  • 局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是【有效final的】
  • 从Java8+开始,只要局部变量事实不变 那么final关键字可以省略

原因:

1、new出来的对象在对内存当中

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

3、方法运行结束后,立刻出栈,局部变量就会立刻消失

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

public class MyOuter {
    public  void methodOuter(){
     int num=10;
        class MyInner{
            public  void methodInner(){
                System.out.println(num);
            }
        }
    }
}

六、匿名内部类

✅如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况下就可以省略掉该类的定义,而改为使用【匿名内部类】

匿名内部类的定义格式:

接口名称 对象名=new 接口名称(){
 //覆盖 重写所有抽象方法
};

匿名内部类的注意事项:

1、new代表创建对象的动作

2、接口名称就是匿名内部需要实现哪个接口

3、{……}这才是匿名内部的内容

另外还要注意几点问题:

1、匿名内部类在创建对象的时候,只能使用唯一的一次。如果希望多次创建对象,而且类的内容一样的话,那么就必须使用单独定义的实现类了。

2、匿名对象,在调用方法的时候,只能调用唯一的一次,如果希望同一个对象调用多次方法,那么必须给对象起个名字。

3、匿名内部类是省略了实现类/子类名称,但是匿名对象是省略了对象名


相关文章
|
2月前
|
Java
java基础(8)数据类型的分类
Java数据类型分为基本数据类型(8种)和引用数据类型。基本类型包括byte, short, int, long, float, double, boolean, char。每种类型有固定占用空间大小,如int占用4字节。字符编码如ASCII和Unicode用于将文字转换为计算机可识别的二进制形式。
68 2
|
2月前
|
存储 Java
java基础(7)变量以及变量的分类
Java变量是内存中存储数据的基本单元,包含数据类型、名称和字面值。变量的数据类型决定了分配的内存空间大小。变量声明格式为“数据类型 变量名;”,变量名应符合标识符命名规范。变量可以重新赋值,但数据类型需一致。变量可以一行声明多个,作用域决定了变量的可用范围。变量分为局部变量和成员变量,局部变量定义在方法体内,成员变量定义在方法体外、类体内。
40 2
|
3月前
|
Java 程序员
Java中的继承和多态:理解面向对象编程的核心概念
【8月更文挑战第22天】在Java的世界中,继承和多态不仅仅是编程技巧,它们是构建可维护、可扩展软件架构的基石。通过本文,我们将深入探讨这两个概念,并揭示它们如何共同作用于面向对象编程(OOP)的实践之中。你将了解继承如何简化代码重用,以及多态如何为程序提供灵活性和扩展性。让我们启程,探索Java语言中这些强大特性的秘密。
|
14天前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
29 1
|
1月前
|
Java
让星星⭐月亮告诉你,Java异常分类[Throwable(Error/Exception(RuntimeException/其他异常)) 检查时异常 非检查时异常]
本文深入解析了Java异常处理机制,重点介绍了`Throwable`类及其子类`Error`和`Exception`,并通过实例代码、流程图和表格详细解释了异常的分类、区别及处理方法,帮助读者掌握异常处理的关键技巧,提升程序的稳定性和健壮性。
46 1
|
27天前
|
Java
Java 中 IO 流的分类详解
【10月更文挑战第10天】不同类型的 IO 流具有不同的特点和适用场景,我们可以根据具体的需求选择合适的流来进行数据的输入和输出操作。在实际应用中,还可以通过组合使用多种流来实现更复杂的功能。
43 0
|
2月前
|
存储 安全 Java
Java 常用集合分类
Java 常用集合分类
26 3
|
2月前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
1月前
|
存储 Java
Java集合的分类
Java集合的分类
16 0
|
1月前
|
Java 编译器
【Java】内部类
【Java】内部类
20 0