黑马程序员技术交流社区
标题:
一个关于继承的实例,为什么出错呢,不可以这样用吗??
[打印本页]
作者:
Rockray
时间:
2013-10-14 20:33
标题:
一个关于继承的实例,为什么出错呢,不可以这样用吗??
本帖最后由 Rockray 于 2013-10-15 14:35 编辑
public class ExtendsDemo {
public static void main(String[] args){
Student s = new Student("张三",23);
Teacher t = new Teacher("李四",35);
Print(s);
Print(t);
}
private static void Print(Person p){
if(p instanceof Student){
System.out.println(p.name+" "+p.age+" "+p.eat());
p.learn();
}
else if(p instanceof Teacher){
System.out.println(p.name+" "+p.age+" "+p.eat());
p.teach();
}
else{ System.out.println("error");}
}
}
class Person{
public String name;
public int age;
public String eat(){
return "吃饭";
}
}
class Student extends Person{
Student(String name,int age){
this.name = name;
this.age = age;
}
public void learn(){
System.out.println("学习");
}
}
class Teacher extends Person{
Teacher(String name,int age){
this.name = name;
this.age = age;
}
public void teach(){
System.out.println("教课");
}
}
复制代码
出错详见:
1.jpg
(31.89 KB, 下载次数: 20)
下载附件
2013-10-14 20:32 上传
private static void Print(Person p){
if(p instanceof Student){
System.out.println(p.name+" "+p.age+" "+p.eat());
p.learn();
}
else if(p instanceof Teacher){
System.out.println(p.name+" "+p.age+" "+p.eat());
p.teach();
}
else{ System.out.println("error");}
}
复制代码
这一部分代码为什么错了呢,难道不可以这样用吗?
作者:
Rockray
时间:
2013-10-14 21:06
{:soso__8879803156314953240_4:}
求教各位大神
作者:
loading……99.9
时间:
2013-10-14 21:29
private static void Print(Person p)
{
if (p instanceof Student)
{
Student student = (Student)p;
System.out.println(student.name + " " + student.age + " " + student.eat());
student.learn();
}
else if (p instanceof Teacher)
{
Teacher t = (Teacher)p;
System.out.println(t.name + " " + t.age + " " + t.eat());
t.teach();
}
else
{
System.out.println("error");
}
}
复制代码
学习和上课都是person类的特定子类的方法,Person类没有这2个类。因此你需要强制类转换。
作者:
飘落
时间:
2013-10-14 21:32
learn()和teach()不是父类Person的方法,用p调用就会报错。
如果需要,可以把类型强制转换。改后代码如下:
private static void Print(Person p){
if(p instanceof Student){
System.out.println(p.name+" "+p.age+" "+p.eat());
Student s=(Student)p;
s.learn();
}
else if(p instanceof Teacher){
System.out.println(p.name+" "+p.age+" "+p.eat());
Teacher t=(Teacher)p;
t.teach();
}
else{ System.out.println("error");}
}
复制代码
作者:
王飚
时间:
2013-10-14 21:50
class ExtendsDemo {
public static void main(String[] args){
Student s = new Student("张三",23);
Teacher t = new Teacher("李四",35);
Print(s);
Print(t);
}
/*
楼主的问题是由于在下面的这个打印语句中发生了类型提升(多态),
而在这个Print方法中的输出语句中又没有将类型转换回来,也就是说,
编绎出现的错误是因为你的这个Person父类中并没有learn()和teache()的方法;
我在下面注释部分已经帮楼主作了更改:
*/
private static void Print(Person p)
{
if(p instanceof Student)
{
Student s=(Student)p;//这里,将类型转为Student(),因为传入的是父类的类型Person;
System.out.println(s.name+" "+s.age+" "+s.eat());//这里使用的是子类Student的方法;
s.learn();
}
else if(p instanceof Teacher)
{
Teacher t=(Teacher)p;//这里,将类型转为Teacher(),因为传入的是父类的类型Person;
System.out.println(t.name+" "+t.age+" "+t.eat());//这里使用的是子类Teacher的方法;
t.teach();
}
else{ System.out.println("error");}
}
}
class Person{
public String name;
public int age;
public String eat(){
return "吃饭";
}
}
class Student extends Person{
Student(String name,int age){
this.name = name;
this.age = age;
}
public void learn(){
System.out.println("学习");
}
}
class Teacher extends Person{
Teacher(String name,int age){
this.name = name;
this.age = age;
}
public void teach(){
System.out.println("教课");
}
}
复制代码
作者:
hyz123456
时间:
2013-10-14 22:03
嗯 需要强制转换,或者你把父类Person类里面加上learn方法
作者:
Rockray
时间:
2013-10-15 14:35
谢谢大家,我懂了{:soso__14649321626812542408_7:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2