① java 中当把子类对象赋值给父类对象后,父类调用的重构函数是子类的还是父类的,这个是不是和C++不一样啊
子类,伪代码
//2个类Text 父类,Text2 子类
Text aaa = new Text2();//子类对象赋给父类
aaa.outprint();//父子中都有这个方法,打印一句话,System.out.println("我是父(子)类");
结果是答应出"我是子类"
其实很好理解,子类的对象副职敬空卖给亮逗父类,但是NEW的还是子类的,引用还是指向子类的空间,通常我亏码们用对象副职,副职的也是引用,如
B b = new B();
A a = b;
此时是将b对象的引用副职给a,并没有重新new出空间
所以调用的还是子类的那片空间里的方法
② java中将子类的变量赋值给父类变量的问题
A是父类,B是子类
B b = new B();b是B类的实例对象的句柄
a = (A)b ; 是上溯类型,是安全的,b会上溯造型成A,
这样b便丢失了它的身份或者标识信息。
再次使用它的时候,会得到一个a(A类型)句柄,
而非指向B类型的句柄。
A a = new A();
B b = (B)a; 是下溯类型,是不安全的,A类型句柄会下溯造型成B类稿橘余型句柄
虽然通过下溯造型把a句柄变成了B类型句柄,
但通过句柄b调用的还是内存中存储的对象a的数据,在运行期检查时就会出现cast(溯型)违例或称异常
B b = (B)(A)new B();
(A)new B() 是上溯类型,B会上溯造型成A
(B)((A)new B())是下溯类型,A类型句柄会下溯造型键滚成B类型句柄
这样运行期检查是就不会抛出异常对象了;
通常使用下伍模溯类型简单举例:
ArrayList al = new ArrayList();
al.add(new String("我是字符串类型,是object子类"));
String str = (String)al.get(0);
//al.get(0); 返回的是object类型的,需要下溯类型成String。
因为我们知道放进去的时候是String类型的,取出时下溯转换成String是(程序员控制的)安全;
③ java父类对象给子类对象赋值强制转换后子类对象的属性是怎么一回事
代码要写在代码首散陆块者顷、方法里面。
class c{
public static void main(String args[]){
a a1, a2=new a();
b b1.b2=new b();
b1=(b)a2;
System.out.println(b1.b);
}
}
但还不能用的掘李,因为
b1=(b)a2; /// a2本来是a的实例,转换失败。
④ Java子类对象赋值给父类对象的问题
UseCase是基类
UseCase2 u=new UseCase();只能用UseCase的方法
而UseCase2 u=new sub(); 定义念纯sub类对象的同时也初始陪租化了UseCase2,这是可以同时用子类和父类的方法!
Sub extends UseCase2的芦高兆意思是Sub是子类,从UseCase2中继承的
希望你能明白~hehe,有问题给我message
⑤ 在java中实例化一个子类对象赋给父类对象引用或一个实现了接口的类的对象赋给接口的引用,有什么好处
这个问题不难!这是多态的一种应用:
把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需团帆消求的不断变化。
赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。
举个例子:从一个基类中派生,响应一个虚命令,产生不同的结果。
比如从某个基类继承出多个对象,其基类有一个虚方法Tdoit,然后其子类也有这个方法,但行为不同,然后这些子对象中的任何一个可以赋轿凯给其基类的对象,这样其基类的对象就可以执行不同的操作了。实际上你是在通过其基类来访问其子对象的,你要做的就是一个赋值操作。
使用继承性的结果就是可以创建一个类的家族,在认识这个类的家族时,就是把导出类的对象当作基类的对象,这种认识又叫作upcasting。这样认识的重要性在于:我们可以只针对基类写出一段程序,但它可以适应于这个类的家族,因为编译器会自动就找出合适的对象来执行操作。这种现象又称为多态性。而实现多态性的手段又叫称动态绑定(dynamicbinding)。
简单的说,建立一个父类的对象,它的内容可以是这个父类的,也可以是它的子类的,当子类拥有和父类同样的函数,当使用这个对象调用这个函数的时候,定义这个对象的类(也就是父类)里的同名函数将被调用,当在父类里的这个函数前加virtual关键字,那么子类的同名函塌知数将被调用。
例子在C++中:
classA{
public:
A(){}
virtualvoidfoo(){
coutfoo();
if(a!=NULL)
deletea;
return0;
}
这将显示:
ThisisB.
如果把virtual去掉,将显示:
ThisisA.
前面的多态实现使用抽象类,并定义了虚方法.
在java中:
多态,是面向对象的程序设计语言最核心的特征。多态,意味着一个对象有着多重特征,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。从程序设计的角度而言,多态可以这样来实现(以java语言为例):
publicinterfaceParent{
publicvoidsimpleCall();
}
publicclassChild_AimplementsParent{
publicvoidsimpleCall(){
//具体的实现细节;
}
}
publicclassChild_BimplementsParent{
publicvoidsimpleCall(){
//具体的实现细节;
}
}
//当然还可以有其他的实现
然后,我们就可以看到多态所展示的特性了:
Parentpa=newChild_A();
pa.simpleCall()则显然是调用Child_A的方法;
Parentpa=newChild_B();
pa.simpleCall()则是在调用Child_B的方法。所以,我们对于抽象的父类或者接口给出了我们的具体实现后,pa可以完全不用管实现的细节,只访问我们定义的方法,就可以了。事实上,这就是多态所起的作用,可以实现控制反转这在大量的J2EE轻量级框架中被用到,比如Spring的依赖注射机制。
⑥ java中子类如何对父类中的变量进行赋值并引用
用super关键字啊
比如你父类又一个int的实例变量i
在子类里用
super.i=10;
这样就行
⑦ c#或java里子类对象赋值给父类有什么用,举几个例子啊。
里氏替换原则:
定义一:如果对每一个类型为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);
⑧ java子类对象赋值给父类对象的问题
是,这是java的基本特性,向上继承。对于父类的引用一定可以使用子类。
⑨ java如何在子类中赋值给父类的变量
使侍神用世孝super关键字就可以了,比如:
父类里的ele属性
如果是public的直接super.ele="abc";
但如果是private的,并有set方法就调用set方法
super.setEle("abc"老返亏);