1.子类继承父类后的访问权限
访问权限修饰符:
- public > 整个项目下
- private > 本类中
( 在子类中,无法直接访问到,可以访问父类方法间接来访问私有成员)
- protected > 同包下 以及 不同包的子类{}中
- 不写 (默认的) > 同包下
(1) 属性的访问去权限
Demo1 (同包)
验证了private , public
通过父类方法间接访问
Demo2(不同包下, 默认的访问级别 是不能访问到的,在不同包的子类中protected可以访问到)
Demo3 同包下所有类(子类和非子类)都可以访问protected
## 子类以及子类对象可以直接调用继承到哪些内容?
- 成员:
- 类的成员:
- static 修饰的 只有一份 由类名直接调用,子类名也可以调用
- 对象成员
- 属性 方法: 要求创建对象来调用
(2)验证static
1.首先,子类对象和父类对象不能访问static变量,这一点和C++不太一样
2. 可以通过 调用 父类和子类的类名来调用静态变量(不同包不能掉)
(3)
1)
- 不同包的子类 在同包下子类中/非子类中 创建对象
那么你的默认权限的,和私有权限的内容访问不到
---- 不同包的子类在同包下的子类中创建对象
---- 不同包的子类在同包下的非子类中创建对象
==================================================================================================================================================
2)
- 同包的子类 在不同包下子类中/非子类中 创建对象j
只能访问到公有成员,为什么保护成员没有了??
有疑问!!!!!
2.方法重写
## 方法重写:
- 子类中 可以重写父类的方法
- 一般情况下: 子类方法的代码结构体与父类一致,方法体可以改
- [方法的访问修饰符] 返回值类型 方法名(参数类型 参数名...){ }
- 返回值类型 :怎么改? 继承的方法若返回值是类,某种情况下可以改,
若Dog 是Animal的子类,如果父类方法返回Animal类型,子类可以返回Animal或Dog类型
请见示例。
- 访问修饰符 :怎么改? 重写方法不能使用比被重写方法更严格的访问权限。
严格程度(从左往右依次减小) private> 默认> protected > public
如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
- 抛出的异常: 怎么改? 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。
- 方法重写具有的功能特点:
- 一般情况下,子类扩展升级父类的方法
- 子类中重写的方法会被优先调用
- 父类实际上是子类的抽象类
- 子类与子类之间由区别
- 每个子类可能会有相同的行为,但是行为中有部分不一致
示例
3.转型
(1)基本数据类型之间的转型
小范围转大范围一点可以,但是大范围转小范围有风险。
第二行代码无法进行自动转型,需要进行强制转型
1) 自动转型
2)强制转型
(2)对象之间的转型
子类可以转换成父类的类型,父类 不可以 转换成子类的类型。
1)自动转型(向上转)
2)强制转型(向下转)
如果想要向下转,正确的操作如下:
但是我很好奇这样的意义是什么 , 一上一下,感觉 贡献 为0啊!!!
写一种错误的写法
证明了,父类不可以强转为子类。
还有,为什么我可以找到test()方法呢,我认为是这样的,编译器很傻,只认识你写的代码,在没有点击运行之前,不会去底层看。换而言之,编译器只关心 Cat cat1, 这个对象创建成功了,那么我就可以调用了。