小编whi*_*hat的帖子

包名称与文件夹结构不同,但仍然编译Java代码

我正在使用Notepad ++编写我的Java代码和命令提示符来编译和运行它.以下是我的示例Java代码,

    package abraKadabra;

    public class SuperClass{
       protected int anInstance;

       public static void main(String [] abc){
           System.out.println("Hello");
       }
    }
Run Code Online (Sandbox Code Playgroud)

但是,此文件位于以下文件夹结构中:

"usingprotected\superPkg"(usingProtected是C中层次结构中的某个文件夹:)

所以,我的包名在这里应该像usingProtected.superPkg而不是abraKadabra.

但是,当我从命令提示符编译此Java代码时,它编译得很好,没有错误或警告.为什么会这样?软件包名称是否应该遵循文件夹结构?如果它应该,它会如何坚持?

例如,如果我的包名是usingProtected.superPkg,编译器是否会以相反的顺序检查.目前的工作目录应该是superPkg,那么父目录应该是useProtected并完成它.它是如何用包名检查文件夹结构的?

java directory package subdirectory

24
推荐指数
3
解决办法
1万
查看次数

"当一个类加载时"实际意味着什么?

据说java中的静态块只在加载该类时运行一次.但它究竟意味着什么?在哪一点上是由JVM(Java虚拟机)加载的类?

是在调用该类中的main方法时?并且当main方法开始执行时,是否还加载了同一类的所有超类?

考虑A扩展B和B扩展C.所有都有静态块.如果A有main方法,那么静态块的执行顺序是什么?

java static-block classloader

16
推荐指数
1
解决办法
3286
查看次数

使用Xerces将DOM序列化为FileOutputStream

我正在使用链接使用DOM生成XML文件.它说"Xerces解析器与JDK 1.5发行版捆绑在一起.所以你不需要单独下载解析器."

但是,当我在Eclipse Helios中编写以下行时,即使我的系统中有Java 1.6,它也会产生编译时错误.

import org.apache.xml.serialize.XMLSerializer;
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

java xml dom xerces

9
推荐指数
1
解决办法
1万
查看次数

Eclipse如何使用Tomcat部署Web应用程序

Eclipse如何在内部使用Apache(或Tomcat).因为它没有在Tomcat的"webapps"目录中部署我们的Web应用程序.那怎么办呢?

eclipse tomcat web-applications java-ee

9
推荐指数
1
解决办法
1万
查看次数

String []和String ...(Var-args)在内部工作时是否相同?

class WrongOverloading{
    void something(String [] a){ .. }
    Integer something(String... aaa){ return 1;}
}
Run Code Online (Sandbox Code Playgroud)

上面的代码不能编译!编译器说这些是重复的方法.那么使用String数组或String var-args是否完全相同?

它们是如何在内部实施的?

java arrays variadic-functions

7
推荐指数
1
解决办法
869
查看次数

为什么List接口的lastIndexOf()方法接受Object作为参数而不是E?

List接口的lastIndexOf()方法接受Object类型的参数.

但是,add()方法接受E类型的参数(这是在创建List时定义的List的泛型类型)因为add()只接受E,所以这会阻止开发人员(或用户)在编译时自己将任何不兼容的对象添加到列表中.

现在,Java doc说如果传递的对象不兼容,lastIndexOf()可以抛出ClassCastException.但是,当我在Eclipse Helios中运行以下代码时,我没有得到任何异常: -

package scjp.collection.list;

import java.util.ArrayList;
import java.util.List;

public class LastIndexOf {
public static void main(String[] args) {
    List<String> list = new ArrayList<String>();

    list.add("some");
    list.add("thing");
    list.add("at");
    list.add("last");
    list.add("and");
    list.add("at");
    list.add("again");



    System.out.println(list.lastIndexOf("at"));
    System.out.println(list.lastIndexOf(10));                    // # 1
    System.out.println(list.lastIndexOf(new LastIndexOf()));     // # 2
}
}
Run Code Online (Sandbox Code Playgroud)

在第1行和第2行,我已将不兼容的对象传递给我的List类型为String的对象.但是,我得到的输出是: -

