Java控制修饰符,子类与父类,组合重载覆盖等问题

本次主要针对以下几个问题:
在这里插入图片描述

1.java的访问控制修饰符有哪些?各自有什么访问权限?
如图所示:
在这里插入图片描述
(1)public:表示该成员是公开的,其他所有类都可以访问
(2)protected:表示该成员是受保护的,其子类可以访问protected里的成员,同时包中的其他类也可以访问该成员
(3)private:表示该成员是私有的,只有该类内部才能访问
(4)默认:包访问权限,包内部的类可以访问该成员

可以用一个图来表示:
在这里插入图片描述

2.子类对于父类继承的那些方法和属性是可见的?
子类从父类继承的public和protected成员是可见的,而继承的private成员是不可见的。
所谓可见简单来说就是能否直接调用,能直接调用则是可见的,否则不可见
例如:
在这里插入图片描述
定义hello父类,然后s类继承,可以看到图中输出aa.id.是错误的,因为域变量id的修饰符为private,子类不能直接访问,对s类和其实例化对象来说,id便是不可见的,会出现如下错误提示:
在这里插入图片描述
此时将private该成protected或者public,子类可以直接访问,可见,就会正确。
若是依旧用private要输出id便只有借助hello类的可见方法间接调用该域变量。

3.什么是组合?
简单来说组合就是某类的对象引用做另一个类的数据成员,相当于这个类是另一个类对象的一个属性!
例如:
在这里插入图片描述
图中便是一个组合,而此处有了发消息的概念
发消息便是用来说明 使用引用的属性或方法便是调用对象的属性或方法的一个过程
如图中 s类的System.out.println(h.name),就是通过hello对象引用h调用了hello类的name属性

4.什么是重载?
在类中定义了多个同名而不同内容参数的成员方法时,称这些方法为重载
如图所示:
在这里插入图片描述

类中有三个同名的方法,分别根据参数的个数和参数的不同实现不同的内容
需要注意的是,java中的重载不能只是返回值不同,编译不会通过;而c++可以

5.什么是覆盖?
子类对父类参数相同,返回类型相同的同名方法进行定义,这种多态便称为覆盖
例如:
在这里插入图片描述
此时输出的为 s;因为父类的say方法被子类覆盖了,say方法被子类重新定义
在这里插入图片描述
而如果不用覆盖,则输出的为 hello

希望浅显的说明对大家有帮助,有错误也欢迎大家指正,大家相互学习共同进步!