求教关于构造函数链的问题

胖鸟飞不动 2019-01-25 03:41:56



关于这段内容,不是特别明白 ,这里隐性的调用父类构造函数,Animal和Object 两个内核算什么?说对象也不是对象。该怎么理解它们的存在?
...全文
285 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2019-01-29
  • 打赏
  • 举报
回复
引用 14 楼 versus117 的回复:
[quote=引用 6 楼 qq_39936465 的回复:]
[quote=引用 12 楼 versus117 的回复:]


我也思考了这个关系问题,如果按照书中的图来看的话 准确的说是包含了父类这个数据,但是却不能说包含了这个父类。子类extends父类, 是把父类具体化,是对父类进行扩充。这样理解上图 ,就会比较清晰了,如果是讨论集合之间关系,用韦恩图表示的话,就不能像上述的图那般了。


我觉得你还是有误区,子类就是包含父类。子类中如果什么都不写就完全继承了父类,哪怕是复写父类方法或变量,也可以用super来调用的,这些变量在初始化时已经存在了,就算父类的私有变量,子类也是完美继承的,只是子类没权利使用而已。在java里子类就是完全继承了父类的所有东西。[/quote]


我的意思是和你差不多的,只是这里包含的只是它的数据(当然从此图上看,这层数据有个叫父类的外壳),从数据上来看是对父类的延伸和扩展。但从我们一般概念上来说,狮子 只能包含于动物,否则逻辑不通的。只是我还有个疑问:子类隐性的继承父类变量,在内存上是如何表示的?毕竟官方文档是说不继承私有变量的,感觉他们的意思是自己无法直接使用的就是不继承的。按照这图来看,假设我要访问父类变量的时候是需要跳进这层壳里用setter和getter。貌似是要有个跳转指令 。[/quote]

子类是完全继承父类的所有东西的,前面说了哪怕是你复写,或者父类是私有变量,这里在子类被初始化的时候都会被初始化并开辟空间被保存起来,至于你能不能使用,这要看父类有没有设定方法让你来调用了。举个例子来说好比,一个是动物父类,他设定所有有头脑的都是动物,另一个父类是植物,所有没头脑都是植物,这个2个变量就有私有性质,是不能让你更改的,因为一旦更改后你的父类就变为其他父类的,这是一种保护机制吧。
胖鸟飞不动 2019-01-29
  • 打赏
  • 举报
回复
引用 6 楼 qq_39936465 的回复:
[quote=引用 12 楼 versus117 的回复:] 我也思考了这个关系问题,如果按照书中的图来看的话 准确的说是包含了父类这个数据,但是却不能说包含了这个父类。子类extends父类, 是把父类具体化,是对父类进行扩充。这样理解上图 ,就会比较清晰了,如果是讨论集合之间关系,用韦恩图表示的话,就不能像上述的图那般了。
我觉得你还是有误区,子类就是包含父类。子类中如果什么都不写就完全继承了父类,哪怕是复写父类方法或变量,也可以用super来调用的,这些变量在初始化时已经存在了,就算父类的私有变量,子类也是完美继承的,只是子类没权利使用而已。在java里子类就是完全继承了父类的所有东西。[/quote] 我的意思是和你差不多的,只是这里包含的只是它的数据(当然从此图上看,这层数据有个叫父类的外壳),从数据上来看是对父类的延伸和扩展。但从我们一般概念上来说,狮子 只能包含于动物,否则逻辑不通的。只是我还有个疑问:子类隐性的继承父类变量,在内存上是如何表示的?毕竟官方文档是说不继承私有变量的,感觉他们的意思是自己无法直接使用的就是不继承的。按照这图来看,假设我要访问父类变量的时候是需要跳进这层壳里用setter和getter。貌似是要有个跳转指令 。
qq_39936465 2019-01-29
  • 打赏
  • 举报
回复
引用 12 楼 versus117 的回复:
我也思考了这个关系问题,如果按照书中的图来看的话 准确的说是包含了父类这个数据,但是却不能说包含了这个父类。子类extends父类, 是把父类具体化,是对父类进行扩充。这样理解上图 ,就会比较清晰了,如果是讨论集合之间关系,用韦恩图表示的话,就不能像上述的图那般了。


