详解Java内部类与对象的打印概念和流程

目录
  • 一、内部类的概念
  • 二、内部类的分类
  • 三、成员内部类
    • 1、普通内部类
    • 2、静态内部类
  • 四、局部内部类
  • 五、对象的打印

一、内部类的概念

在 Java 中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。内部类也是封装的一种体现。

public class OutClass {//外部类
    class InnerClass{//内部类

    }
}

注意事项:

1、内部类一定是定义在class 类名{}之中的类,定义在class 类名{}之外的,哪怕是在一份文件中,也并不能称为内部类。例如:

public class A{
}
class B{
}
//A和B两个类是独立的,无内外部类一说

2、内部类和外部类共用同一个java源文件,但是经过编译之后,内部类会形成单独的字节码文件。

二、内部类的分类

public class OutClass {
    //普通内部类
    class InnerClass1{

    }
    //静态内部类
    static class InnerClass2{

    }
    {
        //定义在实例代码块中的 局部内部类
        class InnerClass3{

        }
    }
    static{
        //定义在静态代码块中的 局部内部类
        class InnerClass4{

        }
    }
    public void method(){
        //定义在方法中的 局部内部类
        class InnerClass5{

        }

        {
            //方法中的普通代码块中也可以定义局部内部类
            class InnerClass6{

            }
        }
    }
}

根据内部类定义的位置不同,可以分为:

成员内部类:普通内部类和静态内部类。

局部内部类和匿名内部类。

三、成员内部类

1、普通内部类

未被static修饰的成员内部类。

public class OutClass {//外部类
    private int a;
    private int b;
    private int c;

    public void method1(){
        a=100;
        System.out.println(a);
    }

    public void method2(){
        System.out.println(b);
    }

    class InnerClass{      //普通内部类
        private int c;     //与外部类成员变量名称相同的内部成员变量
        public void methodInner() {
            //在内部类中可以直接访问外部类任意限定符的成员变量和方法
            b = 150;
            method1();
            method2();

            //在访问与外部类成员名称相同的成员时,优先访问内部类自己的成员
            c = 300;
            System.out.println(c);
            //要访问外部类中的同名成员必须使用——— 外部类名.this.成员名  来访问
            OutClass.this.c = 400;
            System.out.println(OutClass.this.c);
        }
    }
    public static void main(String[] args) {
        //创建内部类对象
        OutClass.InnerClass innerclass1=new OutClass().new InnerClass();
        //也可以先创建外部类对象,再创建内部类对象
        OutClass outclass=new OutClass();
        //注意当在不同文件中创建其内部类对象一定需要加上该内部类的外部类名,同一文件下可加可不加
        OutClass.InnerClass innerclass2=outclass.new InnerClass();
        innerclass2.methodInner();
    }
}

/*
100
150
300
400
*/

注意事项:

1、普通内部类中可以直接访问外部类中的所有方法。

2、普通内部类成员的位置与外部类成员位置相同,都受public,private等限定符的限制。

3、在普通内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this.同名成员 来访问。

4、要创建普通内部类对象,要先创建外部类的对象。在创建内部类对象时,如果该内部类在当前文件,则在创建对象语句最前面不需要外部类名,如果在不同文件,那么一定要指明该内部类的外部类名。

5、 普通内部类中包含了一个指向外部类对象的引用。

6、外部类中,不能直接访问内部类中的成员,如果要访问必须先要创建内部类的对象。

public class OutClass1 {
    private int a;

    public void method(){
        System.out.println(c); //在外部类中直接访问内部类成员,编译报错
    }

    class InnerClass{
        private int c;
    }
}
public class OutClass1 {
    private int a;
    public void methodOut(){
        InnerClass I2=new InnerClass();//在外部类方法中创建内部类对象可以直接创建
        System.out.println(I2.c);
    }
    class InnerClass{
         private int c;
    }
}

从堆和栈的角度来看内部类和外部类:

2、静态内部类

被static修饰的成员内部类称为静态内部类。

public class OutClass {//外部类
    private int a;
    static int b;      //静态变量

    public void method1(){

    }
    public static void method2(){  //静态方法

    }

    static class InnerClass{       //静态内部类
        public void methodInner() {
            //在静态内部类中只能访问外部类的静态成员和方法
            //  a=100;编译失败,a不是外部类的成员变量
            b = 150;
            //  method1();编译失败,method1不是外部类的成员方法
            method2();
        }
    }
    public static void main(String[] args) {
        //静态内部类的创建
        InnerClass innerclass=new InnerClass();
        //成员访问
        innerclass.methodInner();
    }
}

注意事项:

1、在内部类中只能访问外部类中的静态成员。

2、创建静态内部类对象时,不需要先创建外部类对象。

3、成员内部类,经过编译之后会生成自己独立的字节码文件,例如下:

四、局部内部类

定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用。

public class OutClass {//外部类
     int a=10;

