小黄鸭系列java基础知识 | 访问控制
前言
小伙伴,新年过得可好呀!好多小伙伴可能已经上了三天班了,比如我,你们感觉怎么样呢?反正,上班这三天,我是极其不在状态,每天都恍恍惚惚的,这可能就是假期综合症的表现。但是我觉得这也不能怪我,目前的工作确实没什么挑战,工作本身能带给我的成就感也很有限,而且有时候还会引发我的吐槽和牢骚,毕竟现在项目上的工作确实太混乱,进度没有人跟进,需求没人对接,除了政治性的任务,其他的工作客户也不管不顾,感觉大家都像无头苍蝇一样,浑浑噩噩,恍恍惚惚,以前针对这些问题,我有反馈过也提过建议,但最后都不了了之,而且目前管理确实混乱,准确地说没有管理。我已经在准备换个新的环境,开始新的有挑战的生活,毕竟我还是太弱了,能量有限,改变不了目前项目的情况,所以如果有小伙伴在纠结要不要换工作,不要犹豫了,大胆地换,大胆地走出去,多尝试,多经历,环境带给你的改变真的超出你的想象。
正文
今天我们要回顾的知识点是java
的访问控制,访问控制简单来讲就是权限控制,就是控制方法、属性、类的访问权限,比如你不想外部类访问你当前类的属性,你可以在当前类对应的属性上加上private
关键字,这样在当前类之外,就无法访问这个属性,今天我们讲的就是这些关键字。
访问控制
Java
中主要有以下几种访问权限:
private
private
表示私有的,凡是private
修饰的变量、方法、类(只能修饰内部类),只能在当前类中使用,就像你的个人私有的东西一样,只能你自己私有的东西,概不外借,比如内衣🤭。所以,private
是最小的访问控制权限
class Me {
private String name;
private String age;
}
默认
这里默认指的是不加任何修饰符,在前面的示例中,我们定义的所有变量基本上都没有加修饰符,对于这类变量、方法和类,只允许当前类和同包下的类访问。
我也忘记前面有没有讲过包这个概念,这里补充说明下,包是java
中的一种管理方式,就是为了保证类的唯一性,毕竟同名在实际代码开发中是一个普遍现象,而对于我等爱码士,命名也是个世纪难题,但如果加上包名,就可以很好地保证类的唯一性。我们在实际开发中,在创建一个类的时候,是需要指明类的包名的:
package io.github.syske.learning;
class Me {
private String name;
private String age;
int height;
double weight;
}
包名写在一个类的最开始,用package
修饰,具体语法如下:
package 包名
包名一般是域名反写,然后在加上一些分类描述,比如我上面的包名,就是我GitHub
的个人页面域名的反写,learning
是我自己加的分类。
再回到访问控制的话题上,比如我同包下有一个名为You
的类,这时候因为我的Me
类中有两个没有加修饰符的属性height
和weight
,在You
中是可以直接访问.
package io.github.syske.learning;
public class You {
public static void main(String[] args) {
Me me = new Me();
System.out.println(me.height);
System.out.println(me.weight);
}
}
protected
protected
受保护的,可以简单理解为有条件的访问控制,它修饰的属性、方法、类,除了他自己、同包下类可以访问,继承它的子类也可以访问。因为到这里,我们还没有讲继承的知识点,所以大家先记住这个知识点,后面会补充的。
package io.github.syske.learning;
class Me {
protected double money;
}
MySon
继承了Me
,所以可以直接访问由protected
修饰的money
package io.github.syske.learning;
public class MySon extends Me {
public static void main(String[] args) {
MySon son = new MySon();
System.out.println(son.money);
}
}
public
public
公共的,他是最友好的访问控制,由它修饰的类、方法、属性,允许任何人访问和使用,就像公共汽车一样,人人都可以乘坐。
package io.github.syske.learning;
public class You {
public String name;
}
访问控制补充
访问修饰符 | 本类 | 同包 | 子类 | 其他 |
---|---|---|---|---|
private | √ | × | × | × |
默认 | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
-
外部类不能直接使用内部类的成员变量和方法,可以通过先创建内部类的对象,然后通过内部类的实例对象来访问其成员变量和方法;
-
如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的的成员变量或方法,如果访问外部类的成员变量,可以使用 this.成员变量名 或者 this.方法() 来访问;
-
java中的静态内部类
(1)静态内部类不能直接访问外部的非静态成员,但可以通过new 外部类().成员的方式访问;
(2)如果外部类的静态成员与内部类的成员名称相同,可以通过类名.静态成员的方式访问;如果外部类的静态成员与内部类的成员名称相同,则可以通过成员名直接调用外部类的静态成员;
(3)创建静态内部类的对象时,不需要外部类的对象,可以直接创建内部类:对象名 = new 内部类();
- 访问权限:
当用某个类在另外一个类中创建对象后,如果不希望该类对象直接访问自己的变量(即不能直接通过“.”运算符来操作自己的成员变量),就应当将成员变量访问权限设置为private;
访问修饰符作用范围由大到小排列
public
> protected
> default
> private
结语
访问控制部分的内容主要是各种修饰符的应用,我们一定要掌握好这部分的知识点,要搞清楚什么时候使用哪种修饰符,这样后期我们才能写出更健壮的系统。好了,今天的内容就到这里吧,各位小伙伴,开工快乐呀。