我在理解java中的受保护访问修饰符(或其背后的设计)时遇到了一些麻烦.我认为这意味着包访问和访问通过继承包含抽象成员的类的对象.
我写了以下示例代码.我看到如果取消注释,注释掉的行会产生编译错误.为什么我可以通过Second中的Second对象访问pro,但不能通过Second中的First对象访问pro?
package first;
public class First {
protected void pro(){
System.out.println("Can see protected method");
}
}
Run Code Online (Sandbox Code Playgroud)
package first;
public class InFirst {
public static void main(String[] args){
First fst = new First();
fst.pro();
}
}
Run Code Online (Sandbox Code Playgroud)
package second;
import first.First;
public class Second extends First {
public static void main(String[] args){
First fst = new First();
// fst.pro();
Second sec = new Second();
sec.pro();
}
}
Run Code Online (Sandbox Code Playgroud) 我对Java中的变量初始化感到困惑.据我所知,类变量获取默认初始化,而默认情况下不初始化局部变量.但是,如果我使用new关键字在方法内创建一个数组,它默认会初始化.所有对象都是如此吗?使用new关键字是否初始化对象,无论它是类变量还是局部变量?
我正在阅读Herbert Schilds关于java中泛型的类型擦除.据说在类上运行javap应该在类型擦除后给我关于public,package protected和protected字段和方法的字节码信息.但是,我写了以下课程:
class Ambiguity<T, V extends String>{
T ob1;
V ob2;
void set(T o){
ob1 = o;
}
void set(V o){
ob2 = o;
}
}
Run Code Online (Sandbox Code Playgroud)
并在生成的类文件上运行javap并获得以下输出
编译自"Test.java"
class Ambiguity<T, V extends java.lang.String> {
T ob1;
V ob2;
Ambiguity();
void set(T);
void set(V);
}
Run Code Online (Sandbox Code Playgroud)
我期待根据我读到的内容看起来像这样的输出.
Compiled from "Test.java"
class Ambiguity<java.lang.Object, java.lang.String> {
java.lang.Object ob1;
java.lang.String ob2;
Ambiguity();
void set(java.lang.Object);
void set(java.lang.String);
}
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?我应该补充一点,我理解以上述方式重载方法不是一个好习惯.我只是看到有兴趣在这种模棱两可的情况下看到javap的结果.
编辑:这似乎是javap中新修复的结果. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4870651
如果我从JDK 1.6运行javap,我会得到我期望的结果.如果我从最初使用的JDK 1.7 b30运行javap,我会得到带有通用信息的结果.
我无法理解在以下代码中创建obj和obj2对象的方式的差异.特别是,我不确定如何将一个原语强制转换为一个对象.看看这里的其他一些问题,我认为这是不可能的.但是以下程序编译并运行正常.在第一种情况下,输出是假的,在第二种情况下,它是真的.
public class Test {
public static void main(String args[]){
Integer num = new Integer(3) ;
Object obj = num;
Integer[] integerArr = {1, 2, 3, 4};
Object[] objArr = integerArr;
boolean contains = false;
for (int i = 0; i < objArr.length; i++){
if (objArr[i] == obj){
contains = true;
break;
}
}
System.out.println(contains);
int num2 = 3 ;
Object obj2 = num2;
Integer[] integerArr2 = {1, 2, 3, 4};
Object[] objArr2 = integerArr2;
boolean contains2 = false;
for …Run Code Online (Sandbox Code Playgroud) 来自java文档
public FileWriter(String fileName)抛出IOException
抛出:
IOException - 如果指定的文件存在但是是目录而不是常规文件,则不存在但无法创建,或者由于任何其他原因无法打开
与此
public FileOutputStream(File file,boolean append)抛出FileNotFoundException
抛出:
FileNotFoundException - 如果文件存在但是是目录而不是常规文件,则不存在但无法创建,或者由于任何其他原因无法打开
这个选择有特定原因吗?
java filenotfoundexception ioexception filewriter fileoutputstream
我想计算两个哈希映射的键的并集.我写了下面的代码(MWE如下),但我
获取UnsupportedOperationException.实现这一目标会有什么好处?
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class AddAll {
public static void main(String args[]){
Map<String, Integer> first = new HashMap<String, Integer>();
Map<String, Integer> second = new HashMap<String, Integer>();
first.put("First", 1);
second.put("Second", 2);
Set<String> one = first.keySet();
Set<String> two = second.keySet();
Set<String> union = one;
union.addAll(two);
System.out.println(union);
}
}
Run Code Online (Sandbox Code Playgroud) 我正在用Java编写一个程序,我想使用HashSet(和HashMap).我无法使contains(和containsKey)方法起作用.我想我必须在某处覆盖一些equals方法才能使用.我们的想法是获得以下代码来生成输出:true.有关如何做到这一点的任何想法?
import java.util.HashSet;
import java.util.Set;
public class Sets {
public static void main(String args[]){
Set<StringBuilder> wordSet = new HashSet<StringBuilder>();
StringBuilder element = new StringBuilder("Element");
wordSet.add(element);
StringBuilder element2 = new StringBuilder("Element");
System.out.println(wordSet.contains(element2));
}
}
Run Code Online (Sandbox Code Playgroud) java ×7
casting ×1
filewriter ×1
generics ×1
hashmap ×1
hashset ×1
ioexception ×1
javap ×1
protected ×1
set ×1
type-erasure ×1