    public void method(){              //外部类方法
        int b=10;
        class InnerClass{              //局部内部类,只能在该方法体内部使用
            public void methodInnerClass(){
                System.out.println(a);
                System.out.println(b);
            }
        }
        InnerClass innerclass=new InnerClass();
        innerclass.methodInnerClass();
    }
    public static void main(String[] args) {
        //InnerClass innerclass=null; 编译失败
    }
}

注意事项:

1、局部内部类只能在所定义的方法体内部使用。

2、局部内部类不能被public、static等限定符修饰。

3、同样编译之后局部内部类会生成自己的字节码文件。

命名格式:外部类名$x内部类名.class, 其中x是一个整数。

五、对象的打印

public class Person {
    String name;
    String gender;
    int age;

    public Person(String name,String gender,int age){
        this.name=name;
        this.gender=gender;
        this.age=age;
    }

    public static void main(String[] args) {
        Person person=new Person("luka","man",21);
        System.out.println(person);
    }
}

打印结果: 并不是对象本身。

如果想要打印对象本身,那么需要重写toString方法。

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
 public String toString() {           //重写了toString方法
        return "[" + name + "," + gender + "," + age + "]";
    }
public class Person {
    String name;
    String gender;
    int age;

    public Person(String name,String gender,int age){
        this.name=name;
        this.gender=gender;
        this.age=age;
    }

    public String toString() {           //重写了toString方法
        return "[" + name + "," + gender + "," + age + "]";
    }

    public static void main(String[] args) {
        Person person=new Person("luka","man",21);
        System.out.println(person);
    }
}

/*
执行结果:
[luka,man,21]
*/

