Java中的函数作用域和访问修饰符
Java是一种面向对象的编程语言,函数作为对象的一部分,在其中有着重要的作用。在Java中,函数的作用域和访问修饰符决定了函数的可见性和访问权限,广泛应用于面向对象编程中的封装、继承和多态机制等。
一、函数作用域
Java中函数作用域指的是函数中定义的变量和对象的可见度。函数作用域主要分为三种类型:全局作用域、参数作用域和局部作用域。
1、全局作用域
全局作用域指的是在类中定义的变量和对象,它们在类内任何地方都是可见的,因此也可以被任何函数所访问。在Java中,全局变量一般是使用static关键字修饰,而全局对象则可以使用类名即可访问。例如:
public class Test{
static int i=1;//全局变量
static Student student;//全局对象
public static void main(String[] args){
student=new Student();//创建Student对象
student.show();//调用Student对象方法
System.out.println(i);//在main函数中输出全局变量i
}
}
class Student{
public void show(){
System.out.println("I'm a student.");//Student对象方法
}
}
在这个例子中,我们定义了一个全局变量i和一个全局对象student。我们在main函数中使用了全局对象student来调用其内的方法show(),而在main函数中也访问了全局变量i。由于它们都是全局变量和对象,因此在main函数中可以访问到。
2、参数作用域
参数作用域指的是函数中定义的参数,它们在函数内部是可见的,在函数外部是不可见的。因此,参数的作用域和局部变量的作用域比较相似。例如:
public class Test{
public static void main(String[] args){
add(1,2);//调用add函数并传入两个参数
}
public static void add(int a,int b){//定义add函数
int sum=a+b;//在add函数中定义临时变量sum
System.out.println(sum);//输出sum的值
}
}
在这个例子中,我们定义了一个add函数,并在main函数中调用。在add函数中我们定义了两个参数a和b和一个临时变量sum。它们都是在函数内部可见的,因此在add函数外部是无法访问它们的。在add函数内部我们将a和b相加后存入了临时变量sum,最后将sum的值输出到屏幕上。
3、局部作用域
局部作用域指的是函数中定义的临时变量、循环变量、条件语句中的变量以及内部类中的变量等。这些变量仅在当前函数或代码块内部可见,离开代码块或函数后就无法访问到了。例如:
public class Test{
public static void main(String[] args){
int x=1;//定义一个局部变量x
{
int y=2;//在代码块内定义一个临时变量y
System.out.println(x+y);//输出x和y的和
}
System.out.println(x);//在main函数中输出x的值
}
}
在这个例子中,我们在main函数中定义了一个局部变量x,并在一个代码块内部定义了一个临时变量y。在代码块内部,我们将x和y相加并输出了结果,而在代码块外部也输出了x的值。由于y是一个临时变量,超出了代码块的范围,因此在代码块外部无法访问到。
二、访问修饰符
Java中的访问修饰符用于限定类、接口、变量和方法等的访问权限。Java语言共有四种访问修饰符:public、private、protected和default。
1、public
public访问修饰符是指公有的,任何类均可访问公有的成员变量和方法,也可以直接访问公有的类和接口。例如:
public class Test{
public int i=1;//定义公有变量
public void show(){//定义公有方法
System.out.println("This is a public method.");
}
}
public class Main{
public static void main(String[] args){
Test t=new Test();
t.i=2;//修改公有变量i的值
t.show();//调用公有方法
}
}
在这个例子中,我们定义了一个公有类Test,并在类中定义了一个公有变量i和一个公有方法show()。在main函数中,我们先创建了一个Test对象t,然后修改了公有变量i的值,并调用了公有方法show()。
2、private
private访问修饰符是指私有的,一个类中的私有成员变量和方法只有在该类中才可被访问,其他类无法访问。例如:
public class Test{
private int i=1;//定义私有变量
private void show(){//定义私有方法
System.out.println("This is a private method.");
}
}
public class Main{
public static void main(String[] args){
Test t=new Test();
//t.i=2; 无法直接访问私有变量i
//t.show(); 无法直接调用私有方法
}
}
在这个例子中,我们定义了一个Test类,并在类中定义了一个私有变量i和一个私有方法show()。在main函数中,我们无法直接访问或调用Test类的这两个私有成员。
3、protected
protected访问修饰符是指受保护的,一个类中的受保护成员变量和方法只有在该类及其子类中才可被访问,其他类无法访问。例如:
public class Test{
protected int i=1;//定义受保护变量
protected void show(){//定义受保护方法
System.out.println("This is a protected method.");
}
}
public class SubTest extends Test{
public void test(){
i=2;//访问父类受保护变量
show();//调用父类受保护方法
}
}
public class Main{
public static void main(String[] args){
SubTest subtest=new SubTest();
subtest.test();//调用子类方法
}
}
在这个例子中,我们定义了一个Test类,并在类中定义了一个受保护变量i和一个受保护方法show()。然后又定义了一个子类SubTest,继承自Test类,并在其中定义了一个方法test()。在test()方法中,我们访问了父类的受保护变量i,并调用了父类的受保护方法show()。在main函数中,我们创建了一个SubTest对象并调用了其test()方法。
4、default
default访问修饰符是指缺省的,它表示一种中间状态,访问权限限定的范围比protected还要严格。default访问修饰符下,同一包中的类可以访问同一包中其他类、接口的default成员。经常被人误认为无修饰符,但是它和后者的含义是不同的。例如:
package test; //将当前类所在包的名称指定为test
class Test{
void show(){//定义默认方法,仅限当前包中访问
System.out.println("This is a default method.");
}
}
public class Main{
public static void main(String[] args){
Test t=new Test();//创建Test对象
