首页 > 其他分享 >2023年5月22日,内部类,类加载机制

2023年5月22日,内部类,类加载机制

时间:2023-05-24 19:03:41浏览次数:38  
标签:内部 22 Inner class inner 2023 Outter public 加载

内部类

1. 成员内部类

package outter_inner_01;
import outter_inner_01.Outter.Inner;
public class test01 {
    /**
     * 知识点:成员内部类
     *
     * 需求:创建成员内部类的对象,并调用其方法
     *
     * 小结:
     * 		1.外部类和内部类不属于继承关系
     * 		2.创建成员内部类对象,必须先创建外部类对象
     * 		3.在成员内部类中可以调用外部类所有的属性
     */
    public static void main(String[] args) {
        Inner inner = new Outter().new Inner();
        inner.method();
    }
}
package outter_inner_01;

//外部类
public class Outter {

    private 	String str1 = "属性1";
    String str2 = "属性2";
    protected 	String str3 = "属性3";
    public 		String str4 = "属性4";
    final 		String str5 = "属性5";
    static 		String str6 = "属性6";
    static final String str7 = "属性7";

    //成员内部类
    class Inner{

        String str1 = "内部类属性";

        public void method(){
            System.out.println("成员内部类");
            System.out.println(str1);

            //Outter.this 表示外部类对象
            System.out.println(Outter.this.str1);
            System.out.println(str2);//Outter.this.str2
            System.out.println(str3);//Outter.this.str3
            System.out.println(str4);//Outter.this.str4
            System.out.println(str5);//Outter.this.str5
            System.out.println(str6);//Outter.str6
            System.out.println(str7);//Outter.str7
        }
    }

}

2023年5月22日,内部类,类加载机制_成员内部类

2. 静态内部类

  1. 静态内部类只能调用外部类的静态属性
  2. 创建静态内部类的对象时,不需要创建外部类对象
package outter_inner_02;
import outter_inner_02.Outter.Inner;

public class test01 {
    /**
     * 知识点:静态内部类
     *
     * 需求:创建静态内部类的对象,并调用其方法
     *
     * 小结:
     * 		1.静态内部类只能调用外部类的静态属性
     * 		2.创建静态内部类对象时,不需要创建外部类对象
     */
    public static void main(String[] args) {

        Inner inner = new Outter.Inner();
        inner.method();

    }
}
package outter_inner_02;

//外部类
public class Outter {

    static 		String str1 = "属性6";
    static final String str2 = "属性7";

    //静态内部类
    static class Inner{

        public void method(){
            System.out.println("静态内部类");
            System.out.println(str1);//Outter.str1
            System.out.println(str2);//Outter.str2
        }
    }

}

2023年5月22日,内部类,类加载机制_内部类_02

3. 接口内部类

接口内部类的使用创建方式和静态内部类的一至(public、static)

package outter_inner_03;
import outter_inner_03.Outter.Inner;
public class test01 {
    /**
     * 知识点:接口内部类
     *
     * 需求:创建接口内部类的对象,并调用其方法
     *
     * 小结:
     * 		接口内部类的创建方式和静态内部类的方式一致
     */
    public static void main(String[] args) {

        Inner inner = new Outter.Inner();
        inner.method();

    }
}
package outter_inner_03;

public interface Outter {
    class Inner{
        public void method(){
            System.out.println("接口内部类");
        }
    }
}

2023年5月22日,内部类,类加载机制_内部类_03

4. 局部内部类

package outter_inner_04;

public class test01 {
    /**
     * 知识点:局部内部类
     *
     * 需求:调用局部内部类中的方法
     *
     * 小结:
     * 		局部内部类的作用范围在该方法中
     */
    public static void main(String[] args) {

        Outter outter = new Outter();
        outter.outMethod();
    }
}
package outter_inner_04;

public class Outter {
    public void outMethod(){

        //局部内部类
        class Inner{
            public void method(){
                System.out.println("局部内部类");
            }
        }

        //创建局部内部类的对象
        Inner inner = new Inner();
        //调用方法
        inner.method();
    }
}

2023年5月22日,内部类,类加载机制_成员内部类_04

5. 匿名内部类

1. new A() //抽象类
package outter_inner_05;

public class test01 {
    /**
     * 知识点:匿名内部类
     * 应用场景:A类(抽象类)的子类只创建一次时,就没必要创建子类,直接使用new A()即可。
     * @param args
     */
    public static void main(String[] args) {
        //创建的是匿名内部类的对象
        A a = new A(){

            @Override
            public void method() {

            }
        };
    }
}
package outter_inner_05;

public abstract class A {
    public abstract void method();
}
2. new I1() //接口
package outter_inner_06;

public class test01 {
    /**
     * 知识点:匿名内部类
     *应用场景:I1接口的实现类对象只创建一次,就没有必要直接创建实现类,直接使用匿名内部类
     * @param args
     */
    public static void main(String[] args) {
        I1 i1 = new I1() {
            @Override
            public void method() {

            }
        };
    }
}
package outter_inner_06;

public interface I1 {
    public void method();
}

总结

分类:

成员内部类 Outter$Inner.class

静态内部类 Outter$Inner.class

接口内部类 Outter$Inner.class

局部内部类 Outter$1Inner.class

匿名内部类 Test01$1.class

