阿里二面:main 方法可以继承吗?

简介: main方法能重载么?main方法能被其他方法调用么?main方法可以继承么?
  • main方法能重载么?
  • main方法能被其他方法调用么?
  • main方法可以继承么?

# 阿里二面:main 方法可以继承吗?


昨天,微信群里一位网友,在群里发了自己面试阿里的过程。其中一个面试,他在群里 PUA 其他网友。这道面试题就是:Java 中的 main 方法可以继承吗?

我们一开始学习 Java 程序的时候,最先跑的一段代码肯定是 main 方法,main 方法的格式如下:

public static void main(String[] args) {
}


那么 main 方法有什么特殊的地方呢?今天我们来简单看一下。


首先针对 main 方法的格式定义:


「public」 :main 方法是启动的时候由 JVM 进行加载的,public 的可访问权限是最高的,所以需要声明为 public;


「static」 :方法的调用要么是通过对象,要么是通过类,而 main 方法的话因为是由虚拟机调用的,所以无需生成对象,那么声明为 static 即可;


「main」 :至于为什么方法名称叫 main,我想应该是参考的是 C 语言的方法名吧;


「void」 :main 方法退出时,并没有需要有相关返回值需要返回,所以是 void;


「String[]」 :此字符串数组用来运行时接受用户输入的参数;因为字符串在 Java 中是具有普遍性的,所以使用字符串是最优选择;数组的话,因为我们的参数不止一个,所以数组肯定是合适的;


不过自 JDK1.5 引入动态参数后,String[]数组也可以使用String... args来实现。

public static void main(String... args){
}


除了上面 JVM 规定的这个 main 除了方法比较特殊外,其他的 main 方法与普通的静态方法是没有什么不同的。


# main方法能重载么?

这个是可以的,比如说我们给它重载一个方法:

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


编译运行,很显然没啥问题,除了 JVM 规定的作为应用程序入口的 main 方法之外,其他的 main 方法都是比较普通的方法。

# main方法能被其他方法调用么?


public class Main {
    private static int times = 3;
    public static void main2(String[] args) {
        times--;
        main(args);
    }
    public static void main(String[] args) {
        System.out.println("main方法执行:" + times);
        if (times <= 0) {
            System.exit(0);
        }
        main2(args);
    }
}


运行一下代码,可以发现代码能正常执行:


main方法执行:3
main方法执行:2
main方法执行:1
main方法执行:0


所以说即使是作为应用程序入口的 main 方法,也是可以被其他方法调用的,但要注意程序的关闭方式,别陷入死循环了。


# main方法可以继承么?

我们以前了解过,当子类继承时,子类可以继承父类的方法和变量,那么当父类定义了 main 方法,而子类没有 main 方法是,能继承父类的 main 方法,从而正常的运行程序么?

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


定义子类:

public class Main2 extends Main {
}


这时候我们运行子类 Main2,可以发现,同样打印了hello world,这说明 main 方法也是可以继承的。那么还有一种隐藏的情况也很显然了,人类定义自己的 main 方法,隐藏掉父类中的实现,那么这也是可以的。

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


这时候就会打印出自己的内容了:hello world Main2。


这么来看,除了main方法作为应用程序的入口比较特殊外,其他情况下与正常的静态方法是没什么区别的。

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

相关文章
|
Java
JVM之本地内存以及元空间,直接内存的详细解析
JVM之本地内存以及元空间,直接内存的详细解析
1257 0
|
Java Apache Maven
【IntelliJ IDEA】解决IntelliJ IDEA 创建Maven项目速度慢的问题,配置DarchetypeCatalog
【IntelliJ IDEA】解决IntelliJ IDEA 创建Maven项目速度慢的问题,配置DarchetypeCatalog
2100 0
|
8月前
|
人工智能 算法 IDE
通义灵码:以AI重塑开发者生产力,解锁智能编程新范式
通义灵码是阿里云推出的一款AI智能编程助手,基于通义大模型打造,深度集成于主流IDE。它不仅提供全场景智能代码生成、对话式开发体验和工程化智能重构等功能,还通过百亿级参数大模型底座、企业级环境适配、私有化部署等优势,重新定义人机协作边界。在真实开发场景中,通义灵码显著提升API开发与算法优化效率,助力开发者从机械劳动转向创造性对话,开启人机协同的新时代。
429 9
|
8月前
|
Java 关系型数据库 MySQL
深入解析 @Transactional——Spring 事务管理的核心
本文深入解析了 Spring Boot 中 `@Transactional` 的工作机制、常见陷阱及最佳实践。作为事务管理的核心注解,`@Transactional` 确保数据库操作的原子性,避免数据不一致问题。文章通过示例讲解了其基本用法、默认回滚规则(仅未捕获的运行时异常触发回滚)、因 `try-catch` 或方法访问修饰符不当导致失效的情况,以及数据库引擎对事务的支持要求。最后总结了使用 `@Transactional` 的五大最佳实践,帮助开发者规避常见问题,提升项目稳定性与可靠性。
1340 12
|
XML JSON 前端开发
json字符串CSS格式化
json字符串CSS格式化
264 5
|
关系型数据库 MySQL 数据库
mysql的用户管理和权限控制
本文介绍了MySQL中用户管理的基本操作,包括创建用户、修改密码、删除用户、查询权限、授予权限和撤销权限的方法。
479 2
|
消息中间件 NoSQL Java
Spring Boot整合Redis
通过Spring Boot整合Redis,可以显著提升应用的性能和响应速度。在本文中,我们详细介绍了如何配置和使用Redis,包括基本的CRUD操作和具有过期时间的值设置方法。希望本文能帮助你在实际项目中高效地整合和使用Redis。
735 2
|
小程序 开发工具 开发者
入职必会-开发环境搭建31-微信开发者工具下载和安装
微信开发者工具是一款由微信官方推出的开发工具,旨在帮助开发者更高效地进行微信小程序和微信公众号的开发与调试。该工具集成了代码编辑、代码上传、实时预览、调试等功能,能够提供便捷的开发环境和调试工具,帮助开发者快速定位和解决问题。
655 0
|
SQL Java 数据库连接
Dao层和Mapper层
Dao层和Mapper层
1980 0
|
缓存 安全 Java
多线程的三大特性:原子性、可见性和有序性
多线程的三大特性:原子性、可见性和有序性
361 1