c#或java里子类对象赋值给父类有什么用,举几个例子啊。
我看视频学的。它里面是如下代码,绕来绕去的有什么意义啊。//Person是父类,父类函数PersonSay()Personp=newStudent();p.PersonS...
我看视频学的。 它里面是如下代码,绕来绕去的有什么意义啊。
//Person是父类 ,父类函数PersonSay()
Person p = new Student();
p.PersonSay();
Student s=(Student )p; //把p强转为Student类型后赋给s
s.StudentSay();
是叫里氏转换吧,我想知道它的实际用途,求举例啊。 展开
//Person是父类 ,父类函数PersonSay()
Person p = new Student();
p.PersonSay();
Student s=(Student )p; //把p强转为Student类型后赋给s
s.StudentSay();
是叫里氏转换吧,我想知道它的实际用途,求举例啊。 展开
2个回答
展开全部
里氏替换原则:
定义一:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。
定义二:所有引用基类的地方必须能透明地使用其子类的对象。
大概的要求是:
1、父类对象指向子类实例,向上转型和向下转型是里氏替换的一种应用。
2、子类必须完全实现父类的方法,父类对象出现的地方都可以用子类对象进行替换。
这是里氏替换的主要内涵,下面对这两种体现分别进行代码举例。
定义一个抽象类Person:
public abstract class Person{
public abstract String getDetails();
}
用Student类来继承Person
public class Student extends Person{
private String stuName;
private int age;
private double score;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String stuName, int age, double score) {
super();
this.stuName = stuName;
this.age = age;
this.score = score;
}
@Override
public String getDetails() {
// TODO Auto-generated method stub
return this.stuName + this.age + this.score;
}
}
在Test类里面可以用:
Person person = new Student();//这是向上转型。
也可以定义:
Student student = new Student(“stu”,19,99);
可以将student对象用在所有应该使用Person类型的地方。
Private List<Person> person = new ArrayList<Person>();
Person.add(student);
定义一:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。
定义二:所有引用基类的地方必须能透明地使用其子类的对象。
大概的要求是:
1、父类对象指向子类实例,向上转型和向下转型是里氏替换的一种应用。
2、子类必须完全实现父类的方法,父类对象出现的地方都可以用子类对象进行替换。
这是里氏替换的主要内涵,下面对这两种体现分别进行代码举例。
定义一个抽象类Person:
public abstract class Person{
public abstract String getDetails();
}
用Student类来继承Person
public class Student extends Person{
private String stuName;
private int age;
private double score;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String stuName, int age, double score) {
super();
this.stuName = stuName;
this.age = age;
this.score = score;
}
@Override
public String getDetails() {
// TODO Auto-generated method stub
return this.stuName + this.age + this.score;
}
}
在Test类里面可以用:
Person person = new Student();//这是向上转型。
也可以定义:
Student student = new Student(“stu”,19,99);
可以将student对象用在所有应该使用Person类型的地方。
Private List<Person> person = new ArrayList<Person>();
Person.add(student);
展开全部
举个例子:
你第一天去学校上课,假如其他同学你都不认识,你知不知道别的同学会些什么?(可能你同桌会弹吉他,你前面的同学很会唱歌),这些在你和他们第一次见面的时候你是不知道。老师也不知道,老师想要某一个学生站起来回答问题,老师知道不管是哪个学生都会双腿站起来,都会说中国话(当然这是在班级里没有残疾人的情况下),知道这两点老师就可以叫某个学生起来回答问题了,对吧。
在这个例子里,会说中国话就代表你的PersonSay()方法,老师就是使用你这个方法的人,那么老师还需不需要知道具体是哪个学生了?不需要了,可以随意点名,因为这个班级里都是人类,都会站起来说中国话。这样我就可以用父类的引用指向子类的对象了。也就是Person p = new Student();
但是,如果下一节课是音乐课,音乐老师要找一位同学起来唱歌,一位同学用吉他来伴奏,这时候就不能像上面的老师那样随便点名了,就要找你同桌上去弹吉他,你前面的同学上去唱歌,因为就他俩会这个。但是他俩也一样会站起来说中国话;这时候就可以Student s=(Student )p;后面我还要用到,s.song()唱歌的方法,这时候就没办法用p.song了,因为不是每个同学都会唱歌
这个牵扯到很多东西,包括向上转型(自动类型转化),继承,多态。为多种设置模式服务(比如如工厂模式,代理模式),还有反射机制。
你第一天去学校上课,假如其他同学你都不认识,你知不知道别的同学会些什么?(可能你同桌会弹吉他,你前面的同学很会唱歌),这些在你和他们第一次见面的时候你是不知道。老师也不知道,老师想要某一个学生站起来回答问题,老师知道不管是哪个学生都会双腿站起来,都会说中国话(当然这是在班级里没有残疾人的情况下),知道这两点老师就可以叫某个学生起来回答问题了,对吧。
在这个例子里,会说中国话就代表你的PersonSay()方法,老师就是使用你这个方法的人,那么老师还需不需要知道具体是哪个学生了?不需要了,可以随意点名,因为这个班级里都是人类,都会站起来说中国话。这样我就可以用父类的引用指向子类的对象了。也就是Person p = new Student();
但是,如果下一节课是音乐课,音乐老师要找一位同学起来唱歌,一位同学用吉他来伴奏,这时候就不能像上面的老师那样随便点名了,就要找你同桌上去弹吉他,你前面的同学上去唱歌,因为就他俩会这个。但是他俩也一样会站起来说中国话;这时候就可以Student s=(Student )p;后面我还要用到,s.song()唱歌的方法,这时候就没办法用p.song了,因为不是每个同学都会唱歌
这个牵扯到很多东西,包括向上转型(自动类型转化),继承,多态。为多种设置模式服务(比如如工厂模式,代理模式),还有反射机制。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |