我遇到一个问题,询问"关于"默认"构造函数,以下哪一项是正确的?"
和一个选项"它初始化类的实例成员." 是不正确的选择.
现在我的理解是,如果我们有一个代码,如
Class Test {
String name;
}
Run Code Online (Sandbox Code Playgroud)
然后编译器创建看起来像的默认构造函数
Class Test {
String name;
Test(){
super();
name = null;
}
}
Run Code Online (Sandbox Code Playgroud)
是不是默认构造函数初始化实例成员name = null?
假设您有以下代码
class A {
int i = 4;
A() {
print();
}
void print () {
System.out.println("A");
}
}
class B extends A {
int i = 2; //"this line"
public static void main(String[] args){
A a = new B();
a.print();
}
void print () {
System.out.println(i);
}
}
Run Code Online (Sandbox Code Playgroud)
这将打印0 2
现在,如果删除标有"此行"的行,代码将打印4 4
A a = new B();将调用类A,将i初始化为4,调用构造函数,
将控制权交给print()方法class B,最后打印4.
a.print()将调用print()类B中的方法,因为这些方法将在运行时绑定,这也将使用在类A,4中定义的值.
(当然,如果我的推理有任何错误,请告诉我)
为什么如果你插入代码,第一部分(创建对象)将突然打印0而不是4?为什么不将变量初始化为i …
所以我的理解是你不能使用静态方法来访问非静态变量,但我遇到了以下代码.
class Laptop {
String memory = "1GB";
}
class Workshop {
public static void main(String args[]) {
Laptop life = new Laptop();
repair(life);
System.out.println(life.memory);
}
public static void repair(Laptop laptop) {
laptop.memory = "2GB";
}
}
Run Code Online (Sandbox Code Playgroud)
哪个编译没有错误.
所以不是
public static void repair(Laptop laptop) {
laptop.memory = "2GB";
}
Run Code Online (Sandbox Code Playgroud)
访问类Laptop中定义的String内存,这是非静态实例变量?
由于代码编译没有任何错误,我假设我不理解这里的东西.有人可以告诉我我不理解的事吗?
所以我们知道必须初始化局部变量才能在if-else-if构造中使用.例如,以下代码将无法编译.
public class Test {
public static void main (String...args){
double price= 11;
String model ;
if (price>10)
{model ="smartphone";}
else if (price<=11)
{model="not smart phone";}
System.out.println(model);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您将局部变量String模型更改else if (price<=11)为else或初始化为某个随机值,则代码将成功编译.我在这个案例中的问题是"为什么?"
现在,这是一本书的问题,解释是:
"只声明局部变量模型,而不是初始化.变量模型的初始化放在if和else-if结构中.如果在if或else-if结构中初始化变量,编译器无法确定这些条件是否会被评估为真,导致没有初始化局部变量."
即使经过解释,我仍然不明白两件事,
所以我正在研究一些OCAJP JAVA样本问题,我偶然发现了以下问题.
考虑以下代码.
interface I{ }
class A implements I{ }
class B extends A { }
class C extends B{ }
Run Code Online (Sandbox Code Playgroud)
以下声明:
A a = new A();
B b = new B();
Run Code Online (Sandbox Code Playgroud)
哪个编译运行没有错误?
A. a = (B)(I)b;
B. b = (B)(I) a;
C. a = (I) b;
D. I i = (C) a;
Run Code Online (Sandbox Code Playgroud)
这个问题的答案是A.这是有道理的.但我不明白的是B.不是正确答案.它说这是不正确的选择,因为"这将在运行时失败,因为它没有指向B类的对象."
现在,我实际上去了Eclipse并写下了整个代码.C显然没有编译,D在运行时失败了.B.至少用我的代码编译没有问题.我在这里错过了什么吗?或者这本书真的错了吗?我实际放入Eclipse的代码是这样的:
public class Test{
public static void main (String[]args){
A a = new A();
B b = new B();
a=(B)(I)b;
b=(B)(I)a;
}
}
interface I{ …Run Code Online (Sandbox Code Playgroud) java ×5
constructor ×2
variables ×2
casting ×1
if-statement ×1
inheritance ×1
polymorphism ×1
static ×1