抽象类继承初始化问题

package demo1;

public abstract class Super {
Super(){
print();
}
public abstract void print();
}

package demo1;

public class Sub extends Super{
private int i = 10;
public void print(){
System.out.println(i);
}
public static void main(String args[]){
Sub sub = new Sub();
sub.print();
}
}

Output:
0
10

这是为什么??

0

1个回答

这个涉及到类的初始化的问题
当你入口类Main方法里掉用Sub sub = new Sub(); 触发Sub类初始化,但他发现他有父类Super,而Super类没有初始化,所有先初始化父类,当初始化父类的时候,他的构造方法调用了一个抽象方法,所有找到子类的实现,(注意:这个时候的i值是0,默认值),所有输出0,之后初始化子类Sub, i的值是10,当调用print方法时候输出10

0
jlgzggwl0
jlgzggwl0 其实父类的方法已经被子类重写覆盖了,如果你的父类的方法不是抽象方法的话,你要调用的话只能通过super.方法名 调用,要不调用的依然是父类被子类的重写方法。
接近 5 年之前 回复
foreverxunyc
forever_cherry 也就是说在初始化父类构造器的时候发现有调用抽象方法后会自动找到其子类的实现,尽管子类的成员变量还没有被初始化,但是抽象方法已经被实现,所以输出的是0,父类初始化完成后,初始化子类。这么说是行得通。。。可是还是觉得父类在初始化时跑去调用子类的方法怪怪的。。。
接近 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
J抽象类继承问题
1.抽象类也是类,只不过本身不能实例化,要通过子类实例化。 2.是类就有构造方法,如果我们没有给出构造方法,系统将自动提供一个无参构造方法,如果我们给出了构造方法,系统将不会提供。 3.子类中所有的构造方法默认都会访问父类中空参构造方法--->也就是说,子类new对象的时候,先去父类中逛了一圈,完成了父类的初始化(父类初始化值存在子类new对象开辟堆内存的某块地方)(再说白点,每一个构造方法的第一
抽象类继承问题
如果从一个抽象类继承,而且想生成新类型的一个对象,就必须为基础类中的所有抽象方法提供方法定义。如果不这样做(完全可以选择不做),则衍生类也会是抽象的,而且编译器会强迫我们用abstract关键字标志那个类的“抽象”本质。rn问题:rn如果类B从抽象类从A继重,类C继便类B,类C会不会是抽象类?rn(假如类B都定义了抽象方法,类C没有定义抽象类A中的抽象方法)rn
C# 抽象类继承问题
很小的一段代码。。但我太菜了,看不出问题rn[code=C/C++]rnusing System;rnusing System.Collections.Generic;rnusing System.Linq;rnusing System.Text;rnrnnamespace Animalrnrn class Programrn rn public interface Animalrn rn void Move();rn rnrn abstract class Cat: Animal rn rn public void Eat()Console.Write("Eat!");rn rnrnrn public class Use : Catrn rn public override void Move()rn rn throw new NotImplementedException();rn rn rn rn static void Main(string[] args)rn rn Use u = Use();rn u.Move();rn rn rnrn[/code]rnrn编译之后,报错:Cat类比Use类可访问性低。 什么意思啊??
抽象类继承的问题
我的抽象类定义:rnrnrn在工程A中定义了抽象类:rnrn AbstractThread.h 文件rn[code=C/C++]rn#pragma oncernrn#include "windows.h"rn#include "string"rnusing namespace std;rnrn///抽象的线程基类rnclass AbstractThreadrnrnpublic:rn AbstractThread(void);rn virtual ~AbstractThread(void);rnrn virtual void Run(void * para)=0;rn DWORD Suspend();rn DWORD Resume();rn bool Stop();rn bool IsAlive();rn HANDLE GetHandle();rn string GetThreadID();rn string GetThreadName();rnprotected:rn string threadName;rn string threadID;rn HANDLE threadHandle;rn;rn[/code]rnrn在工程B中继承了AbstractThread类,rn头文件:ProductThread.hrn[code=C/C++]rn#pragma oncernrn#include "..\MutexThreads\AbstractThread.h"rn#include "windows.h"rnrntypedef structrnrn int Number1;rn int Number2;rn TPara;rnrnclass ProductThread:public AbstractThreadrnrnpublic:rnrn virtual void Run(void * para);rnrn ProductThread(void);rn virtual ~ProductThread(void);rnprivate:rnrn static unsigned _stdcall ProductNumber(void * para);rn static unsigned _stdcall WasteNumber(void * para);rnrn static HANDLE ProduceHandle;rn static HANDLE WasteHandle;rn;rn[/code]rnrnProductThread.cpp代码如下:rn[code=C/C++]rnHANDLE ProductThread::ProduceHandle=NULL;rnHANDLE ProductThread::WasteHandle=NULL;rnrnProductThread::ProductThread(void):AbstractThread()rnrn srand((unsigned)time(NULL));rn this->ProduceHandle=CreateSemaphore(NULL,1,1,NULL);rn this->WasteHandle=CreateSemaphore(NULL,0,1,NULL);rn this->threadName="";rnrnrnvoid ProductThread::Run(void * para)rnrn unsigned int a=0;rn this->threadHandle=(HANDLE)_beginthreadex(NULL,0,ProductThread::ProductNumber,para,CREATE_SUSPENDED,&a);rn char * temp=new char[255];rn memset(temp,'\0',255);rn _itoa(a,temp,10);rn this->threadID.assign(temp);rn delete[] temp;rnrnrnunsigned _stdcall ProductThread::ProductNumber(void * para)rnrn WaitForSingleObject(ProduceHandle,INFINITE);rnrn TPara * p=(TPara *)para;rn //等待生产的信号量,直到处于发信号状态,则生产数据rn /*int num1=rand();rn int num2=rand();*/rn p->Number1=rand();rn p->Number2=rand();rn Sleep(rand()%1000);rn ReleaseSemaphore(WasteHandle,1,NULL);rn //随机产生两个数字,返回给主调函数rn //并让消费信号量处于发信号状态rnrn return 0;rnrnrnunsigned _stdcall ProductThread::WasteNumber(void *para)rnrn WaitForSingleObject(WasteHandle,INFINITE);rnrn TPara *p=(TPara *) para;rnrn long sum=p->Number1+p->Number2;rn cout<Number1<<"+"<Number2<<"="<ProduceHandle,1,NULL);rn ReleaseSemaphore(this->WasteHandle,1,NULL);rnrn CloseHandle(this->ProduceHandle);rn CloseHandle(this->WasteHandle);rnrn[/code]rnrnrnrnrn编译的时候报错:rnrnError 1 error LNK2019: unresolved external symbol "public: virtual __thiscall AbstractThread::~AbstractThread(void)" (??1AbstractThread@@UAE@XZ) referenced in function __unwindfunclet$??0ProductThread@@QAE@XZ$0 ProductThread.obj SemaphoreThreadrnrnrnError 2 error LNK2019: unresolved external symbol "public: __thiscall AbstractThread::AbstractThread(void)" (??0AbstractThread@@QAE@XZ) referenced in function "public: __thiscall ProductThread::ProductThread(void)" (??0ProductThread@@QAE@XZ) ProductThread.obj SemaphoreThreadrnrnrnrnError 3 fatal error LNK1120: 2 unresolved externals F:\private\个人作品\c++\线程\Thread\Debug\SemaphoreThread.exe SemaphoreThreadrnrnrnrn很让人奇怪:在AbstractThread的同一工程中继承并且实现Run()成员函数,就没有问题,在工程B中同样的方式继承AbstractThread就报上面的错误,百思不得其解,望高手指点一下,谢谢!rn
新人,,提个抽象类继承的问题
interface Ivehiclern rn void run( );rn void stop( );rn rnrnrnrn abstract class CarCategory:Ivehiclern rn public void run( )rn rn rnrn public void stop( )rn rn rnrn abstract public void trun(byte dirction);rn rnrnrnrnrnrn abstract class Car:CarCategoryrn rn public void trun(byte dirction)rn rn /*“ConsoleApplication1.Car.trun(byte)”将隐藏继承的成员“ConsoleApplication1.CarCategory.trun(byte)”。rn * 若要使当前成员重写该实现,请添加关键字 override。否则,添加关键字 new。rn */rn abstract public void carryPerson( );rn rnrnrnrnrn class hongqi:Carrn rn hongqi( )rn rn rn void carryPerson( )rn rn /*“ConsoleApplication1.hongqi.carryPerson()”将隐藏继承的成员“ConsoleApplication1.Car.carryPerson()”。rn * 若要使当前成员重写该实现,请添加关键字 override。否则,添加关键字 new。rn */rnrnrnrn为什么trun(byte dirction)和void carryPerson( )方法,不能被实现了。。rn
关于类继承初始化问题
对于由引用类变量(class field)所引发的初始化,只会初始化真正定义该field的class。rnrn这句话怎么去理解?有什么样的例子可以证明这一句话的正确性!请高手帮忙写个简单例子!rn请高手指教,先谢为主,谢谢大家!
Java基础,抽象类继承
public class B1 extends A rn rn @Override rn void a() rn System.out.println(); rn rn rn public static void main(String[] args)rn rn B1 ss = new B1();rn B1.b();rn rn rn rnabstract class A rn int a=0;rn rn abstract void a(); rn void b() rn a++;rn System.out.println(a); rn rn rnrnrn这个那里错了~
抽象类继承实类
对于抽象类能否继承实类的为题rnpublic class Electronic implements Devicern publlic boid doIT() rnrnrnabstract class phone extends Electronic rn这段程序是正确的,不是说抽象类可以被实类继承,难道抽象类可以继承实类???而且这个phone一个抽象的方法都没有诶
c++抽象类继承
一个student类,lectureTeatre类,继承抽象module类,通过继承来实现接口
讨论抽象类继承
rn假如现在有一个系统类 ClassSys,它有一个事件rnprotected abstract void Work()rn我现在打算扩展一个中间类 ClassMiddle extends ClassSys,我的类需要实现方法 Work()以便响应事件。但是同时 ClassMiddle 也是一个 abstact class,需要它的子类 ClassFinal实现一个同名的方法Work()。 ClassMiddle 将通过一定的规则,在合适的时候引发(也就是调用) ClassFinal 的 Work()事件方法。rn请问如果实现?rn在 J2ME MIDP 2.0中有一个 GameCanvas 类,它是 Canvas 的子类。开发者扩展 GameCanvas 时需要实现一个 keyPressed() 方法以响应用户按键,但是同 Canvas 不同的是,GameCanvas 屏蔽了一部分按键操作。现在,如果我想写一个类来取代 GameCanvas,如果实现?
抽象类继承非抽象类
在java里面抽象类是常见的,一般情况下都是, 1. 抽象类被实体类继承 2. 抽象类被其他的抽象类继承 今天查看Spring源码,发现,public abstract class FactoryBeanRegistrySupport extends DefaultSingletonBeanRegistry {public class DefaultSingletonBeanRegist
java抽象类继承
抽象是把公共性质的属性,都抽取出来,形成所有类都具备的属性,便是抽象。 我们谈论java抽象是基于父类和子类的关系来描述的,比如动物类Animal,那么我们可以思考下,所有动物共同具备的特性,那就是都能够吃饭,都能够睡觉,那么这些就是动物共同具有的特性,这些就可以抽取出来,也就是抽象,形成单独的抽象类,用abstract来标识,abstract是在java中标识抽象类的依据。使用abstract修饰
java抽象类继承理解
 AcntFile 父类   WoRecpFileAcntFile子类的子类 public abstract class AcntFile { } AcntFile acntFile = new WoRecpFileAcntFile(inMap); acntFile.importDataBase(inMap); importDataBase父类中的方法 //父类中的抽象方法
抽象类继承SurfaceView不行,为什么?
我写的是:rnrnpublic static class MainView extends SurfaceView implements Callback{rnrnrn}rnrn不行,请问为什么?rnrn
静态方法如何从抽象类继承?
要写一个抽象类用于派生事件处理,如果把父类写成rn[code=Java]public abstract class Arnrn //一些静态属性rn rn public abstract void do();rn[/code]rnrn那么子类的方法不能写成静态的rn[code=Java]public class B extends Arnrn public static void do()rn rn …………rn rn[/code]rnrn是我的思路不符合java的思想吗?
抽象类继承实体类的前提验证 问题。。。 。。。
----抽象类是否可继承实体类,前提是实体类必须有明确的构造函数。-------rnrnrn如果这句话是正确的话,那么下面这段代码是不是不能通过编译?rnrnclass ConcreteCls rnrnabstract class ac2 extends ConcreteClsrnrnpublic class Testrnrn public static void main(String[] args)rn rn rnrnrn但是我编译运行都通过了,没问题呀。rn怎么样才能使实体类没有“明确的构造函数”呢?
一个关于内部类继承时候的初始化问题
是Thingking in java上的原例:rnclass Egg2rn protected class Yolkrn public Yolk()rn System.out.println("Egg2.Yolk()");rn rn public void f()rn System.out.println("Egg2.Yolk.f()");rn rn rnrn private Yolk y = new Yolk();rn public Egg2()//Egg 's Constructorrn System.out.println("New Egg2()");rn rn public void insertYolk(Yolk yy)rn y = yy;rn rn public void g()rn y.f();rn rnrnrnrnpublic class BigEgg2 extends Egg2rn public class Yolk extends Egg2.Yolkrn public Yolk()rn System.out.println("BigEgg2.Yolk()");rn rn public void f()rn System.out.println("BigEgg2.Yold.f()");rn rn rn public BigEgg2()rn insertYolk(new Yolk());rn rn public static void main(String[] args)rn Egg2 e2 = new BigEgg2();rn e2.g();rn rnrn他的运行结果是rnEgg2.Yolk()rnNew Egg2()rnEgg2.Yolk()rnBigEgg2.Yolk()rnBigEgg2.Yold.f()rn对与第一行的“Egg2.Yolk()”怎么来的我搞不清楚,我认为的结果是除去第一行的其余四行。
抽象类继承的使用-计算图形的周长和面积
先写出抽象类 /** * 图形类,抽象类 * @author Administrator * */ public abstract class Shape { //计算图形周长方法 public abstract double calcRound(); //计算图形面积方法 public abstract double calcArea(); }  再写出下面被继承的子...
由抽象类继承而来的派生类的构造函数的问题,请看代码
我这个代码总是有一个错误,就是实例化派生类对象的时候,不知道派生类的对象是怎么调用基类的构造函数的,是什么顺序,反正就是派生类是如何构造的地方有点不太清楚,请各位指点以下。rnrn#define max 100000rn#include rn#include "Card.cpp"rnrnclass ATM //定义一个自动取款机的抽象类rnrnprotected:rn Card myCard; //Card类的对象作为私有数据成员rn float totalmoney; //取款机总钱数rnrnpublic:rn ATM(Card& card) : myCard(card)rn rn totalmoney = max;rn rnrn virtual bool Fetchmoney(float money) = 0;rnrn virtual ~ATM()rn rn rn rnrn;rnrnclass IndustryATM: public ATM //派生一个工商银行的类rnrnrn bool Fetchmoney(float money)rn rn if(myCard.GetCardType() == industry)rn rn totalmoney = totalmoney - money;rnrn if(myCard.ChangeMoney(money))rn return true;rn rn elsern rn cout<<"非农业银行卡,需缴纳1%的手续费!"<
类继承问题
想分割窗口,自己添一个类CMySplitter,继承CSplitterWnd,可是从向导里面生成的时候,基类 中没有CSplitterWnd,再选择Generic Class,在Derived From中写上CSplitterWnd,可是生成的CMySplitter右键点击,不能添加虚函数和消息处理函数,请问问会的兄弟,有什么别的方法添加虚函数和消息处理函数?感激!rn
类继承问题?
请问如何从多个类中继承出一个类,就像iostream类是同时从istream和ostream两者共同继承过来的一样?rnrn来信:ximxc@sohu.com
类继承的问题 !
自定义一个类: TADOQryAncestor, 改写了Create:rn TADOQryAncestor = class(TADOQuery)rn privatern constructor Create(AOwner: TComponent); override;rn Private declarations rn publicrn Public declarations rn end;rnrnconstructor TADOQryAncestor.Create(AOwner: TComponent);rnbeginrn inherited Create(AOwner);rn showmessage('create');rnend;rnrn但是我定义了TADOQryAncestor的对象: rn ADOQryTmp := TADOQryAncestor.Create(self); //这里为什么不执行TADOQryAncestor.create里的语句呢 ?rn
类继承的问题.
如何让Btnbit继承其它类呢?包括click.rn谢谢啦,rn新手新学.
类继承的问题
想写个类B继承A,将B.prototype写在function B外面没有任何问题rn[code=JScript]rn function A()rn this.Display();rn rn rn rn A.prototype.Display=function()alert("display!");rn A.prototype.constructor=A;rnrn var a=new A();rn rn rn function B()rn this.Display();rn rn rn B.prototype=a;rn B.prototype.constructor=B;rnrn var b=new B();rn[/code]rnrn现在我想写在function B的里面就出问题了rn[code=JScript]rn function A()rn this.Display();rn rn rn rn A.prototype.Display=function()alert("display!");rn A.prototype.constructor=A;rnrn var a=new A();rn rn rn function B()rn B.prototype=a;rn B.prototype.constructor=B;rn this.Display();//这里老是报错:不支持方法Displayrn rnrn var b=new B();rn[/code]rn为什么写到里面后A的成员都没有继承到B了?
类继承问题...
一个虚基类中有一些被继承的数据.rn在派生类中必须对这些数据赋值.rnrn是在派生类的构造函数中, 对这些数据赋值.rn还是在派生类的构造函数中, 对基类构造函数传参, 用基类的构造函数来初始化?
类继承问题!
类继承问题! rn我自定义了一个类,并从该类派生新类。系统提示重载“Purview"方法未获取"0"参数 rnrn请教问题出在哪里?谢谢
类继承问题~~~~~~~~~~
[code=C/C++]rn#includernusing namespace std;rnclass animalrnrnpublic:rn void eat()rn rn cout << "animal eat" << endl;rn rnrn void sleep()rn rn cout << "animal sleep" << endl;rn rnrn void breathe()rn rn cout << "animal breathe" << endl;rn rn;rnrnclass fish:public animalrnrnpublic:rn void breathe()rn rn cout << "fish bubble" << endl;rn rn;rnvoid fn(animal *pan)rnrn pan->breathe();rnrnrnint main()rnrn animal *pan;rn fish fh;rn pan =&fh;rn fn(pan);rn return 0;rnrnrn[/code]rnrn有二个问题:rn1、为什么打印出来会是animal breathe,而不是fish bubble.rn2、我将 animal *pan; fish fh;rn这二句改为fish *pan; animal fn; 其它地方不动,为什么会报错,怎样改才可以使程序不报错。。rnrn
类继承 问题
TInfo = class(TObject)rnprotectedrn class funciton TableName(Mode: string): string;rnpublicrnrnend;rnrnrnTInfoWare = clas(TObject)rnpublicrn 怎么样把父类中的 TableName 声明为 publicrnend;rnrn---rn问题就是把父类中声明的 protected 的函数或过程 rn在子程声明 publicrnrn谢谢
类继承的问题!
子类是不是继承父类所有的方法、属性和字段!
类继承问题。。。。
class personrnrnprivate String name = "lucy";rnprivate int age;rnrnclass student extends personrnrnrnclass superDemo1rnrnpublic static void main(String[] args) rnrnrnrnrn请问子类student有name字段吗,如果有,他的值是"lucy"吗rn有的解释是父类的私有字段子类是可以继承的,只是不可以读取,我现在就想知道子类student有name字段吗,如果有,他的值是"lucy"吗?rn
相关热词 c# 线程顺序 c#昨天当前时间 c# 多进程 锁 c#mysql图片存取 c# ocx 委托事件 c# 读取类的属性和值 c# out 使用限制 c#获取url的id c#怎么进行分页查询 c# update 集合