5
-1
-1
Run Code Online (Sandbox Code Playgroud)

我没有得到ClassCastException.

如果lastIndexOf()方法接受了E类型的对象而不是Object类型的对象,那么这只能在编译时被阻止.为什么不这样做?

Java创建者必须考虑到如果它接受E(而不是Object)可能会出现的问题.会有什么害处?

java generics list

7
推荐指数
1
解决办法
3023
查看次数

为什么Java类构造函数必须是公共的或受保护的,以便将类扩展到其包之​​外?

以下是我的ProtectedConstructor.java源代码:

package protectCon;

public class ProtectedConstructor{
    public int nothing;
    ProtectedConstructor(){
        nothing = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是UsingProtectedCon.java来源:

package other;

import protectcon.ProtectedConstructor;

public class UsingProtectedCon extends ProtectedConstructor{   //**Line 4**
    public static void main(String... a) {  
    }
}
Run Code Online (Sandbox Code Playgroud)

当我编译时UsingProtectedCon.java,我在上面的第4行得到错误.它说ProtectedConstructor()不公开; 所以不能在包外访问.

但是,由于我的班级是公开的,我不应该将其扩展到包外.无论如何我不创建它的任何实例.

现在,如果我将ProtectedConstructor类的构造函数作为public或者protected然后代码编译好没有错误.

那么,为什么是必要甚至构造是publicprotected,而不是仅仅有默认的访问?

java inheritance constructor default access-modifiers

6
推荐指数
1
解决办法
1万
查看次数

为什么"t instanceof T"不允许,其中T是类型参数,t是变量?

Eclipse表示,由于泛型橡皮擦,Type Parameter不允许使用instanceof操作.

我同意在运行时,不会保留类型信息.但请考虑以下类的通用声明:

class SomeClass<T>{
    T t;
    SomeClass(Object o){
        System.out.println(o instanceof T);   // Illegal
    }   
}        
Run Code Online (Sandbox Code Playgroud)

在运行时,不会出现T!但是如果我实例化这个类型为Integer的类,那么相应的对象将具有Integer类型的字段t.

那么,为什么我不能用T检查变量的类型,它可以在运行时被Integer替换.而我实际上会做类似"o instanceof Integer"的事情.

在哪些情况下,允许带有类型参数的instanceof会导致故障,从而禁止它?

java generics instanceof type-parameter

6
推荐指数
3
解决办法
5292
查看次数

System.console()从Eclipse返回null,但命令提示符很好

当我使用Eclipse Helios的System.console时,它总是返回null.

但是,当我直接从命令行使用它时(即从命令提示符手动编译和执行java源代码),我得到一个Console对象.

要知道,为什么会发生这种情况我检查了链接.根据它,当我从Eclipse运行我的Java代码时,后台作业调度程序必须启动我的JVM.这是什么意思?

当我从命令行启动它时,我的JVM有多么不同?

我也检查了这个链接.这里McDowell说cmd.exe是一个控制台设备.那么我又一次感到困惑,那确实是一个控制台设备?

java console

6
推荐指数
2
解决办法
5931
查看次数

双击JAR文件不会打开命令提示符

我想通过双击运行Jar文件.

以下是其中唯一存在的Java类文件.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Sysout{
public static void main(String[] args) throws IOException{
    System.out.println("Hello World!");
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String msg = br.readLine();
    System.out.println(msg);
    br.read();
}
}
Run Code Online (Sandbox Code Playgroud)

并且Manifest文件已定义Main-Class.

使用链接,我通过双击批处理文件成功运行了Jar文件.这将打开命令提示符并运行定义的主类.

但是,如果我直接双击Jar文件,则没有任何反应.我也检查了这个链接并将我的.jar与javaw.exe相关联. 链接也提示相同.还尝试将.jar与java.exe相关联

发生的是命令提示符打开几分之一秒并消失.

即使我希望用户输入一些数据,双击操作也不会等待用户输入任何内容.

问题出在哪儿?

java jar executable-jar

6
推荐指数
2
解决办法
2万
查看次数