Java经典面试题整理(一)---后期会不断更新和补充

这篇文章后期会不断更新和补充,希望大家可以持续关注~

原整理链接

1. 关于Java main方法的核心面试问题

1.如果main方法被声明为私有,会发生什么?

可以通过编译,但运行时会报错。

将方法声明为私有方法将不会在类的外部显示,并且无法将该类作为独立的Java程序执行。 任何需要作为独立文件执行的java类都需要具有public,static的main方法并返回void。 否则,Java编译器不会将该文件识别为可执行的独立java文件,并且不允许您运行它。 如果你运行它,你会得到以下异常:
在这里插入图片描述
2.如果不提供String数组作为main方法的参数,会发生什么?

String [] args作为用于传入命令行参数的main方法中的参数。 要运行java程序,它应该有public static void main(String [] args)。

利用IDEA 2017无法正确编译,如下图所示。

在这里插入图片描述
3.我们可以重载main()方法吗?

当然你可以重载main方法,但是当你的类由JVM启动时,只会使用public static void main(String [] args)。

比如:

package com.ytt;

public class Main {
    
            public static void main(String[] args) {
                System.out.println("main(String[] args)");
            }

            public static void main(String arg1) {
                System.out.println("main(String arg1)");
            }

            public static void main(String arg1, String arg2) {
                System.out.println("main(String arg1, String arg2)");
            }

        }

输出结果,永远都是main(String[] args)。
在这里插入图片描述
你可以在遵守重载规则的前提下,调用自己重载的main()方法。

4.如果在命令行中没有提供任何参数,那么Main方法的String数组将为null或为空?

即使没有命令行参数,也始终传递String数组。 在那种情况下,数组的长度为0。

请参见下面的示例并自行测试:

package com.ytt;

public class Main {

            public static void main(String[] args) {
                if(args.length==0) {
                    System.out.println("args 为空");
                }

                if(args==null) {
                    System.out.println("args 为null");
                }

            }
        }

运行结果:
在这里插入图片描述
5.为什么main方法是静态的?

C ++中的main()方法,C#和Java是静态的,因为它们可以由运行时引擎调用,而不必实例化父类的实例。这就是Java语言的设计和Java虚拟机的设计和编写方式。

请参阅下面的Oracle Java语言规范所说的内容:

在完成示例类Test(在此期间可能发生其他相应的加载,链接和初始化)的初始化之后,调用Test的方法main。
方法main必须声明为public,static和void。 它必须接受一个字符串数组的参数。 此方法可以声明为

public static void main(String[] args)
or
public static void main(String… args) 

6.我们可以在没有main()方法的情况下执行程序吗?

如果没有main方法,则无法将java类作为应用程序运行,因为在运行时,java将搜索main方法并且找不到它会抛出异常。

在这里插入图片描述

7.如果从主方法的签名中删除静态修改器会发生什么?

程序可以通过编译,但是不能运行。

在这里插入图片描述

8.如果需要在java类中不使用main()方法 print “Welcome”。你会怎么做?

我已经看过很多次人们说是的,可以在没有使用静态块的主方法的情况下打印消息,并给出了程序序列的原因如下:

  • JVM加载类
  • 执行静态块
  • 寻找主要方法并调用它

如果你的类中有main方法,那么上面是完全正确的,但是如果你不提供main方法并尝试使用下面显示的静态方法运行程序,你会得到异常:

package com.how2java.test;
 
public class MainMethodTest {    

    static {
	System.out.println("Welcome");
    }   

}

9.是否应在所有Java类中强制声明main()方法?

这不是必需的。 只有当您想将java类用作应用程序并且想要独立运行时,才需要main()方法。

10. main()方法的返回类型是什么?

void,无返回值。

void返回值:因为主方法被JVM调用,该方法的返回值将返回给JVM,这没有任何意义,因此main()方法没有返回值。

11. main()方法的参数是什么?

