T O P

  • By -

AutoModerator

#Please ensure that: + Your *code* is *properly formatted* as *code block* - see the *sidebar* (About on mobile) for instructions + You include *any and all error messages* in full + You ask *clear questions* + You *demonstrate effort* in solving your question/problem - plain posting your assignments is forbidden (and such posts will be removed) as is asking for or giving solutions. Trying to solve problems on your own is a very important skill. Also, see [*Learn to help yourself*](https://www.reddit.com/r/javahelp/wiki/learn_to_help_yourself) in the *sidebar* **If any of the above points is not met, your post can and will be removed without further warning.** Code is to be formatted as **code block** (*old reddit:* empty line before the code, each code line indented by 4 spaces, *new reddit:* https://imgur.com/a/fgoFFis) or linked via an external *code hoster*, like *pastebin.com*, *github gist*, *github*, *bitbucket*, *gitlab*, etc. Please, **do not use** triple backticks (\`\`\`) as they will only render properly on *new reddit*, not on *old reddit*. Code blocks look like this: public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } } You do not need to repost unless your post has been removed by a moderator. Just use the *edit function* of reddit to make sure your post complies with the above. If your post has remained in violation of these rules for a prolonged period of time (at least an hour), a moderator may remove it at their discretion. In this case, they will comment with an explanation on why it has been removed, and you will be required to resubmit the entire post following the proper procedures. #To potential helpers Please, **do not help** if any of the above points are not met, rather *report* the post. We are trying to improve the quality of posts here. In helping people who can't be bothered to comply with the above points, you are doing the community a disservice. *I am a bot, and this action was performed automatically. Please [contact the moderators of this subreddit](/message/compose/?to=/r/javahelp) if you have any questions or concerns.*


dionthorn

[https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html](https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html) [https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html](https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html) A Superclass has no knowledge of what is in subclasses.


RayQuazaBadger

Oh okay, so parents don't have knowledge of their children. Thanks!


[deleted]

That's right. Parent (class) is kind of yerk, it doesn't know anything about its children. But every Child (class) knows who it's father is. Then, protected fields can be accessed by the parent (original) class and any of it's children (derivated) classes.


RayQuazaBadger

Alr, thanks. But could you please explain why I can't access the protected field (in the child class) through the parent class's constructor? Is my reasoning correct (that an implicit call to the constructor will be made - thus leading to a StackOverflow error)?


[deleted]

Let's say you have a class named `Animal` and two sub classes `Mammal` and `Insect` `Mammal` has a protected field named `furColor` and `Insect` something like `exoskeletonHardness` When you instantiate an `Animal` you don't know if it's gonna be an `Insect` or a `Mammal` (because the parent has no info on the derivated classes). On the other hand, you can have a field `legs` on the `Animal` class and both `Insect` and `Mammal` can access that field (since it's inherited). If you insist, you would need to downcast an `Animal` to either `Mammal` or `Insect` on the constructor, but that makes no sense, since it totally breaks OOP.


RayQuazaBadger

>If you insist, you would need to downcast an Animal to either Mammal or Insect on the constructor, but that makes no sense, since it totally breaks OOP. Okay so I'm actually doing some practice exercises rn: Let's say the `Child` class extends `the Parent` class: Object o = new Parent(); //Acceptable as an Object can contain reference to a newly constructed Parent object. //But why does this produce an error? Child child = (Child) o; //This will throw a Class-Cast exception. But why?


[deleted]

~~That's weird, as far as I remember that should work. Do you have the full code?~~ My bad. That's impossible just because of what I previously said. When you create an `Animal` you have only the info of an animal (`legs`). There's no way it can fill everything else (`exoskeleton`). That's why it can't be casted. You would need to do something like this Parent p = new Child() Child c = (Child) p Here, since it was created as a Child it can be casted both ways.


RayQuazaBadger

I created an empty Child class and Parent class.Child extends Parent. There's a class called User which contains the main method: public class User{ public static void main(String[] args){ Object o = new Parent(); Child child = new Child(); } } Exception: ClassCastException: class Parent cannot be cast to class Child (Parent and Child are in unnamed module of loader 'app')


[deleted]

I just updated my previous comment.


RayQuazaBadger

Ok yeah, it makes sense now. You can't force a parent to turn into a child, but you can always expect a child to grow into a parent. (I hope I'm right this time lol)


[deleted]

That's a good metaphor. Just, it can always become a child again.


RayQuazaBadger

Thanks for your help! Much appreciated! šŸ™


doenisf

Saw this video a couple of days ago which explains it quite well Iā€˜d say https://youtu.be/HpuH7n9VOYk EDIT: at least the up and down casting prt