这篇文章后期会不断更新和补充,希望大家可以持续关注~
原整理链接
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无法正确编译,如下图所示。
当然你可以重载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");
}
}
}
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”。你会怎么做?
我已经看过很多次人们说是的,可以在没有使用静态块的主方法的情况下打印消息,并给出了程序序列的原因如下:
如果你的类中有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,这是等效的。
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.何时使用抽象类或接口?
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
{
}
这种模式称为标记接口。我们需要一个实现多态的基类,接口不符合条件。 我的回答是:
是的,主要区别在于您可以在基类中实现一些代码,或者定义一些属性。
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,不提供任何实现。接口背后的整个思想是实现完全留给实现类。
1. 了解面向对象编程原则,OOPS(Object-Oriented Programming System)原则。
十大原则,点我嘛
2. Java如何实现多态?
接口实现、抽象类、继承父类进行方法重写、同一个类中进行方法重载。
此处是一篇优秀的博客
3.什么是运行时多态或动态方法调度?
看我就够了
我也不错哦