我对super()的使用感到困惑

时间:2014-09-12 12:12:47

标签: java parent-child parent extend

我知道super()用于从父类中检索实例变量,但是当我看到代码如下:

public class novel extends literature {
private String title;
private String writer;
public novel(String title)
{
    super("novel");
    this.title = title;
    this.writer = "Unknow";
}
public novel(String title, String writer)
{
    super("novel");
    this.title = title;
    this.writer = writer;
}
public String getInfo()
{
    return getGenre() + "\nTitle: " + title + "\nWriter: " + writer;
}
public static void main(String[] args)
{
    novel n = new novel("The devil wears prada", "Lauren Weisberger");
    System.out.println(n.getInfo());
}

}

当我看到这个:超级("小说");我很困惑,为什么子类名可以放在super方法中? 而且我不知道为什么this.writer = "unknown";在这里为什么?为什么不把它设定为作家呢?

很抱歉向你们提出这么多问题,但对任何解决方案都会非常感激。

我很抱歉,我还是没有完全理解为什么它使用超级("小说")?如果我们说小说这里是一个字符串,那么为什么我们使用与#34相同名称的字符串;小说类#34;?

4 个答案:

答案 0 :(得分:1)

super ("novel")表示您将String作为父类的构造函数的参数传递。

this.writer = "Unknow"表示将String值"Unknow"传递给当前类实例的成员。你也可以通过例如。 "马克吐温",作家的变量值将是"马克吐温"。

了解更多信息http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

实施例

//Parentclass

public class Book {

private String genre;
private String isbn;

//As you can see we have two constructors.

//The first with only one argument
public Book (String genre)
    this.genre = genre;
}


//The second one with two arguments
public Book (String genre, String isbn) {
    this.genre = genre;
    this.isbn = isbn;
}

}

//subclass
class Novel extends Book{

public Novel(String isbn)


   super("novel", isbn);
   //super() has now two arguments, because we are calling the second constructor
   //which has two args. 
   //Now, in the parent class members genre = "novel" and isbn equals the value passed in the
   //child constructor.
   //This is the same as using the parent constructor inner body in this constructor. 
   //Normally the parent constructor gets overwritten on inheritance. 
   //But super makes its possible to use the parent constructor. 


}

有关更多示例check this super() documentation

答案 1 :(得分:1)

关于你的super()关键字问题。

在这里,我想解释一下,为了便于理解,我正在催生一个新的例子。

class foo
{
  foo(int t)
  {
  }
}

class bar extends foo
{
  bar()
  {
  }
}

class test
{
  public static void main(String gg[])
  {
    bar b=new bar();
  }
}

上面的代码会给你一个编译错误。错误背后的原因是当班级的对象" b"创建了" b"的构造函数。会跑。从该构造函数编译器隐式地调用基础构造函数,如下面的代码

b()
{
super();
}

现在如果你在foo类中引入了零参数构造函数,那么这个代码将运行没有问题。

class foo
{
  foo()
  {
  }

  foo(int t)
  {
  }
}

class bar extends foo
{
  bar()
  {     
  }
}

class test
{
  public static void main(String gg[])
  {
    bar b=new bar();
  }
}

在java编译器中,如果程序员没有提供构造函数,那么编译器会在类中放置零参数构造函数。如果程序员提供任何构造函数而不是编译器,则不提供任何构造函数。希望你能得到答案。

关于此关键字的第二个问题。是啊!肯定你不能放置这个'关键词。但放置这个'这是很好的。用于区分类变量和局部变量的关键字。 对于您的信息,这里是'这个'的定义。指针。 对于类的每个非静态方法,这个指针由编译器提供,'这个' pointer存储正在调用其方法的对象的地址。如果你没有得到任何东西或需要知道更多关于ping我的评论。

答案 2 :(得分:0)

  1. 最有可能的是,getGenre()方法是在父类中实现的,例如;

    class literature {
        private String genre;
        public literature(String genre) {
            this.genre = genre;
        }
        public String getGenre() {
            return this.genre;
        }}
    
  2. 有两种方法可以为此示例创建实例。如果你既有标题又有作家,没有问题,但你只有标题但不知道作家,这会创建一个作家“未知”的实例。

答案 3 :(得分:-1)

public novel(String title, String writer)
{
    super("novel");
    this.title = title;
    this.writer = writer;
}

super("novel");使用一个参数调用literature类的构造函数。

this.writer = "Unknow";将新对象的编写器属性设置为" Unknow",因为此构造函数不会获取writer参数,只会获得标题。

也许你可以写这个,而不是上面的代码:

public novel(String title)
    {
        this(title, "Unknow"); // calls the constructor with two parameters
    }

编辑:感谢您的帮助,我只是复制粘贴它,我忘了删除super()调用。