① 子类继承父类怎么在父类的方法中访问子类的变量
这是“动态绑定”,动态绑定是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
而想实现“动态绑定”,必须有继承、重写且父类引用指向子类对象,满足了这3条就属于“动态绑定”,而它的好处就是像你说的那样,父类引用访问的是子类对象的方法,你看下边的例子吧:
publicclassA
{
publicstaticvoidmain(Stringargs[])
{
Aa=newB();
print(ainstanceofA);
print(ainstanceofB);
a.sayHello();
a=newC();
print(ainstanceofA);
print(ainstanceofC);
a.sayHello();
}
voidsayHello()
{
print("Hello!");
}
publicstaticvoidprint(Objectobj)
{
System.out.println(obj);
}
publicstaticvoidprint()
{
System.out.println();
}
}
classBextendsA
{
voidsayHello()
{
print("Hello,I'mB!");
}
}
classCextendsA
{
voidsayHello()
{
print("Hello,I'mC!");
}
}
它的输出结果是:
而不是输出的“Hello”,从输出的2个true可以看出这里采用的就是“父类引用指向子类对象”,你先别问为什么输出的不是“Hello”,其实实际情况也正是我们希望输出“Hello,I'm B”要好一些,因为我们new的是A类的子类B和C,虽然它们2个都可以直接采用a.sayHello来调用,但如果输出2个“Hello”,那跟我们直接new一个A类的对象没什么区别。如果我们要想不管A有多少子类,都采用a.sayHello来调用(好记、易写、易改),且java没有“动态绑定机制”,那么父类A的sayHello方法可就不好写了,得先判断是哪个子类,再调用相关子类的sayHello方法,这跟不采用继承,直接new个B和C的对象,再采用b.sayHello、c.sayHello没什么2样,那么这里的“继承”将毫无意义,而且如果日后你你还需要加一个子类D,你还需要new个D的对象,再采用d.sayHello。
顺便,这里你应该还看到了我的父类A还自定义了一个print方法,它的参数既不是String也不是int、double,而是String类、int的包装类、double的包装类等类的父类对象Object类,所以我的sayHello方法里给print函数传递的是String类(父类Object的引用指向子类对象String类),而main方法里的print(a instanceof A)语句传递的是boolean的包装类(父类Object的引用指向子类对象Boolean类),所以这2种调用也是用了“动态绑定”,如果不用呢?不是很多新手都希望java能像C那样直接print("Hello World")多好,那么如果不用“动态绑定”,光是8个基本类型你就需要重写8个print函数,而且,System.out.println语句传递的参数个数也是不确定的(尽管最后都连接成1个String参数),你不用“动态绑定”如何重写?你写不出来!
再举个例子,如果你写了一个小游戏,几十中坦克都继承于同一个父类:Tank类,然后,你想在游戏界面新建1个坦克,那你的main方法只需要统统采用类似于a.Draw()的语句去画一个坦克即可(全用父类对象的引用),而不需要先判断是哪个子类,再采用类似【case b:b.Draw();break;case c:c.Draw();break;……case n:n.Draw();break;】的语句(几十、几百个子类,你光判断语句恐怕就几百行了吧?),同样开火、移动都只需要调用a.Fire()、a.up()、a.down()、a.Left()、a.Right()即可。而且,如果日后你再想新加1个叫Tank99的子类,那么你的主方法里关于生成一辆Tank99坦克和Tank99的开火、移动等一系列语句都无需修改,你只需要写一个Tank99类,继承并重写Tank父类的方法即可(你不采用“动态绑定”,那么主方法里的一切相关方法全部都需要修改,忘了1个地方,程序就出错了)。程序的可扩展性和健壮性很好,这就是java中“动态绑定机制”的好处。
② 父访问子 和 父传子 就是 props 和ref 分别有什么区别
REF是Reference的缩写,为参考尺寸的意思。
参考尺寸依ASME Y14.5上的定义是:在别处已有标示的尺寸,为了看图人的方便,在其他位置重复标示的尺寸。可以由现有尺寸计算出来的尺寸,但也是为了看图人的方便,而标示的尺寸。参考尺寸是不可量测的。
③ c++父类访问子类保护成员 wtl,stl
就像它报的错误那样,类的实例不能访问类的protected成员函数,
T* pT = static_cast<T*>(this); 把this指针强制转换,
转成D1类指针时,由于D1中没有定义PrintClassName,所以用基类的那个,相当于用回了this指针,类内访问自身的protected是合法的;
转成D2类指针时,此时是D2类外用D2的指针访问D2的protected成员,这是不允许滴
④ WordPress中页面属性“父级”是干什么的求详解!!!
父页面就相当于一个大的标题,下面有子标题,形成一个下拉那种,虽然内容各自不同,但是你打开子页面的时候,网站连接会显示在父页面的下面
⑤ C++如何用父类访问子类函数呢
所谓继承,就是指子类“是一种”基类。所以子类一定会具备基类的所有特征。
子类无法访问基类的私有成员,所以必须调用父类的构造函数来初始化父类的成员。
对于子类来说,它不是“不会调用父类的构造函数”,而是“隠藏”了它。必要时候,你还是可以用特殊方法显式调用的。
为了达到你的目的,你有两个选择:
一,为基类提供一个怠工(mmy)构造函数,不作为。
二,声明为虚函数。
BTW,构造函数唯一的目的在于初始化对象。获取资源而不初始化,有悖RAII原则。所以基本上,第一种情况不大可能出现。
⑥ Java中,“子类访问父类的方法”与“子类调用父类的方法”访问和调用区别是什么
其实访问和调用没区别,不过对方法一般是说调用,对成员变量说访问
⑦ 子类可以访问父类的保护成员,这个访问是怎么访问的
你说的没错,但注意是子类的内部可是调用父类的protected成员,不是在别的包new一个子类,再去调用
代码?
⑧ java子类中如何访问和修改父类成员
根据父类成员的访问权限修饰词分为两种情况:
①父类成员域由private修饰,那么在子类中不能直接访问父类成员域,但是可以通过父类中的公共方法访问以及修改父类成员域。如:
class FatherClass{
private int a;
public int geta(){ return a;}
public void seta(int a){this.a=a;}
}
则在子类中可以通过geta获得父类的成员域的值,通过seta修改父类成员域的值
②父类成员由public或protected或default(不写访问权限修饰词),在子类中可以直接访问父类成员域,可以修改继承的父类成员域,但是不能直接修改父类本身的成员域(可以通过上面所说的public void seta(int a){this.a=a;}对父类本身的成员域进行修改),以下是示例代码:
父类本身的a与子类从父类继承的a占据两个不同的独立的存储空间,在继承之后,他们的值互不相干(继承的时候进行值传递),这样可以避免因为子类中的操作而导致对父类的a的值进行预期结果之外的修改