专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java面试整理-JavaSE(2)(java面试数据查找)

temp10 2024-10-10 12:13:42 java教程 11 ℃ 0 评论

反射机制(低)

在我刚开始学Java的时候,大家都很难理解反射这个概念,在实际开发中,虽然都有反射的踪影,但感觉自己又能理解是的。反射机制是指在程序运行时,对任意一个类都能获取其所有属性和方法,并且对任意一个对象都能调用其任意一个方法。

反射的步骤如下:

Java面试整理-JavaSE(2)(java面试数据查找)

1. 获取想要操作的类的Class对象,该Class对象是反射的核心,通过它可以调用类的任意方法。

2. 调用Class对象所对应的类中定义的方法,这是反射的使用阶段。

3. 使用反射API来获取并调用类的属性和方法等信息。

我个人观点,反射这个概念,在一些框架/工具封装的时候,会经常用到,大家使用第三方Jar包的时候,可以点击里面的源码去看看,在里面就可以发现很多反射的踪影。

此时,可能有部分朋友会有这个疑问,反射和new有什么区别?

我个人觉得主要区别在于这些地方:

1. 从整体效果来说,其实两者都是差不到,都是能获取对象。

2. new对象,是无法调用该类的私有的东西,但反射是可以的。

3. new对象,属于静态编译,即在你启动程序时,就把这个对象加载进来;反射是动态编译,只有运行到这个代码时,才会获取对象。

4. 动态编译速度快,而且还可以节省系统资源,特别是一些框架(如Spring)应用场景会更丰富,没有局限性。当然,也会导致我们使用过程中,会稍微复杂一些。

内部类(低)

从字面很容易清楚内部类的意思,定义在类内部的类就叫做内部类,但根据不同的定义方式,又可以分为静态内部类、成员内部类、局部内部类和匿名内部类。

静态内部类

我们新建一个类(StaticInnerDemo1)

package com.ispeasant.innerclass;

/**
 * 静态内部类
 */
public class StaticInnerDemo1 {
    // 定义一个静态内部类
    public static class StaticIC {
        // 定义一个方法,方便测试
        public void speak() {
            System.out.println("StaticIC.speak");
        }
    }

    public static void main(String[] args) {
        StaticIC staticIC = new StaticIC();
        staticIC.speak();
    }
}

运行结果如下:

StaticIC.speak

证明,StaticInnerDemo1类是可以调用静态内部类StaticIC的方法speak()。那我们测试一下,再新建一个类,看能不能调用StaticInnerDemo1类里的静态内部类StaticIC的方法speak()。

package com.ispeasant.innerclass;

/**
 * 测试“能不能调用StaticInnerDemo1类里的静态内部类StaticIC的方法speak()”
 */
public class StaticInnerDemo2 {
    public static void main(String[] args) {
        StaticInnerDemo1.StaticIC staticIC = new StaticInnerDemo1.StaticIC();
        staticIC.speak();
    }
}

运行结果如下:

StaticIC.speak

因此可以证明,其它类也可以调用这个静态内部类的方法,不过调用方式和内部调用有点区别,是需要通过“外部类.静态内部类”的方式进行调用。

漏了一种情况没有测试,就是静态内部类能否调用外部的变量和方法,我们修改一下之前的代码看看:

package com.ispeasant.innerclass;

/**
 * 静态内部类
 */
public class StaticInnerDemo1 {
    // 定义一个变量,看看静态内部类能否调用
    private static String info = "外部变量";

    // 定义一个方法,看看静态内部类能否调用。
    public static void printInfo(){
        System.out.println(info);
    }

    // 定义一个静态内部类
    public static class StaticIC {
        // 定义一个方法,方便测试
        public void speak() {
            System.out.println("StaticIC.speak");
        }
        public void getInfo(){
            System.out.println(info);
            printInfo();
        }
    }

    public static void main(String[] args) {
        StaticIC staticIC = new StaticIC();
        staticIC.speak();
        staticIC.getInfo();
    }
}

运行结果如下:

StaticIC.speak
外部变量
外部变量

证明也是可以调用,但由于是静态内部类,这个变量也是必须static修饰。

总结:静态内部类可以访问外部类的静态变量和方法,静态内部类通过“外部类.静态内部类”的方式来调用。

成员内部类

我个人觉得成员内部类和静态内部类的区别,主要在于“静态”两个字,对应用场景多了一点点限制,其余使用方式都差不多。

package com.ispeasant.innerclass;

/**
 * 成员内部类
 */
public class MemberInnerDemo1 {
    // 定义一个变量,看看成员内部类能否调用
    private String info = "外部变量";
    // 定义一个变量,看看成员内部类能否调用
    private static String info2 = "静态外部变量";

    // 成员内部类
    public class MemberID {
        public void speak(){
            System.out.println("MemberID.speak");
            System.out.println(info);
            System.out.println(info2);
        }

    }

}

局部内部类

指的是定义在方法中的类叫作局部内部类,意思比前面两种更局部,这个就没什么好介绍的。

匿名内部类

匿名内部类,会相对复杂一些。但这个也是用得比较多,特别是在一些开源框架里,经常都可以看到。建议大家还是需要认真消化一下,理解其中的原理和过程。

匿名内部类,是指通过继承一个父类或者实现一个接口的方式直接定义并使用的类。

先创建一个抽象类:

package com.ispeasant.innerclass;

/**
 * 匿名内部类(抽象类)
 */
public abstract class AnonymousInnerDemo1 {
    private String info;

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }
    public abstract String printInfo();
}

再新建一个类来测试验证:

package com.ispeasant.innerclass;

/**
 * 测试匿名内部类
 */

public class AnonymousInnerDemo2 {
    public void testAID(AnonymousInnerDemo1 aid){
        System.out.println(aid.getInfo());
        System.out.println(aid.printInfo());
    }

    public static void main(String[] args) {
        AnonymousInnerDemo2 anonymousInnerDemo2 = new AnonymousInnerDemo2();
        anonymousInnerDemo2.testAID(new AnonymousInnerDemo1() {
            @Override
            public String printInfo() {
                return "printInfo";
            }

            public String getInfo(){
                return "匿名内部类";
            }
        });
    }

}

运行效果如下:

匿名内部类
printInfo

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表