一、说明
前期学习的时候,总是把访问控制符与修饰符之间的使用给弄混,今天又遇到了这方面的疑惑,于是就查资料给弄明白了,下面是我以个人的理解方式给和我有相同困惑的朋友讲解一下,如果有不足之处请指出,我会及时采纳意见,及时更新,希望能帮助更多自学的朋友。。。
1、访问控制符
1.1 定义类时的访问控制符:public或 默认。类只有这两种访问控制符。
- 如果为public类,则该类可以被其他类所访问。
- 如果为 默认 类,则该类只能被该包中的类所访问。
1.2 方法与变量的访问控制符
作用范围| |访问控制符 | public | protected | 默认(包可访问) | private(私有) |
同一个类中 | √ | √ | √ | √ |
同一个包中 | √ | √ | √ | |
不同包中的子类 | √ | √ | ||
不同包中的非子类 | √ |
2、修饰符
含义 | 修饰类 | 修饰字段(成员变量) | 修饰方法 | 修饰局部变量 | |
static | 静态的,非实例的、类的 | 仅可修饰内部类 | √ | √ | |
final | 最终的、不可变的、唯一的 | √ | √ | √ | √ |
abstract | 抽象的,不可实例化的 | √ | √ |
3、用法
(1)访问控制符和修饰符之间可以互相搭配使用:
注意:private与abstract不能搭配使用:因为abstract 是为了用来让子类继承的,子类不能继承父类 private 方法。
//1、类的访问控制符与修饰符的搭配使用
public class Student {
//可以在整个项目的所有包中使用的Student类
}
class Student {
//只能在本类和本包中使用的Student类,不能在其他包中使用
}
public final class Animal{
//只能在本能类中使用的Animal类
}
final class Animal {
//只能在本能类中使用的Animal类
}
public abstract class Cat{//可以在整个项目的所有包中使用的抽象Car类
}
abstract class Cat {//只能在本包中的使用的抽象Car类
}
}
//2、方法、变量的访问控制符与修饰符的搭配使用,方法的使用范围要在类的使用范围之类
public class Student {
public String name;//可以在其他包中通过Student对象调用此属性
String gander;//只能在本包中使用
public final int age = 10;//可以在其他包中使用的用final修饰的常量,定义的时候必须先进行赋值
final int salary = 1000;//只能在本包中进行使用的用final修饰的常量,定义的时候必须进行赋值
private static String address;//只能在本类中使用的私有静态属性
private final String address1="中国";//只能在本类中使用的私有唯一属性,必须赋值
public void run() {
//本类用public修饰,是可以在整个项目中可以使用的类
//所以此方法是可以在整个项目中都能通过Student的对象进行调用的方法
//如果该Student类是:默认,protected、private修饰,则该方法
//只能在Student类的作用范围内使用
}
void run1() {
//默认访问控制符修饰的方法,该方法只能在本包中使用
}
public final void run2() {
//此方法是可以在整个项目中都能通过Student的对象进行调用的用final修饰的方法
//该方法用final修饰,不能被重写可以被重载
}
}
(2)abstract 不能修饰 static、final、synchronize、native 和 构造方法、属性:
①:static:static 是属于类的,在类加载时同时被加载了,被类的所有实例共享,而且一定存在具体的实现。但是抽象类不能创建类的实例,抽象方法也没有方法体,这两个关键字本身就存在矛盾。
②:final:final 的目的是防止属性和方法被修改,不能被继承,但是抽象方法就是用来被继承的。
③:synchronize:一种线程锁,需要具体操作才能进行同步,但是 abstract 修饰的方法没有方法体,也就没有具体的实现操作。
④:native:本地的,本身与abstract就冲突,native是把方法实现交给本地操作系统,而 abstract 是将实现交给子类重写的方法,他们都是方法的声明。
⑤:构造方法:对象创建过程中会调用构造器,利用构造器来初始化数据,但是 abstract 修饰的方法没有方法体,只是为了用来被继承的。
⑥:属性:java 规定 abstract 只能修饰类和方法,不能修饰属性。属性是类的一些特点,abstract 是为了抽象化,将类的属性进行抽象化没有实际的意义。