面向对象编程:关于类的访问修饰符

一.类的访问修饰符

从小到大依次为:
private(私有,当前类的内部可见)< default(啥也不用写就是包权限,当前包的内部可见,不包含子包,同级目录下可见)<protect(继承权限,不同包的有继承关系的类之间可见)<public(当前项目可见)

java中的包就对应操作系统的文件夹
声明一个包使用package关键字
若存在多个文件夹的嵌套,使用“.”来分隔
package www.bit.java.rocketclass有几个点创造几个目录
在这里插入图片描述
包的存在就是为了解决类同名的问题
类的全名称:包名.类名
全名称www.bit.java.rocketclass.Test在这里插入图片描述
全名称:www.Test
在这里插入图片描述

二.包的导入

如何导入某个包中的某个类:
import语句只能导入相关包中的某个具体的类
在这里插入图片描述
此时的这个Date表示的是java.util这个包下的Date类
在这里插入图片描述
此时若还要用到这个包中的其他类,不要一行行写,一般不推荐,会有歧义问题。
import java.util.*//此时将整个util包下的所有类按需加载,此时导入的还是类,而不是导入包在这里插入图片描述
若程序中用到了两个名称相同的类
1.使用类的全名称
2.import明确指定导入的是哪个包下的哪个类

三.常见的包

java.lang:JDK的基础类,System,String,Object都在这个包下,JDK1.1后这个包下的所有类自动导入;
java.lang.reflect:反射开发包;
java.util:工具包(集合类都在这个包下,Arrays,LinkedList,HashMap);
java.io:I/O开发包,文件读取和写入;
java.net:网络编程开发包,Socket;
java.sql:数据库开发用到的包

四.面向对象编程的三大特性

面向对象编程三大特性为:封装,继承,多态

4.1封装

封装:使用private将属性进行封装(这个属性只在当前类的内部可见,对外部隐藏)
封装具有保护性,易用性(通过程序对外提供的方法来操作属性),比如汽车启动,电脑启动。

4.2继承

继承的原则:
a.要能使用继承,前提必须要满足类之间的is a关系
b.一个子类只能使用extends继承一个父类。(单继承)
java中不允许多重继承,extends后面只能跟一个父类,但是允许多层继承。
在这里插入图片描述
优化:
在这里插入图片描述

c.子类会继承父类的所有属性和方法,显示继承(pubilc属性和方法可以直接使用)
隐式继承(private属性和方法),子类其实也继承了这个属性和方法,但无法直接使用。
当一个类继承了另一个类,肯定所有静态属性和方法就继承了,到底能不能直接使用,还是要看权限是不是public
在这里插入图片描述
可以正常输出:
在这里插入图片描述
类中的代码完全一样,这三个类按道理所有Animal的类都应该具备name属性,eat这个方法。
狗狗是动物Dog is an Animal
猫猫是动物Cat is an Animal
当类和类之间满足一个类is a另外了一个类,一定是存在继承关系,天然继承,此时Dog,Cat都应该是Animal的子类。
当一个类继承了另一个类,另一个类中所有属性和方法子类就天然具备了。
java中使用extends表示类的继承。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
优化:
在这里插入图片描述
在这里插入图片描述
例如:Dog extends Animal
Dog称为子/派生类,Animal称为父类/基类。
不能为了省略代码就简单使用继承,要想使用继承必须满足is a关系。
正常输出:
在这里插入图片描述
关于protected访问权限
protected的作用域不同包中的子类是可见的。在这里插入图片描述
在这里插入图片描述
结果:
在这里插入图片描述
反例:Test不是Animal的子类且不在一个包中,因此name对于Test这个类来说是不可见的。在这里插入图片描述
protected权限在同包中的没有继承关系的类之间是如何?
既然protected权限>包权限
包权限的可见范围来说,protected来说一定包含。
同包下的没有关系的类之间以及不同包的有继承关系的类之间是可见的。
在这里插入图片描述
当调用new Person无参构造产生子类对象之前,先默认调用父类的构造方法产生父类对象然后才会执行子类的构造方法。
在这里插入图片描述

4.3多态

4.3.1多态的概念

多态:一个引用可以表现出多种行为/特性=>多态性
向上转型:向上转型发生在有继承关系的类之间
不一定是直接子类,也可以是孙子类。。。
Animal animal = new Dog();
父类名称 父类引用 = new 子类对象();
向上转型最大的意义在于参数统一化,降低使用者的使用难度。

4.3.1多态的向上转型

没有向上转型的情况:
在这里插入图片描述
有向上转型的情况:最顶端的父类引用就可以指代所有的子类对象。
当Animal有一个新的子类时,非常容易拓展的。
在这里插入图片描述
fun中animal局部变量的引用调用eat方法时,当传入不同的对象时,表现出来了不同的eat方法的行为=>多态性
同一个引用(变量名称),同一个方法名称根据对象的不同,表现出来了不同的行为=>多态性
方法重载(overload):发生在同一个类中,定义了若干个方法名称相同,参数列表不同的一组方法。
方法重写(override):发生在有继承关系的类之间,子类定义了和父类除了权限不同,其他全部相同的方法,这样的一组方法称之为方法的重写。

到底调用的是谁的方法呢?
不用去看前半部分,看当前是通过哪个类new的对象,若该类重写了相关方法,则调用的一定是重写后的方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这三个类都重写了eat方法,千万不要被类名称搞晕,就看new的是谁,只要new的这个对象中复写了同名方法,则调用的一定是复写后的方法。
在这里插入图片描述
Cat类没有重写eat方法,则向上搜索碰到第一个父类重写的eat就调用最接近的eat方法
在这里插入图片描述
在这里插入图片描述
当发生重写时,子类权限必须>=父类权限,才可以重写。
毫无关系的两种类型不能作为方法重写的返回值。

