Java基础之面向对象——访问控制权限、封装、继承、重写、抽象类

访问控制权限

      Java中引入了访问权限控制(可见性),可以为成员变量、成员方法、静态变量、静态方法甚至是类指定访问权限,不同的访问权限,有着不同程度的访问限制:

 

 封装

       封装,把对象的属性和方法结合成一个独立的整体,隐藏实现细节,并提供对外访问的接口。封装的目的是为了保证变量的安全性,使用者不必在意具体实现细节,而只是通过外部接口即可访问类的成员,如果不进行封装,类中的实例变量可以直接查看和修改,可能给整个代码带来不好的影响,因此在编写类时一般将成员变量私有化,外部类需要使用Getter和Setter方法来查看和设置变量。例如一个Person类

 

 也只能通过get方法去访问变量的值,看一下运行结果

 

 也就是说,外部现在只能通过调用定义的方法来获取成员属性,而也可以在这个方法中进行一些额外的操作,比如小明可以修改名字,但是名字中不能包含"小"这个字:

 

 查看一下运行结果

 

 除了成员变量和普通方法之外,也可以将构造方法设置为私有的,这是需要通过内部方式去创建对象,例如

 

 

继承

     在定义不同类的时候存在一些相同属性,为了方便使用可以将这些共同属性抽象成一个父类,在定义其他子类时可以继承自该父类,减少代码的重复定义,子类可以使用父类中非私有的成员。例如人类的子类可以是学生类、工人类、教师类等等。例如,可以创建一个Person类(父类)

 

 可以创建一个子类,只要让该子类使用extends关键字继承父类即可。当一个类继承另一个类时,属性会被继承,可以直接访问父类中定义的属性,除非父类中将属性的访问权限修改为private,那么子类将无法访问(但是依然是继承了这个属性的)。例如创建一个Student类继承Person类

 

 同样的,在父类中定义的方法同样会被子类继承,例如

 

 

 

 不过值得注意的是,类的继承可以不断向下,但是同时只能继承一个类,同时,标记为final的类不允许被继承

如果父类存在一个有参构造方法,子类必须在构造方法中使用super关键字调用父类构造方法,因为子类在构造时,不仅要初始化子类的属性,还需要初始化父类的属性,所以说在默认情况下,子类其实是调用了父类的构造方法的,只是在无参的情况下可以省略,但是现在父类构造方法需要参数,那么就需要手动指定了。例如

 

 

 

 使用的是父类类型引用的对象,但是这并不代表子类就彻底变成父类了,这里仅仅只是当做父类使用而已。也可以使用强制类型转换,将一个被当做父类使用的子类对象,转换回子类,例如

 

使用instanceof关键字可以判断某个变量所引用的对象到底是什么类,如果变量所引用的对象是对应类型或是对应类型的子类,那么instanceof都会返回true,否则返回false。同样是Student类,

 

 此外,子类和父类是可以定义同名属性的,不过这时要调用父类的属性需要用super关键字,例如同样是对于Student类,

 

顶层Object类

       实际上所有类都默认继承自Object类,除非手动指定继承的类型,但是依然改变不了最顶层的父类是Object类。所有类都包含Object类中的方法,可以尝试使用一下Object的方法,比如

 

以Student类为例

 

 

 

 

 

 

 方法的重写

        方法的重写不同于之前的方法重载,方法的重载是为某个方法提供更多种类,而方法的重写是覆盖原有的方法实现,比如现在不希望使用Object类中提供的equals方法,那么就可以将其重写了。以Person类为例,重写的效果就是如果是如果名字、年龄、性别都完全相同,那么这肯定是同一个人。例如

 

 看一下运行结果

 同理,也可以重写toString方法

 

 看一下运行结果

 

 

假如父类有一个默认类型的text方法(空方法),那么子类可以重写该方法,类型为public(注意:子类重写父类的方法,重写方法的访问权限不能低于父类方法的访问权限)。例如,

 

 注意,静态方法不支持重写,因为它是属于类本身的,但是它可以被继承。

不同的子类对于同一个方法会产生不同的效果,这就是面向对象编程中多态特性的一种体现。比如:可以新建一个Worker类,继承于Person类,且重写test方法。如果不同的子类对象调用test方法,会产生不同的效果

 

 

 

 如果不希望子类重写某个方法,我们可以在方法前添加final关键字,表示这个方法已经是最终形态,对于类和成员变量也是这样都是最终形态

我们在重写父类方法时,如果希望调用父类原本的方法实现,那么同样可以使用super关键字(必须在重写方法里调用),例如父类有一个test方法,如下

 

 

 

 

 

 

 

 

 

 

        

    

         

 

posted @   自由和冒险  阅读(148)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示