我觉得你还是有误区,子类就是包含父类。子类中如果什么都不写就完全继承了父类,哪怕是复写父类方法或变量,也可以用super来调用的,这些变量在初始化时已经存在了,就算父类的私有变量,子类也是完美继承的,只是子类没权利使用而已。在java里子类就是完全继承了父类的所有东西。
qq_39936465 2019-01-28
  • 打赏
  • 举报
回复
引用 10 楼 versus117 的回复:
[quote=引用 7 楼 pengfeizhang1994 的回复:]
[quote=引用 3 楼 versus117 的回复:]
[quote=引用 1 楼 pengfeizhang1994 的回复:]
这段话的意思主要为:
要创建一个你(Hippo),需要先创建你的父亲(Animal)
然后不断循环找下去,父亲需要祖父,。。。。直到找到人类祖先(Object)
明白了否

你好,可能是我没有表述清楚,我想问的是这样隐性的调用了Animal和Object的构造函数,里面包含的Animal模块和Object模块算什么呢?就是单纯的类似“集合包含”的关系?Hippo 包含Animal ,Animail 包含了Object,Animal和Object就是两个数据集合?[/quote]
我看了一下,确实所有属性都会继承,包含这个概念,看你怎么理解了。我理解的子类父类,应该说子类是继承了父类所有属性,但是说包涵父类 是不对的,如果说动物包含老虎。狮子是对的,狮子老虎是子类,动物是父类一样。但是说狮子包含动物那就说不通了。
父类相当于是所有子类的一个共有属性的提炼吧[/quote]

确实,不应该说包含,关键字extends的意思也有延伸,外延之意。[/quote]

我觉得你对含义的理解有问题,这里子类可能是包含父类所有内容,但是你对父类理解有问题,这里的父类不是子类的集合,而且子类的交集,还是那狮子和动物的例子来说,动物是父类,这里父类只是所有动物的共有属性,而狮子子类有自己的特有属性,只有特有属性+共有属性你才知道这个是动物中的狮子,如果只说子类特有属性就能判断是狮子,那么这个父子关系就没存在的必要了。
胖鸟飞不动 2019-01-28
  • 打赏
  • 举报
回复
引用 7 楼 pengfeizhang1994 的回复:
[quote=引用 3 楼 versus117 的回复:] [quote=引用 1 楼 pengfeizhang1994 的回复:] 这段话的意思主要为: 要创建一个你(Hippo),需要先创建你的父亲(Animal) 然后不断循环找下去,父亲需要祖父,。。。。直到找到人类祖先(Object) 明白了否
你好,可能是我没有表述清楚,我想问的是这样隐性的调用了Animal和Object的构造函数,里面包含的Animal模块和Object模块算什么呢?就是单纯的类似“集合包含”的关系?Hippo 包含Animal ,Animail 包含了Object,Animal和Object就是两个数据集合?[/quote] 我看了一下,确实所有属性都会继承,包含这个概念,看你怎么理解了。我理解的子类父类,应该说子类是继承了父类所有属性,但是说包涵父类 是不对的,如果说动物包含老虎。狮子是对的,狮子老虎是子类,动物是父类一样。但是说狮子包含动物那就说不通了。 父类相当于是所有子类的一个共有属性的提炼吧[/quote] 确实,不应该说包含,关键字extends的意思也有延伸,外延之意。
qq_39936465 2019-01-28
  • 打赏
  • 举报
回复
父类应该是子类的交集部分,不是子类的集合。
qq_39936465 2019-01-28
  • 打赏
  • 举报
回复
引用 7 楼 pengfeizhang1994 的回复:
[quote=引用 3 楼 versus117 的回复:]
[quote=引用 1 楼 pengfeizhang1994 的回复:]
这段话的意思主要为:
要创建一个你(Hippo),需要先创建你的父亲(Animal)
然后不断循环找下去,父亲需要祖父,。。。。直到找到人类祖先(Object)
明白了否

