你所不知道的java编程思想

读thinking in java这本书的时候,有这么一句话“在编译单元的内部,可以有一个公共(public)类,它必须拥有与文件相同的名字”

有以下疑问:

  1. 在一个类中说可以有一个public类,那是不是也就是说可以没有呢?

抱着这个问题进行了以下的实验:(文件名是Test1.java)

class Test1 {
    public static void main(String[] args){
        if(args != null && args.length > 0){
            System.out.println(args.length);
            for(int i=0;i < args.length;i++){
                System.out.println("args["+i+"]:"+args[i]);
            }
        }
    }
    public static void test(){
    }
}
class Test3{
    public static void main(String[] args){
        if(args != null && args.length > 0){
            System.out.println(args.length);
            for(int i=0;i < args.length;i++){
                System.out.println("args["+i+"]:"+args[i]);
            }
        }
    }
    public static void test(){
    }
}

在终端下执行命令,没有任何错误,可见第一条确实可行的,一个类文件中确实不需要有public指定相关类名。

那随之而来的第二个问题就是,既然没有public修饰,那是不是里边的类名称也可以随意起呢,随之修改上述代码中Test1为Test2并进行测试,结果如下:

同样和上图的结果几乎一样,所以可以得出结论,在一个类文件中可以没有public修饰的类,此时类名称不必和文件名一样。

通过以上研究就可以明显看出来《thinking in java》中的一个错误,原话如下:

“例如,假定文件名是MyClass.java。它意味着在那个文件有一个、而且只能有一个public类。而且那个类的名字必须是MyClass(包括大小写形式)”

——取自5.1节

延伸了解:

以下列出类名的修饰符(取自百度)

public     公共类
default    默认类(默认的修饰符,只有在相同包中的对象才能使用这样的类)
abstract   抽象类
final      不能被继承的类
static     静态类
private    只能修饰内部类,一般不推荐使用

  

时间: 2024-10-28 22:49:53

你所不知道的java编程思想的相关文章

深入洞见:你所不知道的Java 对象序列化的5件事儿

关于 Java 对象序列化的一些有用的小知识 不易理解,但对于解决 Java 编程挑战迟早有用. 将 Java 对象序列化 API它从一开始就存在于 JDK 1.1 中.本文介绍的关于序列化的 几件事情将说服您重新审视那些标准 Java API. Java 序列化简介 Java 对象序列化是 JDK 1.1 中引入的一组开创性特性之一,用于作为一种将 Java 对象的状态转换为字节数组,以便存储或传输的机制,以后,仍可以将字节数组转换回 Java 对象原有的状态. 到现在为止,还没有看到什么新鲜

你所不知道的 Java 之 HashCode

之所以写HashCode,是因为平时我们总听到它.但你真的了解hashcode吗?它会在哪里使用?它应该怎样写? 相信阅读完本文,能让你看到不一样的hashcode. 使用hashcode的目的在于:使用一个对象查找另一个对象.对于使用散列的数据结构,如 HashSet.HashMap.LinkedHashSet.LinkedHashMap ,如果没有很好的覆写键的hashcode()和equals()方法,那么将无法正确的处理键. 请对以下代码中 Person 覆写hashcode()方法,看

【总结】你所不知道的Java序列化

我们都知道,Java序列化可以让我们记录下运行时的对象状态(对象实例域的值),也就是我们经常说的对象持久化 .这个过程其实是非常复杂的,这里我们就好好理解一下Java的对象序列化. 1. 首先我们要搞清楚,Java对象序列化是将 对象的实例域数据( 包括private私有域) 进行持久化存储.而并非是将整个对象所属的类信息进行存储. 其实了解JVM的话,我们就能明白这一点了.实际上堆中所存储的对象包含了实例域数据值以及指向类信息的地址,而对象所属的类信息却存放在方法区中.当我们要对持久层数据反序

你所不知道的Java序列化

我们都知道,Java序列化可以让我们记录下运行时的对象状态(对象实例域的值),也就是我们经常说的对象持久化 .这个过程其实是非常复杂的,这里我们就好好理解一下Java的对象序列化. 1. 首先我们要搞清楚,Java对象序列化是将 对象的实例域数据( 包括private私有域) 进行持久化存储.而并非是将整个对象所属的类信息进行存储. 其实了解JVM的话,我们就能明白这一点了.实际上堆中所存储的对象包含了实例域数据值以及指向类信息的地址,而对象所属的类信息却存放在方法区中.当我们要对持久层数据反序

讲一些你所不知道的Java动态代理

简介 Proxy 是设计模式中的一种.当需要在已存在的 class 上添加或修改功能时,可以通过创建 proxy object 来实现 通常 proxy object 和被代理对象拥有相同的方法,并且拥有被代理对象的引用,可以调用其方法 代理模式应用场景包括 在方法执行前后打印和记录日志 认证.参数检查 lazy instantiation (Hibernate, Mybatis) AOP (transaction) mocking - 代理有两种实现方式 静态代理:在编译时期,创建代理对象 动

你所不知道的五件事情--java.util.concurrent(第二部分)

这是Ted Neward在IBM developerWorks中5 things系列文章中的一篇,仍然讲述了关于Java并发集合API的一些应用窍门,值得大家学习.(2010.06.17最后更新) 摘要:除了便于编写并发应用的集合API外,java.util.concurrent还引入了其它的预置程序组件,这些组件能辅助你在多线程应用中控制和执行线程.Ted Neward再介绍了五个来自于java.util.concurrent的Java编程必备窍门. 通过提供线程安全,性能良好的数据结构,并发

《Java编程思想》读书笔记

前言 这个月一直没更新,就是一直在读这本<Java编程思想>,这本书可以在Java业界被传神的一本书,无论谁谈起这本书都说好,不管这个人是否真的读过这本书,都说啊,这本书很好.然后再看这边书的厚度,哇塞,厚的真的不止一点点,所以很多人看了没多久就放弃了,看不下去,但是基于它的厚度,就说,这是一本好书.也有人说,看了没什么用的一本书,甚至还去嘲笑那些正在看的人,说还不如看点实际的技术.那么在我的世界里,如果一本书没有读过,如果妄加评论的话,没有任何的意义.所以我真的仔仔细细读了下来,书上也写了很

56 java编程思想——创建窗口和程序片 用户接口API

56.java编程思想--创建窗口和程序片 用户接口API Java 1.1 版同样增加了一些重要的新功能,包括焦点遍历,桌面色彩访问,打印"沙箱内"及早期的剪贴板支持. 焦点遍历十分的简单,因为它显然存在于AWT 库里的组件并且我们不必为使它工作而去做任何事.如果我们制造我们自己组件并且想使它们去处理焦点遍历,我们过载isFocusTraversable()以使它返回真值.如果我们想在一个鼠标单击上捕捉键盘焦点,我们可以捕捉鼠标按下事件并且调用requestFocus()需求焦点方法

JavaScript你所不知道的困惑(1)

困惑一: 先看一个例子: function test(){ message = "hi"; } test(); alert(message); 会输出字符串"hi" 在函数内部使用var定义的变量是局部变量,省略var操作符的变量是全局变量. 困惑二: alert(undefined == null) 结果是"true" 我们知道在js中分为基本类型和引用类型,基本类型包括number.string.boolean.undefined.null.