Java访问修饰符

   本文对java中的修饰符问题做个简单梳理,java中的修饰符包括成员的修饰符、类和接口的修饰符,内部类与外部类的修饰符,以下对上述三个方面分别说明。

   1.成员的访问控制修饰符

权限修饰符当前类其它包子类同包其它包
public√/*√/*
protected√/*√/*×
default×√/*×
private×××

   public修饰的成员可以在当前类、子类、同包、其他包中被访问。private修饰的类属性和方法仅在当前类有效,子类重写父类的private修饰的方法是没有意义的,相当于定义一个新方法。以后只要是编写方法,99%的情况下都使用public进行定义。default对于同一个包中的其他类相当于公开(public),它不仅能在设置了该权限的类中访问,也可以在同一包中的类或子类中访问,对于不是同一个包中的其他类相当于私有(private)protected除了具有default的访问权限外,还可以在不同包中所继承的子类访问,对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。要想更深入地理解这些访问权限,一方面需要明白各自的作用域,另一方面更是要弄清楚各自所体现出来的编程思想,比方说,private表现的封装思想,public表现的面向接口编程的思想等。<!--EndFragment-->

   关于default和protected区别的测试代码

 

package test1;
public class Car {
	String color;
	protected int wheels;
}
package test1;
public class Pickup extends Car {
	String color = "silver";
	protected int wheels = 4;
	void print(){
		System.out.println(super.color);
		System.out.println(super.wheels);
	}
}
package test1;
public class TestDemo {
	public static void main(String[] args) {
		Pickup p = new Pickup();
		System.out.println(p.color);
		System.out.println(p.wheels);
		p.print();
	}
}
package test2;
import test1.Car;
public class Pickup extends Car {
	void print(){
		System.out.println(super.color);//The field Car.color is not visible
		System.out.println(super.wheels);
	}
}
package test2;

import test1.Pickup;

public class Truck {
 
	Pickup p = new Pickup();
 
	void print(){
  
		System.out.println(p.color);//The field Pickup.color is not visible
  
		System.out.println(p.wheels);//The field Pickup.wheels is not visible
 
	}
}

 

   2.类和接口的修饰符

 

   成员访问控制修饰符中的public和default还可以修饰类,在同一个java文件里,公有类有且仅有一个,并且该文件命名为类名.java

修饰符成员方法成员属性接口外部类内部类
public 
protected  ×
default 
private  ×
abstract   
static×  
final   

 

 

   abstract和final修饰符只能二选一。

 

   3.内部类与外部类的修饰符

 

<!--EndFragment-->

 

 

 

class Outer { //  定义了外部类
	private String title = "HELLO WORLD" ;
	public void fun() {
		new Inner().print() ;
	}
	class Inner { //  定义内部类
	public void print() {
		System.out.println(title) ;
	}
	}
}
public class TestDemo {
	public static void main(String args[]) {
		Outer out = new Outer() ;
		out.fun() ;
	}
}

   外部类也可以直接操作内部类中的私有属性。

 

 

 

 

class Outer { //  定义了外部类
	private String title = "HELLO WORLD" ;
	class Inner { //  定义内部类
		private String msg = " 你好" ;  //  私有属性
		public void print() {
			System.out.println(Outer.this.title) ;
		}
	}
	public void fun() {
		Inner in = new Inner() ;
		System.out.println(in.msg) ;//  这是直接访问私有属性
	}
}
public class TestDemo {
	public static void main(String args[]) {
		Outer out = new Outer() ;
		out.fun() ;
	}
}

 

   对于内部类而言,也可以使用static关键字进行定义,使用了static定义的内部类严格来讲就变为了一个外部类。

 

 

 

class Outer { //  定义了外部类
private static String info = "Hello " ;
	static class Inner {
		public void print() {
			System.out.println("Hello World .") ;
                   System.out.println(info) ;
		}
	}
}
public class TestDemo {
	public static void main(String args[]) {
		Outer.Inner in = new Outer.Inner() ;
		in.print() ;
	}
} 

<!--EndFragment-->

   同时需要注意的是,如果此时要想通过内部类访问外部类中的属性,则外部类中的属性一定要使用static定义。

 

   除了普通类可以定义内部类之外,也可以在抽象类或接口的内部定义内部类、内部抽象类、内部接口等等。特别说明的是:如果在定义内部接口的时候使用了static,那么就表示定义的是外部接口。

 

interface A {
	static interface B {
		public void printB() ;
	}
}
class X implements A.B {
	public void printB() {}
}

 

   匿名内部类

 

interface A{
	public void fun() ;
}
public class TestDemo{
	public static void main(String args[]) {
		A a = new A(){
			public void fun(){
				System.out.println("Hello World .");
			}
		};//匿名内部类,前面的部分可以认为是父类的引用,后面直接重写父类方法。
		a.fun();
	}
}
修饰符功能
transient告诉编译器,在类对象序列化的时候,此变量不需要持久保存。
volatile指出可能有多个线程修改此变量,要求编译器优化以保证对此变量的修改能够被正确的处理。
native用该修饰符定义的方法在类中没有实现。
synchronized同步方法,多线程的支持。
 scrictpf当对一个类或接口使用strictfp关键字时,该类中的所有代码,包括嵌套类型中的初始设定值和代码,都将严格地进行计算。严格约束意味着所有表达式的结果都必须是IEEE754算法对操作数预期的结果,以单精度和双精度格式表示。

 

 

 

<!--EndFragment-->

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值