你好,可能是我没有表述清楚,我想问的是这样隐性的调用了Animal和Object的构造函数,里面包含的Animal模块和Object模块算什么呢?就是单纯的类似“集合包含”的关系?Hippo 包含Animal ,Animail 包含了Object,Animal和Object就是两个数据集合?[/quote]
我看了一下,确实所有属性都会继承,包含这个概念,看你怎么理解了。我理解的子类父类,应该说子类是继承了父类所有属性,但是说包涵父类 是不对的,如果说动物包含老虎。狮子是对的,狮子老虎是子类,动物是父类一样。但是说狮子包含动物那就说不通了。
父类相当于是所有子类的一个共有属性的提炼吧[/quote]

这里应该这样理解,父类里是动物的基本特征,但是通过基本特征你是无法分辨是那种动物,子类继承了父类的动物特征然后更加细分,加入了狮子的特有特征。
  • 打赏
  • 举报
回复
引用 3 楼 versus117 的回复:
[quote=引用 1 楼 pengfeizhang1994 的回复:]
这段话的意思主要为:
要创建一个你(Hippo),需要先创建你的父亲(Animal)
然后不断循环找下去,父亲需要祖父,。。。。直到找到人类祖先(Object)
明白了否

你好,可能是我没有表述清楚,我想问的是这样隐性的调用了Animal和Object的构造函数,里面包含的Animal模块和Object模块算什么呢?就是单纯的类似“集合包含”的关系?Hippo 包含Animal ,Animail 包含了Object,Animal和Object就是两个数据集合?[/quote]
我看了一下,确实所有属性都会继承,包含这个概念,看你怎么理解了。我理解的子类父类,应该说子类是继承了父类所有属性,但是说包涵父类 是不对的,如果说动物包含老虎。狮子是对的,狮子老虎是子类,动物是父类一样。但是说狮子包含动物那就说不通了。
父类相当于是所有子类的一个共有属性的提炼吧
qq_39936465 2019-01-28
  • 打赏
  • 举报
回复
引用 4 楼 pengfeizhang1994 的回复:
[quote=引用 3 楼 versus117 的回复:]
[quote=引用 1 楼 pengfeizhang1994 的回复:]
这段话的意思主要为:
要创建一个你(Hippo),需要先创建你的父亲(Animal)
然后不断循环找下去,父亲需要祖父,。。。。直到找到人类祖先(Object)
明白了否

你好,可能是我没有表述清楚,我想问的是这样隐性的调用了Animal和Object的构造函数,里面包含的Animal模块和Object模块算什么呢?就是单纯的类似“集合包含”的关系?Hippo 包含Animal ,Animail 包含了Object,Animal和Object就是两个数据集合?[/quote]
调用了父类class的加载机制,并不是包含的意思。也没有实际的父类对象产生,加载了父类 只是为了让你加载子类的时候清楚自己有什么属性。所以说数据集合这个概念是不对的。不要被那个图误导以为是包含的意思,那个图可以表明子类的属性是包含父类的,所以用圈圈起来,其实父类的私有变量 子类是没法继承的[/quote]


子类和父类就是包涵关系,不管是否是私有变量,子类都是继承的,只是私有变量子类无法直接调用而已,但是这个变量已经存在了。
  • 打赏
  • 举报
回复
引用 3 楼 versus117 的回复:
[quote=引用 1 楼 pengfeizhang1994 的回复:]
这段话的意思主要为:
要创建一个你(Hippo),需要先创建你的父亲(Animal)
然后不断循环找下去,父亲需要祖父,。。。。直到找到人类祖先(Object)
明白了否

你好,可能是我没有表述清楚,我想问的是这样隐性的调用了Animal和Object的构造函数,里面包含的Animal模块和Object模块算什么呢?就是单纯的类似“集合包含”的关系?Hippo 包含Animal ,Animail 包含了Object,Animal和Object就是两个数据集合?[/quote]
调用了父类class的加载机制,并不是包含的意思。也没有实际的父类对象产生,加载了父类 只是为了让你加载子类的时候清楚自己有什么属性。所以说数据集合这个概念是不对的。不要被那个图误导以为是包含的意思,那个图可以表明子类的属性是包含父类的,所以用圈圈起来,其实父类的私有变量 子类是没法继承的
胖鸟飞不动 2019-01-28
  • 打赏
  • 举报