如果在运行时传递值,那么将在String args []中作为参数填充,如果没有传递任何值,那参数就是空的。

12. main()方法可以声明为final吗?

是的,我们可以在main方法中声明final,JVM将会找到它,JVM匹配方法名称public static void main(String args)来运行程序。

13. main()方法中公共和静态声明的顺序是否重要?

不重要。

编译java类时,JVM首先检查类及其方法是否遵循java规范,并根据其规范提供编译错误以更正类定义。 根据java规范,所有方法都应该有返回类型,这应该在方法名称之后立即放置,然后它检查是否提到了任何访问说明符。 如果没有提到访问说明符,则它应用默认访问修饰符,该访问修饰符只能通过子类或相同的包访问。

它的设计易于编写类,它的方法也给程序员灵活性以减少错误,所以添加到编译器不受顺序或位置的影响。 您可以将访问修饰符放在第一个或第二个位置,同样也适用于static关键字。

14.是否可以覆盖main方法?

不可以,main是静态方法,不需要该类的实例,因此不需要多态行为。 您可以通过在子类中定义另一个静态main方法来隐藏它。

15.我们可以在同一个类别中使用多种主要方法吗?

只要方法参数(数字(或)类型)不同,我们就可以。 它被称为方法重载。

重载方法由传递给方法的参数的数量和类型区分。

重载方法由传递给方法的参数的数量和类型区分,只有单个String [](或)String …作为param的main方法将被视为程序的入口点。
16.一个应用程序可以有多个具有main方法的类吗?

当然可以。

在启动应用程序时,您需要提供需要运行的类名。 JVM将仅在给出其名称的类中查找Main方法,因此具有main方法的多个类之间不会发生任何冲突。

17. main方法中String数组的第一个参数是什么?

这取决于你如何运行你的程序。如果你传值了那第一个参数是main,如果没有,那就为空。

18.解释public static void main(String args [])的每个关键字?

public: public是一个Java关键字,它将成员的访问权限声明为public。 所有其他类都可以看到公共成员。 这意味着任何其他类都可以访问public字段或方法。 此外,除非将字段声明为final,否则其他类可以修改公共字段。

static: 静态成员属于类而不是特定实例。

这意味着即使您创建了十亿个类的实例,或者您没有创建任何实例,也只存在一个静态字段的实例。 它将由所有实例共享。

由于静态方法也不属于特定实例,因此它们不能引用实例成员。 静态成员只能引用静态成员。 实例成员可以访问静态成员。

注意:静态成员可以通过对象引用访问实例成员。

void: 方法返回的值的返回类型和数据类型,如果方法没有返回值,则返回void。

注意:Java中的所有方法都必须是一种返回类型。 void告诉JVM特定方法不会返回任何内容。

main(String args []): main只是方法的名称,args包含提供的命令行参数作为String对象的数组。

注意:args不一定必须命名为args(您可以随意命名) - 尽管最好遵循惯例。 您也可能会不时看到String … args,这是等效的。

2. Java抽象类的核心面试问题

1.如何定义Abstract类?

通过使用关键词abstract可以定义为抽象类。

2.什么是抽象类?

抽象类是使用关键字abstract声明的类,它可能包含也可能不包含抽象方法。 抽象类无法实例化,但可以进行子类化,即可以继承。

3.可以有一个没有抽象方法的抽象类吗?

是的,它可以包含或者不包含抽象方法。

4.我们可以实例化抽象类吗?

抽象类是一个声明为abstract的类 - 它可能包含也可能不包含抽象方法。抽象类无法实例化,但可以进行子类化。

