class Program
{
static void Main(string[] args)
{
Base k = new Derived();这里能解释一下?
// k 里面没有子类的方法??
}
} abstract class Base
{
public int l; public Base()
{
Console.WriteLine("base");
} public abstract void tt(); public void kk()
{
Console.WriteLine("Base");
} public virtual void kkkk()
{
Console.WriteLine("Base virtual");
}
} class Derived : Base
{
public Derived()
{
Console.WriteLine("Derivee");
} public override void tt()
{
l = 22;
throw new NotImplementedException();
} public new void kkkk(){} public void ggggggggggg()
{
}
}
{
static void Main(string[] args)
{
Base k = new Derived();这里能解释一下?
// k 里面没有子类的方法??
}
} abstract class Base
{
public int l; public Base()
{
Console.WriteLine("base");
} public abstract void tt(); public void kk()
{
Console.WriteLine("Base");
} public virtual void kkkk()
{
Console.WriteLine("Base virtual");
}
} class Derived : Base
{
public Derived()
{
Console.WriteLine("Derivee");
} public override void tt()
{
l = 22;
throw new NotImplementedException();
} public new void kkkk(){} public void ggggggggggg()
{
}
}
Base k = new Derived();这里能解释一下?
// k 里面没有子类的方法??
=================================================楼主的意思是说你用k.下拉出的函数列表里找不到ggggggggggg()是么。
、
我的理解是:你用Base k = new Derived();就表示k是一个类型为Base的对象引用,虽然在 赋值的时候被赋予了一个
Derived类的引用,但是编译器是不会帮你做这个转换的,所以你是找不到的。多态是说对于同一个方法名,系统会根据对象引用的类型调用不同的方法。比如你定义个动物类,加上一个vitual的方法是“吼叫”,然后你继承一个类是“狗”。在狗类里重写这个函数,添加一些个性化的东西,然后你可以定义一个动物类的对象引用,给他赋值狗类的实例,这样你可以调用该变量.叫()方法,但是执行的是子类的实现方式,不知道这样说你明白没有。
// k 里面没有子类的方法??
--------
你连继承都没搞清楚...所谓多态是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果...跟你的问题没有什么关系...
http://blog.csdn.net/cc_net
没有继承和虚方法
还谈什么多态从汇编级别说,对于一般非虚方法,在编译时就确定了调用方法的对象和方法地址.
而多态是在编译时无法确定调用的对象,而使用call {对象方法表地址+方法槽偏移}来确定方法的地址每个对象都有自己的方法表,在运行时,方法隐藏传递一个this指针标识对象,也就确定了调用方法的对象.汇编级是不知道什么多态的
从代码级来说,多态就是通过父类的变量,调用方法,单在运行时更具变量指向的实际对象类型决定调用那个方法
// k 里面没有子类的方法??
首先k被声明为Base类型,只拥有Base实例的方法,它不会拥有在Derived中有而在Base中没有的方法
如果要使用Derived中的自定义的方法,必须声明成Derived实例.
所谓多态就是
类Derived继承自抽象类Base
类OtherInstance继承自抽象类Base
Base k = new Derived();
Base another = new OtherInstance();
当你调用k.tt方法时,会自动找到Derived的tt方法
当你调用another.tt方法时,会自动找到OtherInstance的方法
所以,同样是Base类的实例,但又有多种形态
子类对象可以当作父类来看
Animal a=new Dog();
创建一个狗对象,把它的值给了一个Animal的引用
new Dog()是运行是类型,是客观的,是什么就是什么
Animal a是一种引用类型,把对象当成什么看是主观的
假设有一个类Aclass,由它派生了一个子类Bclass,那么,我们可以将子类Bclass的对象赋给父类的变量:Aclass a=Bclass(),这就是多态。
没有用多态
public class CalClass(){
.....
public int calTeacherBirthYear(Teacher t){
//根据参数t的年龄来计算教师的出生年代
}
public int calStudentBirthYear(Student s){
//根据参数s的年龄来计算学生的出生年代
}
}如果我们用多态的概念,我们只要定义一个方法来计算就可以了 .....
public int calPersonBirthYear(Person p){
//根据参数p的年龄来计算出生年代
}
如果需要计算某个学生的出生年代,只需要将这个学生对应的对象当作参数传递给这个方法,如果需要计算某个老师的出生年代,只需要将这个老师对应的对象当作参数传递给这个方法。
在使用多态来传递参数的时候,有一个问题需要注意;一个对象只能有一种确切的数据类型,如果将一个变量声明为父类的引用类型,那么,即使它引用的对象是某个子类的对象,编译器也只是将这个对象 当作是父类型对象,因此若一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类添加的属性呵方法。
比如:我们用Person(类)来声明一个变量,然后再将这个变量指向Teacher(类),这个时候,出不能用这个变量来调用子类Teacher特有的方法或属性了;Person p;
p=new Teacher();
p.setDepartment("数学教研室");
接口 IPersonInfo 中定义一个方法叫 getName() ;就是说,抽象出了一个人,并且写出了一个方法,要得到人名。那么说,你的上下文中,也就是客户程序。。说白了就是调用处,就是片理这个人接口的地方
public static void main( String[] args)
{
IPersonInfo per = new StudentPerson() ;
per.getName() ;
}
在这里,我们有一个StudentPerson类是实现了接口的类,”学生是人“ 符合is a的关系。。
IPersonInfo per = new StudentPerson() ;
我们用父类的引用指向子类的实例。。这就是多态,也就是迟绑定,程序这样就可以扩展,封装有可能变化的点。
不知道你明白否。
Base k = new Derived();这里能解释一下?
// k 里面没有子类的方法??
}
解答:
变量k本为Derived类型,但此时其向上转型为Base类型。
在编译时,java会找其对应Base类型中的方法调用,并不会调用Base中没有的方法。当调用父类Base的方法而子类Derived又重写(@Override)了其父类的方法时,那么在运行时,
jvm中规定,自动调用子类中的方法。这一种现象就是多态。多态的好处是,通过父类中定义统一的方法,子类中用不同的方法实现。
在调用时只需向上转型为父类,统一调用父类中的方法,即可在运行时执行对应子类中的方法,
并不需要为不同的子类创建不同的调用方法。
极大的方便了其调用和以后的修改。
{
Base k = new Derived();这里能解释一下?
// k 里面没有子类的方法??
} 这里的就量k 的类型为Base(父类),new Derived()是实例化的一个子类对像。你把值传和了一个作为父类的变量k。也就是说k 同时有了父类与子类的所有公有属性和方法。但是,在继承里,子类继承父类,也就可以调用父类里的所有公有属性和方法,但是父类是不能调用子类里的自己的方法和属性。 所以你这里的k是父类的一个对象,它不能继承和调用子类特有属性和方法。
你可以这样: Derived k=new Derived();/new Base(); 这样k现在作为子类的一个对象,当然也就可以调用自己特有的属性和方法了。
簡單地說,多態就是對象可以表現出不同類的特性,例子樓上應有很多了
这是编译期和运行期的区别
如同一个类里面有方法
int fish{
}
int fish(char x){
}
分别是:overwriting & overloading
// k 里面没有子类的方法?? 这里的意思是指申明一个父类对象k引用的是子类对象Derived..
如果父类里面的没有的方法是调不到的..是父类对象..不是子类..只是引用的子类对象而已如果子类重写了父类的方法..则调用用的时候实际调用的是子类的方法..因为父类的方法被子类给覆盖掉了...
这样说可以明白么..
1.要有extends
2.要有,类型转换;看看think in java 第7章;
面向对象编程风格有三个要素:多态,继承,封装
多态主要与虚函数有关,例如你在一个基类A中实现了一个虚函数Func(),在子类B中重写了这个虚函数,这时你将字类实例化,然后将这个子类对象隐式转化为一个基类A的对象,那么当你调用虚函数Func()时,你将自动调用子类实现的Func()函数。代码如下: public class A
{
public virtual void Func(){}
}
public class B
{
public override void Func(){}
}//下面是Main()函数中的执行代码
B b=new B();
A a=new A();
a.Func(); //此处调用的是B中Func()的实现多态很变态 有多种回答
实现方式 1,继承多态(C#单继承)2,接口多态(多继承)