大家好啊,我是汤圆,今天给大家带来的是《Java中的三大特性 - 超详细篇》,希望对大家有帮助,谢谢
这一节的内容可能有点多,大家可以选择性的来看
简介乍一听,好像很高大上,其实当你真正用的时候,会发现高大上的还在后面呢。。。
热身在正式讲解三大特性之前,先普及几个知识
1. 访问权限修饰符Java中关于访问权限的四个修饰符,表格如下
private friendly(默认) protected public当前类访问权限 √ √ √ √
包访问权限 × √ √ √
子类访问权限 × × √ √
其他类访问权限 × × × √
其中比较尴尬的是protected修饰符,有点卡在中间,不上不下的感觉
因为它不适合用来修饰属性
假设用它修饰属性,那么任何一个人都可以通过继承这个类,来直接访问到这个类的属性,从而破坏"封装性"
2. 抽象类(abstract)什么是抽象类?
抽象类就是用abstract修饰,且不能被直接初始化的类,但是可以通过子类来初始化
比如:Father father = new Son()
对应的,抽象方法就是用abstract修饰的方法
抽象方法是一种很特殊的方法,它没有方法体,即方法实现代码为空,比如abstract public void fun();
抽象方法一般在子类中进行实现,它就好像是在说:我不写代码,我只是声明一个方法名,剩下的交给我的子孙后代(继承类)去做
抽象类有一个很重要的特点:抽象类可以没有抽象方法,但是如果一个类有抽象方法,那么这个类肯定是抽象类
为什么会有抽象类
解耦,使代码结构更加清晰
因为抽象类不能被直接创建为对象,它只是作为一个通用接口来供别人实现和调用,所以这样就使得抽象的代码更加清晰(它只声明方法,不实现方法)
就好比,老板和员工,老板负责分发任务,员工负责去具体的实现任务
好了,关于抽象类,先介绍到这里,更详细的后面的章节再深入
3. 重载(overloading)和覆写(overwriting)重载和覆写是两个很容易混淆的概念
重载:同一个类中,一个方法的多种表现形式(参数类型不同,参数个数不同)
覆写:继承设计中,子类覆盖父类的方法(也可以叫做重写,不过这样跟重载有点混淆,所以个人喜欢叫做覆写)
他们之间的区别如下
重载 覆写访问权限 可以不同 可以不同(但是子类的可见性不能比父类的低)
方法返回值 可以不同 相同
参数类型 不同(充分条件) 相同
参数个数 不同(充分条件) 相同
这里要注意几点
覆写时,子类的方法访问权限不能低于父类,比如父类方法为public,那么子类也只能为public
重载时,访问权限和方法返回值,不能作为用来判断一个方法是否为重载的依据;只能说重载允许不同的访问权限和返回值
覆写示范代码示范如下,
// 覆写一:正确示范 @Override public void fun(){ System.out.println("son fun"); } // 覆写二:错误示范,访问权限低了 @Override private void fun(){ // 报错:'fun()' in 'SonDemo' clashes with 'fun()' in 'Father'; attempting to assign weaker access privileges ('private'); was 'public' System.out.println("son fun"); }@Override这个是干嘛的?之前没见过啊
这个修饰符用来说明这个方法是覆写方法,不写也可以,系统会自己识别方法是不是覆写的
那为啥还要多此一举呢?用系统默认的识别机制不好吗?
要多此一举;不好;
因为加了注解,代码可读性更高,代码更加规范,别人看了代码后,立马就知道这个方法是覆写方法
重载示范重载用图展示可能会更加清晰
图示解释:
参数类型和参数个数,只要满足其一,就可以说这个方法被重载了
访问权限和方法返回值用虚线框,是为了说明他们两个只是重载的一个附加表现形式(可有可无),不能作为重载的判断依据