5. Interface和Abstract类有什么区别?

  • 默认情况下,当您定义接口时,所有方法都是抽象的,并且无法定义其实现;但是在抽象类中,您可以使用默认实现来定义实例方法。

  • 接口只允许使用public,static和final修饰符变量;而抽象类允许所有修饰符用于变量。

  • 可以使用关键字“Implements”实现接口;抽象类可以使用关键词“extends”进行扩展。

  • 默认情况下,接口中的变量是用final修饰;Abstract类可以包含非final变量。

  • 默认情况下,接口的成员是public的,但是在Abstract类中,可以使用其他修饰符,例如private,public或protected。

  • 一个java类可以实现多个接口,但是java类只能扩展一个Abstract类。

  • 接口定义为抽象且无法实例化,Abstract类也无法实例化,但如果main方法可用,则可以调用。

6.何时使用抽象类或接口?

  1. 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本;
  2. 如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口;
  3. 如果要设计大的功能单元,则使用抽象类。如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类;
  4. 抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。

7.当声明方法抽象时,其他非抽象方法可以访问它吗?

正如我们在技术上所知,如果你定义抽象方法意味着你不能访问任何不存在的东西 - 但它允许调用。

8.什么是抽象类,有什么用?

点我看答案~

抽象类是一个声明为abstract的类 - 它可能包含也可能不包含抽象方法。 抽象类无法实例化,但可以进行子类化。

抽象方法是在没有实现的情况下声明的方法(没有大括号,后跟分号),

abstract void moveTo(double deltaX, double deltaY);

如果一个类包含抽象方法,那么该类本身必须被声明为abstract,如:

public abstract class GraphicObject {
// declare fields
// declare nonabstract methods
abstract void draw();
}

当抽象类被子类化时,子类通常为其父类中的所有抽象方法提供实现。 但是,如果没有,那么子类也必须声明为abstract。

用处:

  • 抽象类的主要目的是在子类中使用公共代码,但抽象类不应该有自己的实例。
  • 如果要为子项提供实现详细信息但不希望允许直接实例化类的实例(这允许您部分定义类),则抽象类非常适合。
  • 当你有一个要求,你的父类应该提供某些方法的默认实现,而其他方法应该被子类重写,使用抽象类。
  • 抽象类的目的是提供多个子类可以共享的父类的公共定义。
  • 抽象方法的使用方式与在接口中定义方法的使用方式相同。抽象类的设计者可以这样说:“我的任何子类都必须实现这个方法”。

9.你能声明抽象类final吗?

不,类既可以是抽象的,也可以是最终的,不能两者都是。

点我查看原回答

10.什么是抽象变量?

抽象类的概念是它们可以包含一些行为或数据,这些行为或数据需要所有子类都包含。想想WheeledVehicle的简单例子——它应该有一个numWheels成员变量。您希望所有子类都有这个变量。记住,抽象类在开发API时是非常有用的特性,因为它们可以确保扩展API的人不会破坏它。

11.你能创建抽象类的对象吗?

不能,抽象类无法实例化。

12.什么是抽象方法?

抽象方法是在没有实现的情况下声明的方法(没有大括号,后跟分号),

abstract void moveTo(double deltaX, double deltaY);

如果一个类包含抽象方法,那么该类本身必须被声明为abstract,如:

public abstract class GraphicObject {
   // declare fields
   // declare nonabstract methods
   abstract void draw();
}

当抽象类被子类化时,子类通常为其父类中的所有抽象方法提供实现。 但是,如果没有,那么子类也必须声明为abstract。

14.抽象方法可以没有抽象类吗?

不可以。

如果一个类包含抽象方法,那么该类本身必须声明为abstract。 详细解释参考上一个问题。

15.你能通过方法使用抽象和最终吗?

不能。 Abstract类中的抽象方法只能设置为一个可见性修饰符,public或protected。

16.你可以实例化抽象类吗?

抽象类是一个声明为abstract的类 - 它可能包含也可能不包含抽象方法。抽象类无法实例化, 但可以进行子类化。

17.我们可以不用方法编写抽象类吗。如果是的话这样做有什么用?

是。 空抽象类与接口非常相似,只不过它可以扩展一个类:

package com.javahonk;

abstract class AbstractClass // extends anotherClass implements anInterface
{

}

