JAVA宝典---理论知识(理解记忆)

一、如何实现在main()方法执行前输出“hello world”?

        在Java语言中,由于静态块在类被加载时就会被调用,因此可以在main()方法执行前,利用静态块实现输出“Hello World”的功能

二、java程序初始化的顺序是怎样的?

        Java程序的初始化一般遵循3个原则(优先级依次递减):

1)静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次。

2)父类优先于子类进行初始化。

3)按照成员变量的定义顺序进行初始化。即使变量定义散布于方法定义之中,它们依然在任何方法(包括构造函数)被调用之前先初始化。

        Java程序初始化工作可以在许多不同的代码块中来完成(例如静态代码块、构造函数等),它们执行的顺序如下:父类静态变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数。

三、java中作用域有那些?

        在Java语言中,变量的类型主要有3种:成员变量、静态变量和局部变量。

1)类的成员变量的作用范围与类的实例化对象的作用范围相同,当类被实例化时,成员变量就会在内存中分配空间并初始化,直到这个被实例化对象的生命周期结束时,成员变量的生命周期才结束。

2)被static修饰的成员变量被称为静态变量或全局变量,与成员变量不同的是,静态变量不依赖于特定的实例,而是被所有实例所共享,也就是说,只要一个类被加载,JVM就会给类的静态变量分配存储空间。因此,就可以通过类名和变量名来访问静态变量。

3)局部变量的作用域与可见性为它所在的花括号内。

四、一个java文件中是否可以定义多个类?

        一个Java文件中可以定义多个类,但是最多只能有一个类被public修饰,并且这个类的类名与文件名必须相同,若这个文件中没有public的类,则文件名随便是一个类的名字即可。需要注意的是,当用javac指令编译这个.java文件时,它会给每一个类生成一个对应的.class文件

五、什么是构造函数?

        构造函数是一种特殊的函数,用来在对象实例化时初始化对象的成员变量。在Java语言中,构造函数具有以下特点。

1)构造函数必须与类的名字相同,并且不能有返回值(返回值也不能为void)。

2)每个类可以有多个构造函数。当开发人员没有提供构造函数时,编译器在把源代码编译成字节码的过程中会提供一个没有参数默认的构造函数,但该构造函数不会执行任何代码。如果开发人员提供了构造函数,那么编译器就不会再创建默认的构造函数了。

3)构造函数可以有0个、1个或1个以上的参数。

4)构造函数总是伴随着new操作一起调用,且不能由程序的编写者直接调用,必须要由系统调用。构造函数在对象实例化时会被自动调用,且只运行一次;而普通的方法是在程序执行到它时被调用,且可以被该对象调用多次。

5)构造函数的主要作用是完成对象的初始化工作。

6)构造函数不能被继承,因此,它不能被覆盖,但是构造函数能够被重载,可以使用不同的参数个数或参数类型来定义多个构造函数。

7)子类可以通过super关键字来显式地调用父类的构造函数,当父类没有提供无参数的构造函数时,子类的构造函数中必须显式地调用父类的构造函数。如果父类提供了无参数的构造函数,此时子类的构造函数就可以不显式地调用父类的构造函数,在这种情况下编译器会默认调用父类提供的无参数的构造函数。当有父类时,在实例化对象时会先执行父类的构造函数,然后执行子类的构造函数。

8)当父类和子类都没有定义构造函数时,编译器会为父类生成一个默认的无参数的构造函数,给子类也生成一个默认的无参数的构造函数。此外,默认构造器的修饰符只跟当前类的修饰符有关(例如,如果一个类被定义为public,那么它的构造函数也是public)。

六、为什么java中有些接口没有任何方法?

        由于Java不支持多重继承,即一个类只能有一个父类,为了克服单继承的缺点,Java语言引入了接口这一概念。接口是抽象方法定义的集合(接口中也可以定义一些常量值),是一种特殊的抽象类。接口中只包含方法的定义,没有方法的实现。接口中的所有方法都是抽象的。接口中成员的作用域修饰符都是public,接口中的常量值默认使用public static final修饰。由于一个类可以实现多个接口,因此通常可以采用实现多个接口的方式来间接达到多重继承的目的。

        在Java语言中,有些接口内部没有声明任何方法,也就是说,实现这些接口的类不需要重写任何方法,这些没有任何方法声明的接口又被叫做标识接口,标识接口对实现它的类没有任何语义上的要求,它仅仅充当一个标识的作用,用来表明实现它的类属于一个特定的类型。这个标签类似于汽车的标志图标,每当人们看到一个汽车的标志图标时,就能知道这款汽车的品牌。Java类库中已存在的标识接口有Cloneable和Serializable等。在使用时会经常用instan-ceof来判断实例对象的类型是否实现了一个给定的标识接口。

七、java中clone方法有什么作用?(含深复制 和 浅复制)

八、什么是反射机制?

九、package有什么作用?

十、如何实现类似于C语言中函数指针功能?


        在C语言中,有一个非常重要的概念——函数指针,其最重要的功能是实现回调函数。什么是回调函数呢?所谓回调函数,就是指函数先在某处注册,而它将在稍后某个需要的时候被调用。在Windows系统中,开发人员想让系统动态链接库(Dynamic Link Library,DLL)调用自己编写的一个方法,于是利用DLL当中回调函数的接口来编写程序,通过传递一个函数的指针来被调用,这个过程就称为回调。

        回调函数一般用于截获消息、获取系统信息或处理异步事件。举个简单例子,程序员编写了一段程序a,其中预留有回调函数接口,并封装好了该程序。程序员薛鹏要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调属于自己的程序b中的那个方法。


        函数指针一般作为函数的参数来使用,开发人员在使用时可以根据自己的需求传递自定义的函数来实现指定的功能,例如,在实现排序算法时,可以通过传递一个函数指针来决定两个数的先后顺序,从而最终决定该算法是按升序还是降序排列。
        在Java语言中没有指针的概念,那么如何才能在Java语言中实现类似于函数指针的功能呢?可以利用接口与类来实现同样的效果。具体而言,应先定义一个接口,然后在接口中声明要调用的方法,接着实现这个接口,最后把这个实现类的一个对象作为参数传递给调用程序,调用程序通过这个参数来调用指定的函数,从而实现回调函数的功能

        假如定义了一个用来比较大小的接口IntCompare,这个接口实际上充当了C语言中函数指针的功能,在使用时,开发人员可以根据实际需求传入自定义的类。假设分别有两个类Cmp1和Cmp2都实现了这个接口,分别用来在实现升序排序和降序排序时使用。其实这也是策略设计模式所用到的思想。

猜你喜欢

转载自blog.csdn.net/weixin_64428129/article/details/130641784