子类继承父类 为什么不能c 子类调用父类方法法

为什么子类继承父类无法使用构造方法 - ThinkPHP框架
我子类和父类都用__construct这个名字的时候,子类的构造方法执行了,父类的就没有执行,必须在子类使用parent::__construct();才行。
如果把子类的构造方法名字换成__initialize,父类的构造方法执行了,但是子类的构造方法怎么不运行了?
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。java继承中子类调用父类方法操作的变量是子类的变量还是父类的?_java吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:634,811贴子:
java继承中子类调用父类方法操作的变量是子类的变量还是父类的?收藏
2017java学习来上市公司博为峰学java,入学即签就业协议,不就业不收费,查看java课程!java好学吗?java课程来博为峰学,java工程师就业年薪十几万!
为什么super.x输出是12?父类的x没有被修改啊?a.hh()的输出可以证明如果是操作的被隐藏的变量或者方法呢,改变的又是谁?
a是new出来的,,x值所以是10,,b
new的时候,先new出个a来,属于b..。也就是b new出来的对象,包含a~来自百度贴吧for小米 4.2.1~仰望天空时,什么都比你高,你会自卑;俯视大地时,什么都比你低,你会自负;只有放宽视野,把天空和大地尽收眼底,才能在苍穹泛土之间找到你真正的位置。
楼主,我给你写的东西加了几句话,你自己研究一下吧,创建B的时候会默认创建一个A,那么这个A对象在你操作B的时候,它是一直存在的,具体是不是指向引用我不清楚,但是他们确实是操作的同一个对象。 我给每个类都加了一个构造函数,这样方便你理解。class ClassA {ClassA(){System.out.println("A create");}int x = 10;void f(){x=x+1;System.out.println("function F ::"+x);}void hh(){System.out.println(x);}} class ClassC extends ClassA{ClassC(){System.out.println("C create");}void g(){x=x+2;System.out.println("function G ::"+x);System.out.println("function G ::"+super.x);} } public
class ClassTest{ public static void main(String[] args) {ClassC c = new ClassC();c.g();c.f();ClassA a = new ClassA();a.hh();}}
是两个不同的对象,指向的是不同的内存地址,你对b对象的操作,不会影响a的值
创建一个B后,父类的属性和方法,也会在子类的空间中产生,x在堆中就只有一个变量空间,任何对x的更改都会改变这个变量本身的值。
我去还有中文
这么说吧,不从父类子类的角度讲,你这个现象类似于AAa=new A();b=a;这时,对a对象和b对象的任意操作,都会同时改变两个对象的变量值。 因为他们在堆里就那一个变量。
这地方还有别的问题请把class b中的x = x + 2换成int a = x + 2; 然后下面的打印x的地方换成打印a 结果就正确了12101110所以怀疑x 把父类中的x覆盖掉了, 我的理解是Class B的对象创建时会创建父类的所有成员变量,内存是同一块,因为x不是在子类中定义的,因此变量搜索时会上溯(一次检查方法内,本类以及父类),最终发现父类中有该变量,因此,实际操作的是父类变量。
两个对象,A是新的,未被影响
NIIT拥有30年java,小班面授课,1对1辅导,政府扶持+保障(企业定制99%任职),毕业学员告诉你,选择NIIT 任职入职so easy.
其实你B里面根本就没有定义 X
所以你引用的也是父类的
那么当X=X+2的时候改变的也是父类的X
声明一个int
X那么父类中的X就不会是12
导出类中是含有基类的子对象,
没问题啊 额
类名 哪有中文哦
幸亏Java 编码集支持中文 要不然。。。额
也可以 首先你得b对象是操作父类的变量的
a对象是重新实例化的对象
新的内存区域
具有相干性
父类引用指向子类对象时:不管是编译还是运行只看父类成员变量编译:父类中没有此变量,编译失败运行:不管在什么地方用到,都是调用父类中的那个成员变量
x 是实例变量,实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量,所以每次new 后,x的初始值都是10.
登录百度帐号推荐应用后使用快捷导航没有帐号?
只需一步,快速开始
查看: 4285|回复: 10
怎样理解父类的Private属性不能被子类继承?
UID416482在线时间 小时积分724帖子离线17395 天注册时间
高级会员, 积分 724, 距离下一级还需 276 积分
[/code]主类:
[code]package {
& & & & import flash.display.S
& & & & import nodihsop.E
& & & & import nodihsop.B
& & & & public class Main extends Sprite {
& & & & & & & & private var A:Base = new Base(&A&);
& & & & & & & & private var B:Extender = new Extender(&B&);
& & & & & & & & public function Main() {
& & & & & & & & & & & & init();
& & & & & & & & }
& & & & & & & & private function init() {
& & & & & & & & & & & & A.hello();
& && && && && && && && && && && && && && && && &B.hello();
& & & & & & & & }
父类(位于Nodihsop包中)
[code]package nodihsop{
& & & & public class Base {
& & & & & & & & private var _name:S
& & & & & & & & public function Base(name:String) {
& & & & & & & & & & & & _name =
& & & & & & & & }
& & & & & & & & private function sayHello() {
& & & & & & & & & & & & trace(_name);
& & & & & & & & }
& & & & & & & & public function hello() {
& & & & & & & & & & & & sayHello();
& & & & & & & & }
子类(位于nodihsop包中):
[code]package nodihsop{
& & & & public class Extender extends Base {
& & & & & & & & public function Extender(name:String) {
& & & & & & & & & & & & super(name);
& & & & & & & & }
运行输出:
疑问: B.hello();既执行了private方法sayHello();也访问了private属性_name,B自己并没有这个方法和这个属性的,怎么理解这个不能“继承”?难道这个不能“继承”应该理解成不能“访问”么?
11:44 上传
点击文件名下载附件
5.38 KB, 下载次数: 116
UID416482在线时间 小时积分724帖子离线17395 天注册时间
高级会员, 积分 724, 距离下一级还需 276 积分
其实我想的是,
B仅仅从A那里继承了一个对外接口
public function hello() {
& && && && &sayHello();
它不应该有sayHello();和_name,但是我就不不能理解为什么实际上它不仅可以sayHello(),而且还能输出_name
UID341141在线时间 小时积分1131帖子离线17395 天注册时间
银牌会员, 积分 1131, 距离下一级还需 1869 积分
private,public,internal,protected只是外部访问的权限不同,继承后private属性当然也被继承了,只是外部仍然访问不了,但类的内部还是可以访问到的
UID395440在线时间 小时积分625帖子离线17395 天注册时间
高级会员, 积分 625, 距离下一级还需 375 积分
晕,你用了一个公共方法去访问它当然可以了,如果不行还要private有什么用.
private就是只让你在内部可见的.
B.hello()调用的是基类的方法,仍然是通过基类去访问自己的private属性和方法.
UID55745在线时间 小时积分875帖子离线17395 天注册时间
高级会员, 积分 875, 距离下一级还需 125 积分
private的作用当然起到了,父类的public function hello(){}就相当于是个外部访问的接口,不通过这个你直接B.sayHello() 是不行的.
UID460495在线时间 小时积分71帖子离线17395 天注册时间
初级会员, 积分 71, 距离下一级还需 129 积分
不是说 除了&&private 以外其他的访问控制符都可以被子类继承的&&internal 要看情况·········
& &&&继续看看······学习ing·····················
UID416482在线时间 小时积分724帖子离线17395 天注册时间
高级会员, 积分 724, 距离下一级还需 276 积分
那它输出的那个&B&是什么东西呢?B应该是没有_name这个属性的.
UID416482在线时间 小时积分724帖子离线17395 天注册时间
高级会员, 积分 724, 距离下一级还需 276 积分
原帖由 [i]ycccc8202 于
18:07 发表
private的作用当然起到了,父类的public function hello(){}就相当于是个外部访问的接口,不通过这个你直接B.sayHello() 是不行的. 那么,这里是使用的是父类的私有方法,访问的是父类的私有属性了?难道是创建了一个父类的实例?
UID23735在线时间 小时积分567帖子离线17395 天注册时间
高级会员, 积分 567, 距离下一级还需 433 积分
private不被继承的意思是派生类不可见。。你在原来的类建立了一个_i的私有属性,并不妨碍在派生类再建一个,不会告诉你重复。
原来所有的方法其实都在的,因为原来的方法可能会去调。
只是可见性的问题,内存空间都是要占的。
UID361258在线时间 小时积分1971帖子离线17395 天注册时间
银牌会员, 积分 1971, 距离下一级还需 1029 积分
private function sayHello() {
& && && && &trace(_name);
& && &&&public function hello() {
& && && && &sayHello();
UID416482在线时间 小时积分724帖子离线17395 天注册时间
高级会员, 积分 724, 距离下一级还需 276 积分
原帖由 [i]flashyiyi 于
10:14 发表
private不被继承的意思是派生类不可见。。你在原来的类建立了一个_i的私有属性,并不妨碍在派生类再建一个,不会告诉你重复。
原来所有的方法其实都在的,因为原来的方法可能会去调。
只是可见性的问题,内存空间 ...
原来只是可见与不可见的问题,实际上内存里面依旧存在啊。谢谢了。我原来以为private既然不能被子类继承,那么就不应该有那个方法和那个属性才对,看来是有的,只是不能访问而已
Powered by在看java继承这一块的时候发现了一个问题,即父类未被子类覆盖的方法是如何调用的?
是子类拥有了父类的该方法只是没有显示表示,还是子类调用了父类的该方法。
为此做了一下验证
代码如下:
public class One {
protected void printA() {
System.out.println("父类printA");
private void printB() {
System.out.println("父类printB");
private void printC() {
System.out.println("父类printC");
protected void printABC() {
public class Two extends One {
protected void printA() {
System.out.println("子类printA");
private void printB() {
System.out.println("子类printB");
public void printC() {
System.out.println("父类printC");
public static void main(String[] args) {
Two t = new Two();
One t = new Two();
t.printABC();
对于第一种情况:子类拥有了父类的该方法只是没 有显示表示
由于printABCD方法中调用了printA()、printB()、printC()、printD(),并且printB()在父类中是私有的,所以不可以被子类继承。如果是这种情况的话,应该会编译时报错。然而没有报错,显然不是第一种情况。
对于第二种情况:子类调用了父类的该方法
根据运行结果
这里就会有个疑问-如果是调用了父类方法为什么会printA会使用子类的方法呢?
事实上运行过程应该是这样的,子类在调用printABCD方法时因为自己没有重写这个方法,所以是调用父类的该方法。
protected void printABCD() {
// TODO Auto-generated method stub
super.printABCD();
调用父类printABCD后接着要执行printA()、printB()、printC()、printD()四个方法。其中子类只对printA()进行了覆盖,printB()没有进行覆盖,printC()、printD()不存在覆盖。因此在调父类的printABCD方法,在执行时如果判断内部执行的方法没有对父类的方法进行覆盖则使用父类的方法,否则使用覆盖后的方法。
阅读(...) 评论()3065人阅读
JAVA(11)
&&& & & 今天看视频的时候,方立勋老师说到这个问题,他举出一个例子,说父亲有一个错误的方法,导致自己可能犯错,可能杀人放火。儿子继承了父亲这个方法,那么儿子肯定不能比父亲更坏,不能够在杀人放火的基础上还调戏妇女。
&&&&&&&& 听到这个问题之后,我就觉得不对劲。即便是模拟现实,儿子不能比父亲更加差劲这种东西也太违背自然规律了,因为社会上存在着很多比父亲差劲的儿子。而且并不是每一个抢劫犯都是抢劫犯的儿子。也并不是每一个不抢劫的人,生不出抢劫犯儿子。
&&&&&&& 后来自己就这个问题思考了下。
&&&&&&&& 得出以下的结论,当然,该结论虽然让我觉得比较正确,也不能确定其真伪。
&&&&&&&& 子类在覆盖父类方法的时候,父类的引用是可以调用该方法的,如果父类的引用调用子类的方法,那么这个多抛出来的异常,就可能处于一种无法被处理的状态。下面,我就通过代码进行一下演示:
&&&&&& 我们先定义一个Animal类:
&&&& class Animal
public void eat()throws IOException,FileNotFoundException
System.out.println(&eat&);
& 接着,我们再定义一个Tiger类继承该Animal类
class Tiger extends Animal
public void eat()throws IOException ,Exception
System.out.println(&Tiger eat animal&);
这样,tiger的eat方法里,就有一个Exception 异常,这个异常的级别高于IO。也就是说对IO异常的处理,无法处理Exception 异常。
这个时候,如果我们定义一个测试方法,测试动物吃东西这个方法。
class Test
&& &public void TestAnimalEat(Animal a)
&& &&& &try
&& &&& &&& &a.eat();
&& &&& &catch(FileNotFoundException e1)
&& &&& &&& &e1.printStackTrace();
&& &&& &catch(IOException e2)
&& &&& &&& &e2.printStackTrace();
那么,这个方法是完全正确的,因为他处理了eat方法的两个异常。一个抛出,一个捕获。
这个时候,如果我们再进行如下的操作:
class TestDemo
public static void main(String[] args)
Test t = new Test();
Tiger tiger = new Tiger();
t.TestAnimalEat(tiger);
则在调用tiger对象的时候,Test中的TestAnimalEat()方法只处理Animal类的eat()方法的两个异常,而这个Tiger类中的eat()方法多出来的Exception,就无法进行处理。所以,JAVA就不允许做这种子类抛出比父类更多的异常。
当然,这里说更多是不合适的,子类不能抛出父类异常本身和其子异常以外的其他异常。比如,如果父类抛出一个Exception 异常,那么子类就可以随心所欲的抛出很多的异常了。因为这些异常都是父类异常的子异常。
那么如果要联系现实,应该如何说呢。
&&&&&&& 一个修理家电的人,他能够修理冰箱,电脑,洗衣机,电视机。 一个年轻人从他这里学的技术,就只能修理这些家电,或者更少。你不能要求他教出来的徒弟用从他这里学的技术去修理直升飞机。
&&&&& 这个说法和老师说法其实也比较一致,但是徒弟这个说法可能比儿子这个说法,更加容易理解吧。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:14533次
排名:千里之外
原创:17篇
(1)(8)(4)(2)(2)

我要回帖

更多关于 子类继承父类调用顺序 的文章

 

随机推荐