interface TestInterface // extends anotherInterface
{

}

这种模式称为标记接口。我们需要一个实现多态的基类,接口不符合条件。 我的回答是:
是的,主要区别在于您可以在基类中实现一些代码,或者定义一些属性。

3. Java接口的核心面试问题

1.可以在类中定义接口吗?

可以,我们可以根据Java定义类内部接口,但是定义类内部的接口会在类和接口之间实现非常紧密的耦合。最好单独使用它来保持对象独立工作。比如:

package com.javahonk;

public class InterfaceInsideClass {

    interface TestInterfaceInsideClass {

	void demoMethodInsideClass();
    }

}

接口实现:

package com.javahonk;

public class ImplementInterfaceInsideClass implements
	InterfaceInsideClass.TestInterfaceInsideClass {

    public static void main(String[] args) {

	ImplementInterfaceInsideClass insideClass = 
		new ImplementInterfaceInsideClass();
	insideClass.demoMethodInsideClass();

    }

    @Override
    public void demoMethodInsideClass() {
	System.out.println("Interace Method implementation");

    }

}

2.什么是标记接口?

标记接口是没有方法声明的接口。它们只是告诉编译器,实现没有定义方法的接口的类的对象需要以不同的方式处理。其他代码使用这些标记接口来测试执行某项操作的权限。

Java标记接口:

可序列化

可克隆的

随机存取

从Java 1.5,Java注释特征的引入可以用来定义标记接口,如下面所示:

package com.javahonk.markerinterface;

interface MarketInterfaceExample {

}

使用匿名标记接口:

@interface
AnnotationUserMarkerInterface{

}

3.何时可以将对象引用强制转换为接口引用?

当Java类实现接口时,可以将其转换为接口引用。

4.我们可以实例化一个接口吗?

无法在Java中实例化接口。但可以引用一个按接口类型实现接口的对象。

5.匿名类可以声明为实现接口和扩展类吗?

匿名类既可以实现一个接口,也可以扩展一个类。

6. Interface中的方法可以声明为final吗?

不,只允许public和abstract,默认情况下,所有方法在接口中都是抽象的。

7.接口可以实现另一个接口吗?

接口只能扩展另一个接口,不能实现另一个接口。

8. 类可以扩展多个类吗?

不允许继承多重继承。 作为设计决策,它被排除在语言之外,主要是为了避免循环依赖性。

9.为什么Interface可以扩展多个接口但是一个类不能扩展多个类?

多继承的另一种方法是一个类可以实现多个接口(或者一个接口可以扩展多个接口)。

当接口定义相同的方法并扩展多个接口时,实际的混淆就开始了。

不仅接口,单个类还可以实现多个接口。

10.接口可以是最终的吗?

不能,只能用public & abstract 修饰。

11.可以在接口内定义类吗?

可以,但这并不意味着在接口内部定义类是一个好主意,这将使接口和类之间的关系紧密耦合。

12.接口中的方法允许哪些修饰符?

只允许使用public & abstract 修饰符。

接口中的所有方法和字段都应该以这样的方式声明,以便可以从任何地方调用它们。不仅从子类内部。只有public修饰符才能实现这一点。默认情况下,Java接口中的所有方法都是抽象的,我们不提供方法的主体,这个方法体没有意义,直到另一个类实现它并提供它的完整实现。

还有一件事:我们应该避免在接口中有一个字段。如果可能的话。

接口只定义外部API,不提供任何实现。接口背后的整个思想是实现完全留给实现类。

4. 关于Java多态的核心面试问题

1. 了解面向对象编程原则,OOPS(Object-Oriented Programming System)原则。

十大原则,点我嘛

  • 继承
  • 多态性
  • 抽象化
  • 封装

2. Java如何实现多态?

接口实现、抽象类、继承父类进行方法重写、同一个类中进行方法重载。

此处是一篇优秀的博客

3.什么是运行时多态或动态方法调度?

看我就够了

我也不错哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值