在Java的程序中,我们经常见到如下的代码:
public class test {
private int a = 10;
protected void func(){
System.out.println("protected方法");
}
public static void main(String[] args){
System.out.println("main方法");
}
}
这里的private,protected,public,static都是Java语言中的修饰符,那么他们都有些什么作用呢?今天就让我们来探索一番吧~
目录
一.访问限定符
在讨论访问限定符之前,我们先要了解"包"的概念.
在生活中,为了更好地管理电脑中的歌曲,一种最好的方式就是将相同类型的歌曲放在一起成为一组,收集到一个文件夹里,在Java中,也存在类似的方法.
1.包
(1) 包的概念.
在面向对象体系中,提出了一个软件包的概念,即:为了更好地管理类,把多个类收集在一起成为一组,称为"软件包",简称"包".(可以简单理解为:包其实就是一个文件夹).
在idea中,我们通过可以通过src--New--Package的方式来自建包:
注意:
1.包名需要尽量指定成唯一的名字,通常会采用公司域名的倒置形式,例如:com.abc.demo1 .
2.包名和代码路径相匹配,例如创建了一个com.abc.demo1的包,那么就会存在一个对应的路径 com/abc/demo1 来储存代码.
3.文件最上方的package语句指定了该代码在哪个包中.
(2) 导包.
谈到包,其实Java中已经提供了很多现成的包(比如java.util包),里面有很多类(比如Date类) 可以供我们使用.
比如,我们现在要使用Date这个类:
方式1:直接调用
public class test {
public static void main(String[] args) {
java.util.Date date = new java.util.Date();//new一个java.util.Date类的对象
}
}
方式2(导包):先用import语句导入 java.util 包 的Date类
import java.util.Date;
public class test {
public static void main(String[] args) {
Date date = new Date();//new一个java.util.Date类的对象
}
}
方式3:导入 java.util 包的所有类(这种方式不建议使用,我们更建议显示指定要导入的类名)
import java.util.*; //本行代码表示导入了java.util包中所有的类
public class test {
public static void main(String[] args) {
Date date = new Date();//new一个java.util.Date类的对象
}
}
2.访问限定符
(1) private
private,即类访问权限,只能被private修饰的变量和方法只能在当前类中被访问.
class Student{
public int age;
private String name; //这里的private修饰 name,表示 name只能在当前类(Student类)中使用.
public void setName(String name){
this.name = name;//在类内可以访问 name
}
}
public class test {
public static void main(String[] args) {
Student stu = new Student();
stu.name = "xiaoming";//在类外无法访问到 name
}
}
若我们实在是想在类外访问到private修饰的变量,那我们可以借助成员方法来间接访问.
class Student{
public int age;
private String name; //这里的private修饰 name,表示 name只能在当前类(Student类)中使用.
public void seName(String name){
this.name = name;//在类内可以访问 name
}
public String PrinName(){
return this.name;
}
}
public class test {
public static void main(String[] args) {
Student stu = new Student();
stu.seName("Jack");
System.out.println(stu.PrinName()); //结果打印Jack.
}
}
(2) default
default(什么都不写),即包访问权限,只能在同一包中访问.
(3) protected
(此部分建议了解完继承部分语法之后再看)
protected,即子类访问权限.被protected修饰的变量或方法,在同一包中都可以被访问到,在不同包中只有子类可以访问到.
举例如下:
(4) public
public,即公开访问权限.不论在哪里都可以被访问到.这里小编就不再举例了~
二.static修饰符
1.static修饰成员变量
被static修饰的成员变量,称为静态成员变量.静态成员变量不属于某个具体的对象,而是所有对象共有的.
静态成员变量有如下特点:
- 不属于某个具体的对象,不存储在某个对象的空间中.是类的属性.
- 因为是类的属性,所以静态成员变量一般通过类名访问.
- 生命周期伴随类的一生.
- 静态变量存储在方法区中.
例如:一个班的学生有很多,但教室只有一间,所以,我们在创建学生类的时候,就可以将教室写成静态变量,属于学生类的属性,被所有学生对象所共有.
2.static修饰成员方法
被static修饰的成员方法,称为静态成员方法.静态成员方法不属于某个具体的对象,而是所有对象共有的.
静态成员方法有如下特点:
- 不属于某个具体的对象,不存储在某个对象的空间中.是类的属性.
- 因为是类的属性,所以静态成员变量一般通过类名来调用静态方法.
- 不能在静态方法中访问任何非静态成员变量/成员方法(因为非静态的变量和方法依赖于对象,而静态方法是类的属性,不依赖于对象) --- 说得再明白一些:静态方法不需要对象的调用,那么在静态方法中直接调用一个需要对象调用的非静态方法肯定是不行的.
- 在静态方法中,不能使用this(因为没有对象).
我们这里仍然用Student类来举例:
3.static修饰的成员变量的初始化
分为就地初始化和静态代码块初始化.
- 就地初始化:即 在静态成员变量定义时就直接给出初值.
- 静态代码块初始化(常用):利用静态代码块对静态变量进行初始化是主流的方法,那么 什么是代码块,什么又是静态代码块呢?下一个博客我将详细介绍代码块相关的内容,敬请期待~
那么,以上就是本篇博客的全部内容啦,如果喜欢小编的文章,可以点赞,评论,收藏~