zoukankan      html  css  js  c++  java
  • 访问权限

    一、包     

    package p;
    
    public class SamePack {
    	public static void main(String[] args) {
    		
    	}
    }
    

       1、包的作用与声明

              

    /*
    	包:包类似于操作系统中的文件夹。(类似,不是等同)
    	包的作用:
    	1 包可以提供文件(.class)的分类管理。
    	2 包可以提供独立的命名空间,进而解决命名冲突。
    	3 包可以提供访问权限的控制,实现更好的封装。
    
    	包的声明:
    	package 包的名字。
    	以前我们没有显式的声明包,则文件处于无名包中。
    	
    	包也可以具有层次性,包与包之间,包与类之间,使用
    	.进行分隔。
    
    	包声明的要求:
    	1 位置:包声明必须是源文件中第一条有效的语句。
    	2 数量:最多只能有一条包声明语句。
    
    	当显式声明包时,编译与运行与之前的细微变化:
    	编译: javac -d class文件的路径 源文件.java
    	运行: java 类的全限定名(包名 + 类名)
    
    	当两个类(A与B)处于同一个包中时,在A类型中
    	可以通过简单名来访问B。
    	当两个类(A与B)不在同一个包中时,则不能通过
    	简单名进行访问。此时,可以:
    	1 使用类的全限定名访问。
    	2 导入该类型,然后就可以通过简单名来访问。
    
    	import
    	import 类的全限定名;
    	import使用规则:
    	1 位置:import语句必须出现在包声明之后,类型
    	声明之前。
    	2 数量:import语句可以有0条到多条。
    
    	import 包名.*;   导入该包中所有的类型。(按需导入)
    	按需导入仅会导入当前包中的所有类型,不包括子包
    	中的类型。
    	import 包名.子包.*;
    
    	java.lang包中的所有类会由编译器隐式的导入。
    	import java.lang.*;
    
    */
    package p;
    //package p.subp;
    
    import p2.DiffPack;
    
    public class PackageTest {
    	public static void main(String[] args) {
    		//System.out.println("Hello World!");
    		//在同一包中,可以通过简单名来访问一个类。
    		new SamePack();
    		//不在同一个包中,不能通过简单名访问。
    		//new DiffPack();
    		//使用类的全限定名访问包外的类
    		new p2.DiffPack();
    		//通过import导入该类型后,可以使用类的简单名进行访问。
    		new DiffPack();
    	}
    }
    //错误。
    //package p;
    

        2、静态导入

    /*
    	import static 静态导入
    	import与import static
    	import是导入一个(多个)类型,而import static
    	导入的是一个类型的成员(静态成员)。
    
    	当使用import static导入静态成员后,就可以直接
    	使用该静态成员(无需通过类名限定),就好像该
    	静态成员是当前类中所声明的一样。
    */
    
    import static java.lang.Math.sqrt;
    import static java.util.Arrays.*;
    
    public class ImportStatic {
    	public static void main(String[] args) {
    		int x = 100;
    		System.out.println(Math.sqrt(x));
    		//直接访问静态成员,就像本类中声明的一样。
    		System.out.println(sqrt(x));
    		int[] k = {5, 4, 3, 2, 1};
    		sort(k);
    	}
    }
    

         3、

    package in;
    
    /*
    	在类的内部,可以访问任意访问权限的成员变量。
    	因为在创建对象的时候,会自动调用构造器。
    	如果构造器没有访问权限,我们就无法成功创建对象。
    */
    public class PublicAc {
    	public int pubX;
    	int defX;
    	private int priX;
    
    	public void f() {
    		pubX = 1;
    		defX = 1;
    		priX = 1;
    		pubM();
    		defM();
    		priM();
    		new PublicAc();
    		new PublicAc(1);
    		new PublicAc(1, 1);
    	}
    
    	public PublicAc() {
    
    	}
    
    	PublicAc(int x) {
    
    	}
    
    	private PublicAc(int x, int y) {
    
    	}
    
    	public void pubM() {
    
    	}
    
    	void defM() {
    
    	}
    
    	private void priM() {
    
    	}
    }
    
    class DefAc {
    
    }
    

       4、访问修饰符           

    访问修饰符用来声明访问权限,访问权限由高到低为:
     public 共有权限,全部对外开发。
     protected 保护权限,对本包开放,对包外的子类开放。
     不加修饰符限定 默认权限,对本包开放。
     private 私有权限,仅对本类开放。
    说明:
     关于protected访问权限,推迟到继承的时候再说。
     访问修饰符可以修饰类(接口),方法,成员变量,构造器。
    

      

    /*
    	顶层类的访问权限可以是public与默认访问权限。
    	不可以是protected与private访问权限。
    	内部类可以是任意的访问权限。
    
    	在同一个包中,可以访问本包中声明为public,默认
    	访问权限的类。
    	在包外,可以访问声明为public访问权限类型。
    */
    
    package in;
    
    import out.*;
    /*
    	在类的外部,包的内部(同一个包中),可以访问
    	声明为public, 默认访问权限的成员,不能访问
    	声明为private访问权限的成员。
    */
    public class Access {
    	public static void main(String[] args) {
    		PublicAc p;
    		DefAc d;
    		PublicOut p2;
    		//DefOut d2;
    
    		PublicAc pa = new PublicAc();
    		pa.pubX = 1;
    		pa.defX = 1;
    		//pa.priX = 1;
    		pa.pubM();
    		pa.defM();
    		//pa.priM();
    		new PublicAc();
    		new PublicAc(1);
    		//new PublicAc(1, 1);
    	}
    }
    

        5、static 关键字    

    /*
    	static关键字
    	static可以修饰类(内部类),成员变量,方法。
    	局部变量不能使用static修饰。
    	当static修饰成员变量时,该变量称为静态成员变量。
    	没有使用static修饰的成员变量称为实例成员变量。
    	当static修饰方法时,该方法称为静态方法。
    	没有使用static修饰的方法称为实例方法。
    
    	静态成员变量与实例成员变量
    	1 变量的数量
    	静态成员变量为整个类所有(整个类只有一个),如果
    	一个对象改变了静态成员变量的值,将会影响到其他对象
    	(其他对象看到的将是修改之后的结果)。
    	实例成员变量为对象所有,每个对象都有自己的实例成员
    	变量,一个对象改变了实例成员变量的值,对其他对象
    	没有影响。
    	2 变量的访问方式
    	静态成员变量既可以通过对象的引用进行访问(强烈不建议),
    	也可以通过类名进行访问。
    	实例成员变量只能通过对象的引用进行访问。
    	3 初始化的时间
    	静态成员变量会随着类的初始化而初始化。
    	实例成员变量在创建对象时得到初始化。
    	静态成员变量的初始化时间要早于实例成员变量。
    */
    
    public class Static {
    	//实例成员变量
    	int x = 1;
    	//静态成员变量
    	static int y = 2;
    
    	public static void main(String[] args) {
    		Static s = new Static();
    		Static s2 = new Static();
    		s.x = 100;
    		//System.out.println(s2.x);
    		//通过引用访问静态成员变量。(不推荐)
    		s.y = 200;
    		System.out.println(s2.y);
    		//通过类名访问静态成员变量。
    		Static.y = 200;
    	}
    }
    

         6、

    /*
    	static修饰方法
    	静态方法与实例方法
    	1 方法的访问方式
    	静态方法既可以通过对象的引用来访问(强烈不推荐),
    	也可以通过类名来进行访问。
    	实例方法只能通过对象的引用进行访问。
    	2 成员的访问限制
    	静态方法只能访问静态成员(静态成员变量,静态方法等)。
    	实例方法既可以访问静态成员,也可以访问实例成员。
    	3 this与super
    	静态方法中不能使用this与super。
    	实例方法中可以使用this与super。
    */
    public class Static2 {
    	int x = 1;
    	static int y = 2;
    
    	//实例方法
    	public void f() {
    		x = 1;
    		y = 2;
    		g();
    		staticF();
    	}
    
    	public void g() {
    
    	}
    	//静态方法
    	public static void staticF() {
    		//错误,静态方法不能访问实例成员。
    		//x = 1;
    		//g();
    		y = 2;
    		staticG();
    		//Static2.staticG();
    	}
    
    	public static void staticG() {
    
    	}
    
    	public static void main(String[] args) {
    		Static2.staticF();
    		/*
    		Static2 s = new Static2();
    		s.f();
    		//通过引用访问静态方法(不推荐)
    		s.staticF();
    		//通过类名访问静态方法
    		Static2.staticF();
    		*/
    	}
    }
    

         7、

    /*
    	静态成员变量的初始化
    	1 在变量声明处初始化
    	2 使用静态初始化块
    
    	两种初始化执行顺序与在类中声明的顺序一致。
    	(先声明的先执行)
    
    
    */
    
    public class StaticInit {
    	
    	
    	//静态初始化块
    	//在类初始化时会得到执行。
    	static {
    		//x = 5;
    		System.out.println("静态初始化块执行");
    	}
    
    	//static int x = initX();
    	static int x;
    
    	public StaticInit() {
    		x = 100;
    	}
    
    	public static int initX() {
    		System.out.println("x初始化执行");
    		return 1;
    	}
    
    	public static void main(String[] args) {
    		System.out.println(x);
    	}
    }
    

        8、final  关键字

                

    /*
    	final可以修饰成员变量,局部变量,方法,类。
    	final修饰变量,该变量一经赋值,就不能够再进行修改。
    	final修改变量,该变量就会成为常量。
    */
    
    public class FinalTest {
    	//final修饰成员变量时,需要进行显式的初始化,
    	//不可以拿默认值作为初始值。
    	final int k;
    
    	{
    		//k = 2;
    	}
    
    	public FinalTest(int k) {
    		this.k = k;
    	}
    
    	public static void main(String[] args) {
    		final int x = 1;
    		//x = 2;
    		//final修饰一个局部变量,没有初始值,只要不使用
    		//该变量,就没有问题。
    		final int y;
    		//x = 1;
    		
    		final int[] a = {1, 2, 3, 4, 5};
    		a[0] = 1000;
    		System.out.println(a[0]);
    		//a = #0x2345;
    		//a = new int[3];
    		//a = null;
    
    	}
    
    	public void f(final int k) {
    		//错误
    		//k = 2;
    	}
    }
    

       9、

    /*
    	final修饰变量的好处:
    	1 使用final修饰变量,可以防止变量被意外的进行修改。
    	2 使用final可以避免魔幻数字的产生,增加程序的可读性。
    	3 使用final可以提高程序的可维护性。
    
    */
    public class FinalAd {
    	final int WIDTH = 10;
    	final int HEIGHT = 5;
    	
    	public void compute() {
    		//int area = 10 * 5;
    		int area = WIDTH * HEIGHT;
    	}
    }
    

      10、private            

    /*
    	类的封装
    	隐藏底层的实现细节,将类中声明的成员变量私有化(private)。
    	
    	提供公有getter与setter方法,供外界进行间接访问。
    	getter 获取成员变量的值。
    	setter 设置成员变量的值。
    */
    public class Private {
    	//int x; => int x2;
    	private int x2;
    
    	public int getX() {
    		return x2;
    	}
    
    	public void setX(int x) {
    		this.x2 = x;
    	}
    
    
    }
    
    class Another {
    	public void access() {
    		Private p = new Private();
    		//p.x = 1;
    		p.setX(1);
    		//System.out.println(p.x);
    		System.out.println(p.getX());
    
    	}
    }
    

         

        

  • 相关阅读:
    IDEA创建一个javaweb工程(在module中)以及配置Tomcat
    晨会复盘
    cnblog 笔记思路
    Mysql执行计划-extra
    Mysql执行计划分析-type(access_type)
    Mysql执行计划-selectType
    刻意训练
    MYSQL执行计划
    个人展望-程序员职业规划
    服务拆分原则
  • 原文地址:https://www.cnblogs.com/liuwei6/p/6571711.html
Copyright © 2011-2022 走看看