到此这篇关于详解Java内部类与对象的打印概念和流程的文章就介绍到这了,更多相关Java 内部类内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java基础之匿名内部类、包装类

    目录 1.匿名内部类 2.Object类简介 2.1 取得对象信息toString() 2.2 对象的比较equals() 2.3 Object接口引用数据类型 3.包装类 3.1 装箱与拆箱 3.2 字符串与基本数据类型的转换 3.3 包的定义 3.4 包的导入 4.访问控制权限 5.jar命令 1.匿名内部类 内部类:在一个类的内部定义了另外的类,称为内部类,匿名内部类指的是没有名字的内部类.为了清楚内部类的主要作用,下面首先观察一个代码. interface IMessage{ publi

  • 全面探究 Java 内部类

    目录 一. 实例内部类 1. 定义 2. 如何获取实例内部类这个对象的引用 3. 注意事项 二. 静态内部类 1. 定义 2. 如何获取静态内部类这个对象的引用 3. 注意事项 三. 匿名内部类 1. 定义 2. 常见用法 3. 注意事项 内部类(inner class)是定义在另一个类中的类.为什么要使用内部类呢?主要有两个原因:1.内部类可以对同一个包中的其他类隐藏.2.内部类方法可以访问定义这个类的作用域中的数据,包括原本私有的数据. 下面,我就来带领大家去学习Java中比较常见的几种内部

  • Java面向对象之内部类案例讲解

    1. 内部类 很多时候我们创建类的对象的时候并不需要使用很多次,每次只使用一次,这个时候我们就可以使用内部类了 1.1 内部类概述 内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了. 内部类不是在一个java源文件中编写俩个平行的俩个类,而是在一个类的内部再定义另外一个类. 我可以把外边的类称为外部类,在其内部编写的类称为内部类. 内部类分为四种: 成员内部类 静态内部类 局部内部类 匿名内部类 1.2 成员内部类(

  • JAVA抽象类,接口,内部类详解

    目录 一.内容 抽象类 抽象方法与抽象类 抽象类的使用 接口 接口的概念 接口的定义 接口中的成员变量 接口中的方法 接口的继承 接口的实现/使用 接口与抽象类的差异 面向接口编程 内部类 非静态内部类 静态内部类 局部内部类 匿名内部类 总结 一.内容 抽象类 当编写一个类时,常常会为该类定义一些方法,这些方法用于描述这个类的行为.但在某些情况下只需要定义出一些方法,而不需要具体的去实现这些行为.也就是说这些方法没有方法体,只是一些签名而已,这样的方法被称为抽象方法,包含抽象方法的类被称为抽象

  • Java中内部类的概念与分类详解

    目录 内部类概念 内部类的分类: 成员内部类 普通内部类 静态内部类 局部内部类 总结 只能使用修饰限定符:public 和 默认 来修饰类 内部类概念 在 Java 中,将一个类定义在另一个类的内部,称为内部类 就是在一个类内部进行其他类结构的嵌套操作 内部类也是封装的一种体现 举例: //外部类 public class OutClass { //内部类 class InnerClass{ } } 注意:内部类和外部类共享一个 java源文件,但是经过编译之后,会形成各自单独的字节码文件 内

  • 详解Java内部类与对象的打印概念和流程

    目录 一.内部类的概念 二.内部类的分类 三.成员内部类 1.普通内部类 2.静态内部类 四.局部内部类 五.对象的打印 一.内部类的概念 在 Java 中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类.内部类也是封装的一种体现. public class OutClass {//外部类 class InnerClass{//内部类 } } 注意事项: 1.内部类一定是定义在class 类名{}之中的类,定义在class 类名{}之外的,哪怕是在一份文件中,也并不

  • 详解Java内部类——匿名内部类

    今天来看看另一个更加神奇的类--匿名内部类. 就像它的名字表示的那样,这个类是匿名的,用完之后,深藏功与名,就像扫地僧那样默默潜藏于深山之中.匿名内部类不仅没有名字,连class关键字都省掉了,而且匿名内部类必须继承于某个类或者实现某个接口,长的就像这样: new 父类(参数列表)|实现接口() { //匿名内部类的内部定义 } 来看一个栗子: public abstract class Human { public abstract void walk(); } 这是一个抽象类,如果使用匿名内

  • 详解Java编程中对象的序列化

    1. 什么是Java对象序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长.但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象.Java对象序列化就能够帮助我们实现该功能. 使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象.必须注意地是,对象序列化保存的是对象的"状态",

  • 详解java内部类的访问格式和规则

    1.内部类的定义 定义一个类来描述事物,但是这个事物其中可能还有事物,这时候在类中再定义类来描述. 2.内部类访问规则 ①内部类可以直接访问外部类中的成员,包括私有. 之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用 格式:外部类名.this ②外部类要访问内部类,必须建立内部类对象. 3.访问格式 ①当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中.可以直接建立内部类对象. 外部类名.内部类名 变量名 = 外部类对象.内部类对象; Outer.Inner

  • 详解Java 中的嵌套类与内部类

    详解Java 中的嵌套类与内部类 在Java中,可以在一个类内部定义另一个类,这种类称为嵌套类(nested class).嵌套类有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类较少使用,非静态嵌套类使用较多,也就是常说的内部类.其中内部类又分为三种类型: 1.在外部类中直接定义的内部类. 2.在函数中定义的内部类. 3.匿名内部类. 对于这几种类型的访问规则, 示例程序如下: package lxg; //定义外部类 public class OuterClass { //外部类静态成员变量

  • 详解java 对象锁与类锁

    一.什么是对象锁 对象锁也叫方法锁,是针对一个对象实例的,它只在该对象的某个内存位置声明一个标识该对象是否拥有锁,所有它只会锁住当前的对象,而并不会对其他对象实例的锁产生任何影响,不同对象访问同一个被synchronized修饰的方法的时候不会阻塞, 例如: public class MyObject { private synchronized void method1(){ try { System.out.println(Thread.currentThread().getName());

  • 详解Java对象的内存布局

    前言 今天来讲些抽象的东西 -- 对象头,因为我在学习的过程中发现很多地方都关联到了对象头的知识点,例如JDK中的 synchronized锁优化 和 JVM 中对象年龄升级等等.要深入理解这些知识的原理,了解对象头的概念很有必要,而且可以为后面分享 synchronized 原理和 JVM 知识的时候做准备. 对象内存构成 Java 中通过 new 关键字创建一个类的实例对象,对象存于内存的堆中并给其分配一个内存地址,那么是否想过如下这些问题: 这个实例对象是以怎样的形态存在内存中的? 一个O

  • 详解Java中static关键字和内部类的使用

    目录 一. static 关键字 1. static修饰成员变量 2. static修饰成员方法 3. static成员变量的初始化 二. 内部类 1. 实例内部类 2. 静态内部类 3. 局部内部类 4. 匿名内部类 一. static 关键字 在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的. 1. static修饰成员变量 static修饰的成员变量,称为静态成员变量 [静态成员变量特性]: 不属于某个具体的对象,是类的属

  • Java 详解垃圾回收与对象生命周期

    Java 垃圾回收与对象生命周期详解 Java中的垃圾回收与对象生命周期 1. 垃圾回收 垃圾回收是Java程序设计中内存管理的核心概念,JVM的内存管理机制被称为垃圾回收机制. 一个对象创建后被放置在JVM的堆内存中,当永远不再引用这个对象时,它将被JVM在堆内存中回收.被创建的对象不能再生,同时也没有办法通过程序语句释放它们.即当对象在JVM运行空间中无法通过根集合到达(找到)时,这个对象被称为垃圾对象.根集合是由类中的静态引用域与本地引用域组成的.JVM通过根集合索引对象. 在做Java应

  • 详解Java对象的强、软、弱和虚引用+ReferenceQueue

    详解Java对象的强.软.弱和虚引用+ReferenceQueue 一.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题. 二.软引用(SoftReference) 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它:如果内存空间不足了,就会回收这些对象的内存.只要垃圾回

随机推荐