前言


本文内容根据 Java 官方教程中的《课程:类和对象》编写而成。

本文提供的是 JDK 14 的示例代码。

定义


顶层类(Top-Level Class),是 Java 中对类的一种定义方式。在 .java 文件中,处于最外层的类就称为顶层类,在其外部不存在将其包围起来的任何代码块。下面的示例就是一个典型的顶层类:

 /**
* 定义一个公共的顶层类。
*/
public class MyClass {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
/* 输出结果:
Hello World! */

概述


声明顶层类

在前面的示例中,已经看到了如何定义一个顶层类。这就是一个顶层类的声明。顶层类可以声明为 public,如前面示例中的 MyClass 类,也可以声明为包私有的,如下:

 /**
* 定义一个包私有的顶层类。
*/
class PackagePrivateClass {
public static void main(String[] args) {
System.out.println("PackagePrivateClass:这是一个包私有的顶层类。");
}
}
/* 输出结果:
PackagePrivateClass:这是一个包私有的顶层类。 */
  • 提示:在定义一个类时,如果在 class 关键字前不加 publicprivateprotected 关键字,那么这个类就声明为包私有的(Package-Private),即它是类的默认声明。包私有的类可在其所在的包内共享,但不能跨包共享。

不允许将顶层类声明为 privateprotected,因为顶层类在本质上不属于私密类。如果将一个顶层类用 privateprotected 关键字隐藏起来(即不对外共享),那就无法创建这个类的实例,等同于没有定义这个类。

此外,不允许将顶层类声明为 static,因为顶层类在本质上是非静态的,只有在创建其实例时,才会将其加载到内存中。否则,Java 编译器将会生成一条类似于“此处不允许使用修饰符 static”的错误消息。

并列多个顶层类

.java 文件中,允许多个顶层类并列存在,但只能有一个与其文件名同名的、声明为 public 的顶层类。这个与文件名同名的顶层类可以声明为包私有的,但在这个文件中的其他顶层类只能声明为包私有的

 /**
* 定义一个顶层类。
*/
public class TopLevelClass {
public static void main(String[] args) {
System.out.println("TopLevelClass:这是与 TopLevelClass.java 文件同名的顶层类。");
System.out.println(new AnotherClass().toString());
}
} /**
* 定义另一个顶层类。
*/
class AnotherClass {
public AnotherClass() {
} @Override
public String toString() {
return "AnotherClass:这是在 TopLevelClass.java 文件中的另一个顶层类。";
}
}
/* 输出结果:
TopLevelClass:这是与 TopLevelClass.java 文件同名的顶层类。
AnotherClass:这是在 TopLevelClass.java 文件中的另一个顶层类。 */

在上述示例中,若将 AnotherClass 类声明为 public,则 Java 编译器将会生成一条类似于“类 AnotherClass 是公共的,应在名为 AnotherClass.java 的文件中声明”的错误消息。

声明抽象类

可以使用 abstract 关键字,将顶层类声明为抽象类,如下:

 public class AbstractClassDemo {
public static void main(String[] args) {
new Subclass().printName();
}
} /**
* 定义一个抽象类。
*/
abstract class AbstractClass {
private final String name; // 定义抽象类的构造方法。
public AbstractClass() {
name = "AbstractClass:这是一个抽象类。";
} // 定义一个非抽象方法。
public String getName() {
return name;
} // 定义一个抽象方法。
public abstract void printName();
} /**
* 定义一个子类。
*/
class Subclass extends AbstractClass {
private final String name; // 定义子类的构造方法。
public Subclass() {
super();
name = "Subclass:这是一个抽象类的子类。";
} // 实现父类的抽象方法。
@Override
public void printName() {
System.out.println(super.getName());
System.out.println(name);
}
}
/* 输出结果:
AbstractClass:这是一个抽象类。
Subclass:这是一个抽象类的子类。 */

想要了解有关抽象类的更多信息,请参阅《抽象类》。

Java | 顶层类(Top-Level Class)的更多相关文章

  1. 面试准备(三) Java 异常类层次结构

    在Java中,异常分为受检查的异常,与运行时异常. 两者都在异常类层次结构中.这类容易出选择题 考试你是否掌握了异常类并清楚哪些异常类必须捕获 下面的图展示了Java异常类的继承关系. 图1 粉红色的 ...

