Java | 顶层类(Top-Level Class)
前言
本文内容根据 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 关键字前不加 public、private或protected关键字,那么这个类就声明为包私有的(Package-Private),即它是类的默认声明。包私有的类可在其所在的包内共享,但不能跨包共享。
不允许将顶层类声明为 private 或 protected,因为顶层类在本质上不属于私密类。如果将一个顶层类用 private 或 protected 关键字隐藏起来(即不对外共享),那就无法创建这个类的实例,等同于没有定义这个类。
此外,不允许将顶层类声明为 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)的更多相关文章
- 面试准备(三) Java 异常类层次结构
		在Java中,异常分为受检查的异常,与运行时异常. 两者都在异常类层次结构中.这类容易出选择题 考试你是否掌握了异常类并清楚哪些异常类必须捕获 下面的图展示了Java异常类的继承关系. 图1 粉红色的 ... 
- 什么时候需要交换Top Level ?
		什么时候需要交换Top Level ? 上一篇中提到,如果采用仿真的时候,运用门级仿真就需要进行顶层交换,RTL仿真不需要,那么什么时候需要呢? QuartusII 向下包含,在Project Nav ... 
- Java高级类特性(二)
		一.static关键字 static关键字用来声明成员属于类,而不是属于类的对象.1). static (类)变量类变量可以被类的所有对象共享,以便与不共享的成员变量区分开来. static变量也称作 ... 
- 关于Java Logger类的使用问题 - 内存不释放
		原文地址:http://www.ihuxu.com/p/236.html 说明:这是一个利用Java Logger类的示例,完成简单的日志记录功能.代码中有部分类库没有说明,但不影响阅读. 本人技 ... 
- 八、java常用类
		目录 一.字符串相关类 String类 StringBuffer类 二.基本数据类型包装类 三.Math类 四.File类 五.枚举类 一.字符串相关类 1.String类 java.lang.Str ... 
- Javase之集合体系之(1)集合顶层类Collection与其迭代器知识
		集合体系之集合顶层类Collection与其迭代器知识 集合的由来:Java是一门面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,就必须把多个对象进行存储,而要存 ... 
- Effective Java —— 使类和成员的可访问性最小化
		本文参考 本篇文章参考自<Effective Java>第三版第十五条"Minimize the accessibility of classes and members&quo ... 
- Java:类与继承
		Java:类与继承 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大特性都离不开类,只有存在类,才能体现面向对象编程的特点,今天我们就来了解一些类与继承的相关知 ... 
- java时间类简单总结
		java时间类(Data类) 1.Data类(没有考虑到国际化,好多方法已过时java.util.Data包中) 父类(是类不是接口含有直接子类3个): 日期格式为:年月日时分秒(不包含毫秒部分) ... 
随机推荐
- 利用Python进行数据分析第六季第七集
			翩翩一叶扁舟载不动许多愁https://www.wenjuan.com/s/uMRVrmv/双肩扛起的是数不尽的忧https://www.wenjuan.com/s/uMRVrmv给我一杯酒喝尽人间仇 ... 
- Beta冲刺——5.25
			这个作业属于哪个课程 软件工程 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.解决小程序之前的遗留问题 ... 
- (Java实现) 美元汇率
			时空限制 1000ms/128MB 题目背景 此处省略maxint+1个数 题目描述 在以后的若干天里戴维将学习美元与德国马克的汇率.编写程序帮助戴维何时应买或卖马克或美元,使他从100美元开始,最后 ... 
- Java实现 蓝桥杯VIP 算法提高 最小乘积(提高型)
			算法提高 最小乘积(提高型) 时间限制:1.0s 内存限制:512.0MB 问题描述 给两组数,各n个. 请调整每组数的排列顺序,使得两组数据相同下标元素对应相乘,然后相加的和最小.要求程序输出这个最 ... 
- 第六届蓝桥杯JavaC组国(决)赛真题
			解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.机器人数目 少年宫新近邮购了小机器人配件,共有3类,其中, A类含有:8个轮子,1个传感器 B类含有: 6个轮子,3个传感器 C类含有 ... 
- java中ThreadLocal类的详细介绍(详解)
			ThreadLocal简介 变量值的共享可以使用public static的形式,所有线程都使用同一个变量,如果想实现每一个线程都有自己的共享变量该如何实现呢?JDK中的ThreadLocal类正是为 ... 
- Java实现LeetCode_0027_RemoveElement
			package javaLeetCode.primary; import java.util.Scanner; public class RemoveElement_27 { public stati ... 
- Java实现打印回型嵌套
			*********** * * * ******* * * * * * * * *** * * * * * * * * * * *** * * * * * * * ******* * * * **** ... 
- Zookeeper实现服务注册/发现
			what that? Zookeeper在分布式开发中使用频繁,但许多框架都对其进行了封装,初学者可能无法较好的理解其工作原理,该文章演示了使用Zookeeper实现服务注册,服务发现的简单demo, ... 
- Promise相关学习
			what? Promise对象表示一个异步操作的最终状态(完成或失败),以及其返回的值 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/ ... 