父类方法使用private,子类方法使用public,是否可以?
不可以,private权限不包含在内。
java中有一个注解@override,使用这个注解写在方法重写之前,帮你校验你的方法重写是否符合规则

能否重写static方法?
多态的本质就是调用了不同的子类“对象”,这些子类对象所属的类中覆写相应的方法才能表现出不同的行为。
static和对象无关,所以不能重写。
方法重写只发生在普通方法中。在这里插入图片描述
向上转型发生的时机一共可以发生在三个位置:
a.方法传参-使用最多在这里插入图片描述
b.引用赋值时在这里插入图片描述
c.方法返回值
在这里插入图片描述
调用D的无参构造,这是存在继承,优先调用B的构造方法,先产生父类对象。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.3.2多态的向下转型

类名称 引用名称 = new 类实例();
引用名称.方法名称();能通过“.”访问的方法类名称说了算,能访问的这些方法必须都在类中定义过,编译器会先在类中查找是否包含指定方法。
至于这个方法到底表现出来是哪个类的样子,实例所在的方法说了算。

假设此时Dog类有一个扩展方法play(),这个方法Animal类中不具备,不能通过animla.play()。animal这个类中并没有play方法。
在这里插入图片描述
Animal animal = new Dog();
animal.play();
animal这个引用是披着狗皮的动物,本质上是个dog,批了Animal的外衣,此时只能调用Animal中定义的方法
此时想调用子类拓展的方法该怎么办?
脱掉这层外衣,还原为子类的引用=>向下转型
语法:
子类名称 子类的引用 = (子类名称)父类引用
Dog dog = (Dog) animal;//脱掉animal这个引用对应的对象的外衣还原成具体的子类引用。
将父类引用强制类型转换为子类引用。
子类is a父类=>天然的 Dog is an animal
父类is a子类(不一定)Animal is a Dog?
向下转型:
在这里插入图片描述
到底产生了几个对象?
对象的个数,new了几次,1个,来回变的就是引用的名字
在这里插入图片描述
要发生向下转型首先得发生向上转型。
毫无关系的两个类之间无法强转
Animal animal = new Animal();
Dog dog = (Dog)animal;
类型转换异常:
在这里插入图片描述
如何规避异常,使用instanceof关键字
引用名称instanceof类=>返回布尔值,表示该引用本质上是不是该类的对象
在这里插入图片描述
使用instanceof关键字的返回值搭配分支语句进行类型转换。
在这里插入图片描述

五.super关键字

super修饰属性:表示从父类中寻找同名属性
super修饰方法:a.修饰构造方法b.修饰普通方法

5.1super的修饰属性

输出为子类的name
在这里插入图片描述
在这里插入图片描述
相反情况:在这里插入图片描述
当有继承关系时,this关键字默认先在当前类中寻找同名属性,若没找到继续向上寻找父类中是否有同名属性。
直接使用name,编译器默认都是this.name
在这里插入图片描述
想访问父类中的name属性,使用super关键字:
在这里插入图片描述
super关键字先从直接父类中寻找同名属性,若不存在再向上寻找,不能使用super直接调用父类的private权限的属性
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
若找到父类,就不会在向上寻找
在这里插入图片描述
在这里插入图片描述

5.2super的修饰方法

5.2.1 super修饰构造方法

a.当产生子类对象时,默认先产生父类对象,若父类对象还有继承,继续向上先产生祖类对象
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
b.
在这里插入图片描述
Person默认的无参构造就不再产生了
在这里插入图片描述
显示使用super调用父类的有参构造
在这里插入图片描述
在这里插入图片描述
super修饰构造方法
super(父类构造方法的参数)
super():直接父类的无参构造,可写可不写
若父类中不存在无参构造,则子类构造方法的首行需使用super(有参构造)
在一个构造方法中无法显示使用this()和super()同时出现。

5.2.1 super修饰普通方法

super修饰普通方法和修饰属性一样,直接从父类中寻找同名方法
直接从父类中寻找fun()方法
在这里插入图片描述
super关键字不能指代当前父类对象的引用

六.final关键字

final终结器,表示到此为止
修饰属性表示属性的值不能变,常量,值定义以后无法修改。
修饰类表示这个类无法被继承

七:类和类组合关系

组合关系has a
class School{
Student student;
Teacher teacher;
}
School has a student
School has a teacher

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: Java访问修饰符主要有四种:public、protected、default和private。\[2\] - public修饰符表示该、属性或方法可以被任何地方的访问,没有访问限制。\[2\] - protected修饰符表示该、属性或方法可以被同一个包中的其他以及任何子访问。\[2\] - default修饰符(也称为包级访问修饰符)表示该、属性或方法可以被同一个包中的其他访问,但不能被不同包中的访问。\[2\] - private修饰符表示该、属性或方法只能被同一个中的其他方法访问,不能被其他访问。\[2\] 需要注意的是,对于顶级来说,protected修饰符与default修饰符的访问权限是相同的,因为protected修饰符的子访问权限只有在有子的情况下才有效。\[3\] #### 引用[.reference_title] - *1* [Java 中的访问修饰符有哪些?](https://blog.csdn.net/weixin_44798281/article/details/130511957)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [JAVA的四种访问修饰符](https://blog.csdn.net/m1992222/article/details/125908960)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Java访问修饰符](https://blog.csdn.net/lydia_cmy/article/details/121499420)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值