应用场景:

  • B类的对象只在A类中使用,并且B类使用到A类所有的属性,就可以将B类设置为A类的成员内部类
  • B类的对象只在A类中使用,并且B类使用到A类的静态属性,就可以将B类设置为A类的静态内部类
  • B类对象只在I1接口中使用,就可以将B类设置为I1接口的接口内部类
  • B类对象只在A类的method方法中使用,就可以将B类设置为A类method方法中的局部变量
  • 抽象类的子类或者接口的实现类只new了一次对象,就直接使用匿名内部类

类加载机制

初识类加载过程

使用某个类时,如果该类的class文件没有加载到内存时,则系统会通过以下三个步骤来对该类进行初始化

1.类的加载(Load) → 2.类的连接(Link) → 3.类的初始化(Initialize)

  • 类的加载(Load):将类的class文件读入内存,并为之创建一个java.lang.Class的对象,此过程由类加载器(ClassLoader )完成
  • 类的连接(Link):将类中的数据加载到各个内存区域中
  • 类的初始化(Initialize):JVM负责对类进行初始化

类的完整生命周期 :加载、连接(验证、准备、解析)、初始化、使用、卸载

标签:内部,22,Inner,class,inner,2023,Outter,public,加载
From: https://blog.51cto.com/u_15098423/6342568

相关文章

  • Exp8 Web安全 20202211 王宏韬
    目录一、实践内容二、基础问题(1)什么是表单(2)浏览器可以解析运行什么语言(3)WebServer支持哪些动态语言(4)防范注入攻击的方法有哪些三、总结体会四、实验过程(1)WEBHTML(2)WEBJAVASCRIPT(3)WEB后端MYSQL(4)WEB后端PHP(5)SQL注入(6)XSS(7)WEBGOATSQL注入......
  • 2022年第十四届四川省大学生程序设计大赛 A
    AAdjacentSwapping题意:给定一个字符串,每次可以移动相邻字符,求最小移动次数可以把它变成s+s这样左右两边相同的字符串。思路:1:我们知道他一定是偶数长度,所以我们把字符串分成两部分s1和s22:贪心的扫描一遍这个字符串,s1就是前一半,然后计算在满足这一般的时候他要移动多少次,即直......
  • sshpass报错 Permission denied, please try again.和 connect to host localhost po
    最近在做自动化时,自动化脚本用sshpass给远程机器发送命令(sshpass-p"123456"ssh-p10022root@localhost-oStrictHostKeyChecking=no"poweroff")报错:Permissiondenied,pleasetryagain.和 ssh:connecttohostlocalhostport10022:Connectionrefused   1.......
  • Shellcode分离加载实现免杀的两种方式(VT免杀率:1/68)
    简介本文详细介绍了如何通过文件加载和远程URL加载方式实现Shellcode分离加载,以规避安全软件的检测。文章首先描述了通过MetasploitFramework生成的shellcode文件加载的过程,并提供了相关的C++代码。为了避免被杀毒软件检测,利用动态API调用和lazy_importer项目进行代码优化。其......
  • 20230524_配置环境
    debhttp://mirrors.aliyun.com/ubuntu/bionicmainrestricteduniversemultiversedeb-srchttp://mirrors.aliyun.com/ubuntu/bionicmainrestricteduniversemultiversedebhttp://mirrors.aliyun.com/ubuntu/bionic-securitymainrestricteduniversemultivers......
  • 2023江西省省赛
    A.DrillWoodtoMakeFire问题的题意是:给定木材着火的临界值N,燧人氏的强度S和速度V,你能确定燧人氏是否能钻木取火?即满足条件为:s*v>=n。满足输出1,否则输出0.#include<bits/stdc++.h>usingnamespacestd;intmain(){intt,n,s,v;cin>>t;while(t--){......
  • SSRFmap-20230329
    Usage:ssrfmap.py[-h][-rREQFILE][-pPARAM][-mMODULES][-l[HANDLER]][-v[VERBOSE]][--lhostLHOST][--lportLPORT][--rfiles[TARGETFILES]][--uagentUSERAGENT][--ssl[SSL]][--proxyPROXY][--level[LEVEL]]选项:-h,--help显示此帮助......
  • LeetCode 222. 完全二叉树的节点个数
    classSolution{public:intcountNodes(TreeNode*root){if(!root)return0;autol=root->left,r=root->right;intx=1,y=1;//记录左右两边层数while(l)l=l->left,x++;while(r)r=r->right,y++;......
  • 2023.5.24-人件-5月份读后感2
    最近,我阅读了人件的下一部分,有了一些感想。过去,我对于办公环境的重视程度不够。假设除了现在的职责之外,还让你负责为手下提供办公环境和公益设施。你必须为每个人确定工作环境的种类、分配的开支总数等等,而你如何着手做这些事呢?在以后,可以更加重视办公的环境。过去,我认为加班是......
  • C/C++超市商品管理系统[2023-05-24]
    C/C++超市商品管理系统[2023-05-24]9、超市商品管理系统问题描述:设计并实现一个超市商品管理系统,商品需设置不同的类型,系统可以实现对商品信息的添加,修改,删除,查找等功能,商品信息需要以文件方式保存到计算机硬盘中。基本功能:(1)商品要设置不同的类型,如水果、饮料等;(2)商品信息包......