我知道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;?
答案 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.
}
答案 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)
最有可能的是,getGenre()方法是在父类中实现的,例如;
class literature {
private String genre;
public literature(String genre) {
this.genre = genre;
}
public String getGenre() {
return this.genre;
}}
有两种方法可以为此示例创建实例。如果你既有标题又有作家,没有问题,但你只有标题但不知道作家,这会创建一个作家“未知”的实例。
答案 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()调用。