小编SER*_*ich的帖子

默认构造函数不初始化类的实例成员?

我遇到一个问题,询问"关于"默认"构造函数,以下哪一项是正确的?"

和一个选项"它初始化类的实例成员." 是不正确的选择.

现在我的理解是,如果我们有一个代码,如

    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?

java constructor default-constructor

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

变量多态的初始化

假设您有以下代码

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

  • 我明白如果没有int i = 2; 线,

A a = new B();将调用类A,将i初始化为4,调用构造函数,
将控制权交给print()方法class B,最后打印4.

a.print()将调用print()类B中的方法,因为这些方法将在运行时绑定,这也将使用在类A,4中定义的值.

(当然,如果我的推理有任何错误,请告诉我)

  • 但是,我不明白的是,如果有int i = 2.

为什么如果你插入代码,第一部分(创建对象)将突然打印0而不是4?为什么不将变量初始化为i …

java variables polymorphism constructor initialization

13
推荐指数
3
解决办法
718
查看次数

静态方法可以访问非静态实例变量吗?

所以我的理解是你不能使用静态方法来访问非静态变量,但我遇到了以下代码.

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内存,这是非静态实例变量?

由于代码编译没有任何错误,我假设我不理解这里的东西.有人可以告诉我我不理解的事吗?

java variables static

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

为什么局部变量在if-else构造中启动而在if-else-if构造中不启动?

所以我们知道必须初始化局部变量才能在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结构中初始化变量,编译器无法确定这些条件是否会被评估为真,导致没有初始化局部变量."

即使经过解释,我仍然不明白两件事,

  1. 我不确定为什么变量模型会混淆编译器,因为无论模型是什么,双倍价格都是11.
  2. 当你把else放在最后时,它如何神奇地初始化局部变量?

java if-statement initialization

5
推荐指数
1
解决办法
80
查看次数

Java继承和转换

所以我正在研究一些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 inheritance casting

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