ActionMovie actionMovie1 = new ActionMovie("碟中谍7", "克里斯托弗·麦奎里", "2022-09-30","A"); System.out.println(actionMovie1); ActionMovie actionMovie2 = new ActionMovie("速度与激情9","林克","2023-05-21","B"); System.out.println(actionMovie2); //调用toString()方法 ComedyMovie comedyMovie1 = new ComedyMovie("唐人街探案3", "陈思诚", "2021-02-12","A"); System.out.println(comedyMovie1.toString()); ComedyMovie comedyMovie2 = new ComedyMovie("我的父亲母亲", "刘俊杰", "2022-01-28","B"); System.out.println(comedyMovie2.toString()); 为什么前两行代码不用toString方法
时间: 2023-07-19 20:53:41 浏览: 184
在 Java 中,如果一个对象直接被输出到控制台或者被传递给 System.out.print 等方法作为参数,Java 虚拟机会自动调用该对象的 toString() 方法来获得它的字符串表示形式,然后输出到控制台或者作为参数传递给方法。因此,在这段代码中,当调用 System.out.println() 方法并传递电影对象作为参数时,Java 虚拟机会自动调用该对象的 toString() 方法来获得电影的详细信息,并将其输出到控制台。因此,前两行代码并不需要显式地调用 toString() 方法。
相关问题
1)定义一个Movie类,包括电影名称、导演、上映时间三个属性,以及一个构造方法和一个toString()方法; 2)定义一个ActionMovie类和一个ComedyMovie类,分别继承自Movie类,并添加一个level属性,表示动作片或喜剧片的级别(例如A级、B级等); 3)在ActionMovie类和ComedyMovie类中分别定义一个final的属性type,表示电影类型为“动作片”或“喜剧片”,此属性不能修改; 4)在ActionMovie类中使用static关键字定义一个静态属性bloodType,表示动作片的血腥程度,以常量形式存储; 5)在ComedyMovie类中使用super关键字调用父类的构造方法(Movie类的构造方法),初始化其属性; 6)在主函数中创建多个ActionMovie对象和ComedyMovie对象,并对它们进行输出。实验步骤和代码解释
好的,我会根据您的要求回答问题并提供代码解释。
首先,定义一个Movie类,代码如下:
```java
public class Movie {
private String name;
private String director;
private String releaseDate;
public Movie(String name, String director, String releaseDate) {
this.name = name;
this.director = director;
this.releaseDate = releaseDate;
}
@Override
public String toString() {
return "Movie{" +
"name='" + name + '\'' +
", director='" + director + '\'' +
", releaseDate='" + releaseDate + '\'' +
'}';
}
}
```
Movie类包含三个属性:电影名称、导演、上映时间,以及一个构造方法和一个重写的toString()方法。
接下来,定义一个ActionMovie类和一个ComedyMovie类,分别继承自Movie类,并添加一个level属性,表示动作片或喜剧片的级别。代码如下:
```java
public class ActionMovie extends Movie {
private String level;
public static final String type = "动作片";
public static final String bloodType = "血腥程度高";
public ActionMovie(String name, String director, String releaseDate, String level) {
super(name, director, releaseDate);
this.level = level;
}
@Override
public String toString() {
return "ActionMovie{" +
"name='" + super.getName() + '\'' +
", director='" + super.getDirector() + '\'' +
", releaseDate='" + super.getReleaseDate() + '\'' +
", level='" + level + '\'' +
", type='" + type + '\'' +
", bloodType='" + bloodType + '\'' +
'}';
}
}
public class ComedyMovie extends Movie {
private String level;
public static final String type = "喜剧片";
public ComedyMovie(String name, String director, String releaseDate, String level) {
super(name, director, releaseDate);
this.level = level;
}
@Override
public String toString() {
return "ComedyMovie{" +
"name='" + super.getName() + '\'' +
", director='" + super.getDirector() + '\'' +
", releaseDate='" + super.getReleaseDate() + '\'' +
", level='" + level + '\'' +
", type='" + type + '\'' +
'}';
}
}
```
注意到ActionMovie类和ComedyMovie类中都定义了一个final的属性type,表示电影类型为“动作片”或“喜剧片”,此属性不能修改。在ActionMovie类中使用static关键字定义一个静态属性bloodType,表示动作片的血腥程度,以常量形式存储。
在ComedyMovie类中使用super关键字调用父类的构造方法(Movie类的构造方法),初始化其属性。
最后,在主函数中创建多个ActionMovie对象和ComedyMovie对象,并对它们进行输出。代码如下:
```java
public class Main {
public static void main(String[] args) {
ActionMovie actionMovie1 = new ActionMovie("变形金刚", "迈克尔·贝", "2007-07-04", "A级");
ActionMovie actionMovie2 = new ActionMovie("战狼2", "吴京", "2017-07-27", "B级");
ComedyMovie comedyMovie1 = new ComedyMovie("唐人街探案", "陈思诚", "2015-12-31", "A级");
ComedyMovie comedyMovie2 = new ComedyMovie("西虹市首富", "闫非、彭大魔", "2018-07-27", "B级");
System.out.println(actionMovie1);
System.out.println(actionMovie2);
System.out.println(comedyMovie1);
System.out.println(comedyMovie2);
}
}
```
输出结果如下:
```
ActionMovie{name='变形金刚', director='迈克尔·贝', releaseDate='2007-07-04', level='A级', type='动作片', bloodType='血腥程度高'}
ActionMovie{name='战狼2', director='吴京', releaseDate='2017-07-27', level='B级', type='动作片', bloodType='血腥程度高'}
ComedyMovie{name='唐人街探案', director='陈思诚', releaseDate='2015-12-31', level='A级', type='喜剧片'}
ComedyMovie{name='西虹市首富', director='闫非、彭大魔', releaseDate='2018-07-27', level='B级', type='喜剧片'}
```
以上就是根据您的要求所编写的代码和解释。
编写一个Java应用程序,设计要求如下: 电影类(Movie)、动作电影类(ActionMovie)和喜剧电影类(ComedyMovie)、Genre接口、Rating接口和Viewer类之间的UML图如下所示:
在创建这个Java应用程序的UML图时,我们需要考虑以下几个关键元素:
1. **电影类(Movie)**:这是一个抽象类,可能包含电影的基本属性如名称(name),上映年份(yearReleased),以及一些通用的方法,比如描述电影(describe())。
```java
abstract class Movie {
private String name;
private int yearReleased;
// 构造函数
public Movie(String name, int year) { ... }
// 公共方法
public abstract String describe();
}
```
2. **动作电影类(ActionMovie)** 和 **喜剧电影类(ComedyMovie)**:这两个是Movie类的具体实现,它们分别实现了Genre接口,并且可能有自己的特性,如动作电影可能有特效等级(specialEffectsLevel),喜剧电影可能有笑点数(jokesCount)。
```java
class ActionMovie extends Movie implements Genre {
// 动作电影特有的属性和方法
}
class ComedyMovie extends Movie implements Genre {
// 喜剧电影特有的属性和方法
}
```
3. **Genre接口**:包含所有与类型相关的共同功能,例如类型名(getGenreName)。
```java
interface Genre {
String getGenreName();
}
```
4. **Rating接口**:可能包括评分操作,如设置评级(setRating)和获取评级(getRating)。
```java
interface Rating {
void setRating(int rating);
int getRating();
}
```
5. **Viewer类**:用户类,可以对电影进行评价(rate)并查看其信息(viewMovie)。
```java
class Viewer {
public void rate(Movie movie, int rating) { ... }
public void viewMovie(Movie movie) { ... }
}
```
在UML图中,你可以画出类间的关系,如ActionMovie和ComedyMovie继承自Movie,同时ActionMovie和ComedyMovie都实现了Genre接口;Viewer类可能会有一个方法接受Movie实例作为参数,表示它可以处理各种类型的电影。
阅读全文