  2. 什么时候需要交换Top Level ?

    什么时候需要交换Top Level ? 上一篇中提到,如果采用仿真的时候,运用门级仿真就需要进行顶层交换,RTL仿真不需要,那么什么时候需要呢? QuartusII 向下包含,在Project Nav ...

  3. Java高级类特性(二)

    一.static关键字 static关键字用来声明成员属于类,而不是属于类的对象.1). static (类)变量类变量可以被类的所有对象共享,以便与不共享的成员变量区分开来. static变量也称作 ...

  4. 关于Java Logger类的使用问题 - 内存不释放

    原文地址:http://www.ihuxu.com/p/236.html   说明:这是一个利用Java Logger类的示例,完成简单的日志记录功能.代码中有部分类库没有说明,但不影响阅读. 本人技 ...

  5. 八、java常用类

    目录 一.字符串相关类 String类 StringBuffer类 二.基本数据类型包装类 三.Math类 四.File类 五.枚举类 一.字符串相关类 1.String类 java.lang.Str ...

  6. Javase之集合体系之(1)集合顶层类Collection与其迭代器知识

    集合体系之集合顶层类Collection与其迭代器知识 集合的由来:Java是一门面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,就必须把多个对象进行存储,而要存 ...

  7. Effective Java —— 使类和成员的可访问性最小化

    本文参考 本篇文章参考自<Effective Java>第三版第十五条"Minimize the accessibility of classes and members&quo ...

  8. Java:类与继承

    Java:类与继承 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大特性都离不开类,只有存在类,才能体现面向对象编程的特点,今天我们就来了解一些类与继承的相关知 ...

  9. java时间类简单总结

    java时间类(Data类) 1.Data类(没有考虑到国际化,好多方法已过时java.util.Data包中) 父类(是类不是接口含有直接子类3个):  日期格式为:年月日时分秒(不包含毫秒部分) ...

随机推荐

  1. CE未知数值修改

    一样,用植物大战僵尸测试.来搜索修改向日葵生产阳光的CD值. 由于开始并不知道向日葵cd的初始值,所以用CE搜索未知的初始值 返回游戏,每次向日葵晃一下搜索一下减少的值. 锁定修改为0发现成功. 然后 ...

  2. MyBatis主配置文件

    MyBatis的使用非常简单,使用流程整体可以分成以下四步: public class UserDaoTest { private SqlSessionFactory sqlSessionFactor ...

  3. Redis 入门到分布式 (八)Redis Sentinel

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) sentinel-目录 主从复制高可用 安装配置 实现原理 架构说明 客户端连接 常见开发运维问题 一. ...

  4. 利用init进程监控底层节点的方法架构

    native层利用底层节点变化,再针对变化进行相应的函数调用,实现某些功能. 架构如下: 底层提供节点更新,以及healthd读取节点的实现,都比较简单.而其余部分比较关键. 特别注意init监控pr ...

  5. Java实现 LeetCode 144 二叉树的前序遍历

    144. 二叉树的前序遍历 给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] /** * Definition for a ...

  6. 【JAVA习题二十九】809*??=8*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。

    package erase; public class 八九与问好两位数的乘积和 { public static void main(String[] args) { int m,n;//m十位,n个 ...

  7. postman接口超时设置,用于debug等断点调试

    Settings->General->Request Timeout in ms(0 for infinity):设置请求超时的时间,默认为0

  8. 【大厂面试05期】说一说你对MySQL中锁的了解?

    这是我总结的一个表格,是本文中涉及到的锁(因为篇幅有限就没有包括自增锁) 加锁范围 名称 用法 数据库级 全局读锁 执行Flush tables with read lock命令各整个库接加一个读锁, ...

  9. org.apache.maven.plugins:maven-archetype-plugin:RELEASE:generate——解决方案汇总

    近期将自己本地的 maven 仓库进行了迁移,idea 的版本也升级到了IntelliJ IDEA 2019.3.3 x64,但是遇到了 Plugins 报红的情况,尝试很多方法,终于解决,现在做一下 ...

  10. 面试官突然问我MySQL存储过程,我竟然连基础都不会!(详细)

    所有知识体系文章,GitHub已收录,欢迎Star!再次感谢,愿你早日进入大厂! GitHub地址: https://github.com/Ziphtracks/JavaLearningmanual ...