回复
引用 11 楼 qq_39936465 的回复:
[quote=引用 10 楼 versus117 的回复:] [quote=引用 7 楼 pengfeizhang1994 的回复:] [quote=引用 3 楼 versus117 的回复:] [quote=引用 1 楼 pengfeizhang1994 的回复:] 这段话的意思主要为: 要创建一个你(Hippo),需要先创建你的父亲(Animal) 然后不断循环找下去,父亲需要祖父,。。。。直到找到人类祖先(Object) 明白了否
你好,可能是我没有表述清楚,我想问的是这样隐性的调用了Animal和Object的构造函数,里面包含的Animal模块和Object模块算什么呢?就是单纯的类似“集合包含”的关系?Hippo 包含Animal ,Animail 包含了Object,Animal和Object就是两个数据集合?[/quote] 我看了一下,确实所有属性都会继承,包含这个概念,看你怎么理解了。我理解的子类父类,应该说子类是继承了父类所有属性,但是说包涵父类 是不对的,如果说动物包含老虎。狮子是对的,狮子老虎是子类,动物是父类一样。但是说狮子包含动物那就说不通了。 父类相当于是所有子类的一个共有属性的提炼吧[/quote] 确实,不应该说包含,关键字extends的意思也有延伸,外延之意。[/quote] 我觉得你对含义的理解有问题,这里子类可能是包含父类所有内容,但是你对父类理解有问题,这里的父类不是子类的集合,而且子类的交集,还是那狮子和动物的例子来说,动物是父类,这里父类只是所有动物的共有属性,而狮子子类有自己的特有属性,只有特有属性+共有属性你才知道这个是动物中的狮子,如果只说子类特有属性就能判断是狮子,那么这个父子关系就没存在的必要了。[/quote] 我也思考了这个关系问题,如果按照书中的图来看的话 准确的说是包含了父类这个数据,但是却不能说包含了这个父类。子类extends父类, 是把父类具体化,是对父类进行扩充。这样理解上图 ,就会比较清晰了,如果是讨论集合之间关系,用韦恩图表示的话,就不能像上述的图那般了。
胖鸟飞不动 2019-01-26
  • 打赏
  • 举报
回复
引用 1 楼 pengfeizhang1994 的回复:
这段话的意思主要为: 要创建一个你(Hippo),需要先创建你的父亲(Animal) 然后不断循环找下去,父亲需要祖父,。。。。直到找到人类祖先(Object) 明白了否
你好,可能是我没有表述清楚,我想问的是这样隐性的调用了Animal和Object的构造函数,里面包含的Animal模块和Object模块算什么呢?就是单纯的类似“集合包含”的关系?Hippo 包含Animal ,Animail 包含了Object,Animal和Object就是两个数据集合?
qq_39936465 2019-01-25
  • 打赏
  • 举报
回复
看个例子就知道了

public class test6 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
       Hippo h= new Hippo();
	}
}

public class Hippo extends Animal {

	public Hippo() {
//		super();  这里写不写都没关系,强制会调用super();
		// TODO Auto-generated constructor stub
		System.out.println("This is Hippo!");
	}
}

public class Animal extends Object {

	public Animal() {
		// TODO Auto-generated constructor stub
		System.out.println("This is Animal!");
	}
}

public class Object {

	public Object() {
		// TODO Auto-generated constructor stub
		System.out.println("This is Object!");
	}
}
运行test6结果: This is Object! This is Animal! This is Hippo!
  • 打赏
  • 举报
回复
这段话的意思主要为:
要创建一个你(Hippo),需要先创建你的父亲(Animal)
然后不断循环找下去,父亲需要祖父,。。。。直到找到人类祖先(Object)
明白了否

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