public class p { void disp1() { System.out.println(1); } void disp2 () { disp1(); }public class s extends p{ void disp1(){ System.out.println(3); } void disp3(){disp2();} }public class Test { public static void main(String[] args) { p p = new s(); p.disp3(); } }该代码错哪了
时间: 2024-03-06 07:48:25 浏览: 18
该代码存在语法错误,需要将三个类分别放在不同的文件中,每个文件的文件名需要与类名相同,且类名首字母需要大写。同时,需要将 disp2 方法声明为 public 或 protected,以便子类 s 能够访问。以下是修改后的代码:
p.java:
```
public class P {
void disp1() {
System.out.println(1);
}
protected void disp2() {
disp1();
}
}
```
s.java:
```
public class S extends P {
void disp1() {
System.out.println(3);
}
void disp3() {
disp2();
}
}
```
Test.java:
```
public class Test {
public static void main(String[] args) {
P p = new S();
S s = new S();
p.disp2();
s.disp2();
s.disp3();
}
}
```
输出结果为:
```
1
1
1
```
相关问题
分析以下代码package practice4_1; class Fruit { public void disp() { System.out.println("我是水果"); } } class Apple extends Fruit { public void disp() { System.out.println("我是苹果"); } } class Banana extends Fruit { public void disp() { System.out.println("我是香蕉"); } } public class Fruitcal { public static void main(String[] args) { Fruit fruit1 = new Fruit(); Fruit fruit2 = new Apple(); Fruit fruit3 = new Banana(); fruit1.disp(); // 输出:我是水果 fruit2.disp(); // 输出:我是苹果 fruit3.disp(); // 输出:我是香蕉 } }
这段代码定义了一个Fruit类和两个子类Apple和Banana,其中Fruit类有一个disp方法,输出“我是水果”的字符串。Apple类和Banana类分别继承了Fruit类,并且重写了disp方法,输出“我是苹果”和“我是香蕉”的字符串。
在主函数main中,分别创建了三个Fruit类的对象fruit1、fruit2和fruit3,其中fruit1是Fruit类的对象,fruit2和fruit3分别是Apple类和Banana类的对象,但是它们的类型都是Fruit类。调用这三个对象的disp方法,由于Java中的动态绑定机制,fruit1、fruit2和fruit3实际上都调用了它们自己类中的disp方法,输出的结果分别为:
```
我是水果
我是苹果
我是香蕉
```
这段代码体现了多态的思想,通过父类引用指向子类对象,实现了对不同子类对象的统一操作。在调用disp方法时,由于它是一个虚方法,实际调用的是对象所属类中的重写方法。这种机制使得代码更加灵活,可以根据实际需要进行动态调用,同时也更加符合OOP的封装、继承和多态的特性。
class Man{ private int id; private sDate jt; Man(int ia, int ya,int ma,int da){ /*构造方法的参数包括了sDate类的3个属性*/ id=ia; jt=new sDate(ya,ma,da); } void disp(){ System.out.println("编号:"+id); System.out.print("工作日期: "); jt.outdate(); } } class sDate{ private int year; private int month; private int day; sDate(int y,int m,int d){ year=y; if(m>0&&m<13) month=m; /*在构造方法中确定月份的值,如果月份的值不满足条件表达式,则设月份的默认值为1*/ else month=1; day=vDay(d); } private int vDay(int v){ int[] dM={0,31,28,31,30,31,30,31,31,30,31,30,31}; if(v>0&&v<=dM[month]) return v; else return 1; } void outdate(){ System.out.println(year+","+month+","+day); } } class text{ public static void main(String args[]){ Man m=new Man(123,1997,3,21); m.disp(); } }哪里错误
代码中存在语法错误,需要进行修正:
1. 在 sDate 类中,方法 `outdate()` 的拼写不正确,应该是 `outDate()`。
2. 在 sDate 类中,构造方法中对月份的判断条件表达式有误,应该是 `if(m>0 && m<13)`。
3. 在 sDate 类中,方法 `vDay()` 中月份的天数数组 `dM` 应该从下标 1 开始赋值,即 `int[] dM={31,28,31,30,31,30,31,31,30,31,30,31}`。
修改后的代码如下所示:
```java
class Man{
private int id;
private sDate jt;
Man(int ia, int ya, int ma, int da){
id = ia;
jt = new sDate(ya, ma, da);
}
void disp(){
System.out.println("编号:" + id);
System.out.print("工作日期: ");
jt.outDate();
}
}
class sDate{
private int year;
private int month;
private int day;
sDate(int y, int m, int d){
year = y;
if(m > 0 && m < 13)
month = m; // 在构造方法中确定月份的值,如果月份的值不满足条件表达式,则设月份的默认值为1
else
month = 1;
day = vDay(d);
}
private int vDay(int v){
int[] dM = {31,28,31,30,31,30,31,31,30,31,30,31}; // 月份天数数组从下标 1 开始赋值
if(v > 0 && v <= dM[month - 1])
return v;
else
return 1;
}
void outDate(){
System.out.println(year + "," + month + "," + day);
}
}
class Test{
public static void main(String args[]){
Man m = new Man(123, 1997, 3, 21);
m.disp();
}
}
```