繁体   English   中英

对象和类之间的区别

[英]Difference between Object and Class

可以说我们有没有任何构造函数和实例变量的此类

public class ConsoleWriter{
  public void write(){
    System.out.println("Console Writing...");
  }
}

并且您有另一个具有两个变量console和console1的类App

public class App{
   ConsoleWriter console;
   ConsoleWtiter console1=new ConsoleWriter();
}

现在,我知道console1是ConsoleWriter的对象,而console只是ConsoleWriter的引用类型。

遇到这种情况时(没有构造函数,没有实例变量)

有什么区别 ?

或者如果我们可以使用console创建对象console1话,它将有什么用。

console.write();//would output Console Writing...
console1.write();//would output Console Writing...
console1 is an object of ConsoleWriter

它是不正确的引用,它将指向ConsoleWriter类型的对象。 由于未初始化,因此它将指向null 此外,您还无法对此进行调用,因为它尚未初始化。

console.write();//would output Console Writing...

这也是不正确的。 必须先初始化。

ConsoleWtiter console1=new ConsoleWriter();

这相当于

ConsoleWtiter console1;

它创建一个引用,该引用将指向类ConsoleWriter的对象/实例。 由于它是一个实例变量,因此被分配了默认值,即null。

console1 = new ConsoleWriter();

此时,参考控制台实际上指向ConsoleWriter类的Object。 只有在此(初始化)之后,您才能调用该类的方法。

“现在我知道console1是ConsoleWriter的对象,而console只是ConsoleWriter的引用类型。” 错了 console和console1都是引用。区别在于console1指向ConsoleWriter对象,而console不指向任何对象。

所以。 console.anyFunction()会给您一个异常(NulPointerException),因为未初始化console,而console1.someFunction()将作为console1指向ConsoleWriter对象的指针而工作。

参见JLS

对于所有引用类型(第4.3节) ,默认值为null。

所以当你写:

ConsoleWriter console;
console1.write();

就像写:

null.write();  //Will throw NullPointerException

另一方面,当您这样做时:

ConsoleWriter console1=new ConsoleWriter();

然后,您将构造一个ConsolWriter类型的新对象

您确实需要知道声明,实例化和初始化对象之间的区别

ConsoleWriter console;
ConsoleWiter console1=new ConsoleWriter();

不,以下几行是错误的

console.write();//would output Console Writing...
console1.write();//would output Console Writing...

您将在第一行中遇到NullPointerException。

您无需初始化它,现在它保留默认值null

第二行执行write()方法。 为了进一步使用它,您必须对其进行初始化。

推荐: Declaring, Instantiating and Initializing an Object

console.write(); 将为您提供运行时异常,很可能是空指针异常

 ConsoleWtiter console1=new ConsoleWriter();
console1.write();

会给你

Console Writing...

console不可用。 它不是ConsoleWriter 它是空的。 如果尝试调用其方法,则会收到NullPointerException。 这不是C ++,

ConsoleWriter console;

构造一个ConsoleWriter

现在我知道console1是ConsoleWriter的对象

console1是一个参考ConsoleWriter这是不是空的,因为你初始化它。

而console只是ConsoleWriter的引用类型。

正确。 console1是对ConsoleWriter的引用,该引用为null,因为您没有初始化它。

有什么区别 ?

不同之处在于您没有初始化其中之一。

任何未指定构造函数的class都始终具有您可以使用的默认构造函数。 您的情况是:

public class ConsoleWriter{
  public ConsoleWriter(){
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM