JAVA学习日志之访问修饰符

访问修饰符

访问修饰符是指在编写程序中的方法或属性的过程中,对方法或属性强加的限定符。
访问修饰符可以决定在什么样的情况下程序能够访问(使用)这些属性或方法,什么情况下不能访问。
访问修饰符的出现,提高了JAVA程序的安全性,灵活使用访问修饰符,可以避免代码滥用、访问越界,有效控制程序结构。

方法及属性的访问修饰符

  1. private——私有权限
    private修饰符可以修饰类的数据成员和方法成员,不可以修饰类本身和接口。private修饰符可以使被它修饰的对象不被类以外的任何东西接触到,换句话说,就是对外隐藏它所修饰的成员。从外面看来,类的内部好像根本不存在该private成员一样,无论是想通过类或实例对象进行直接访问,或者是试图以继承的方式来接触private成员,都是不可能的。因此,只有在类内可以自由访问该成员,一旦出了该类的范围,进入一个同包的继承子类、或者一个包外的继承子类、或者其他的类,该成员就变得不可触及了,专业术语称此现象为invisible

    在Java中,private天生就是final的。我们讨论继承和多态都是针对类的对外接口,包括public方法、protected方法和默认的friendly方法,而private是不被纳入考量的,在某种意义上,Java中的private方法纯粹是为方法而方法,是一种组织代码使之更加清晰、更易维护的手段而已。由此可见,在继承中,从面向对象的角度考虑,基类中私有的东西对外界、对子类都是不可见的,子类根本不应该知道基类中任何私有的东西,于是子类继承,覆写基类方法或属性也应无从谈起,即使方法重名,那也应该仅仅看做是一种巧合。

  2. 默认修饰符(不用修饰符)——家庭权限
    一个被修饰对象没有修饰符修饰它的时候,并不表明它真的没有修饰符,而说明它此时带了一个“默认修饰符”。默认修饰符可以修饰类符数据成员、方法成员以及类本身和接口。默认修饰符所规定的被访问方位比private稍大一些,达到了“包”一层的范围。

    当一个默认修饰符修饰一个类成员时,表明该成员可以在同属一个包的某个类内被自由访问,无论这个类是通过直接访问的方式还是通过继承的方式来访问该成员。但是,一旦出了这个包,这个类成员就变得invisible了。也就是说,在非同一个包的某个类里面,获得一个该类的实例的话,通过这个实例是访问不到被默认修饰符修饰的该类成员的;另一方面,如果非同一个包的某个类继承了该类,它同样无法访问该类(也就是其父类)的任何被默认修饰符修饰的成员。

    当一个默认修饰符修饰一个类或接口的时候,表明它只可以被包内的其他类继承或(实例化)使用,而对于包外的任何类,它都是invisible的,因此就不能继承该类或使用该类或实现该接口。要使一个类能被包外的类所继承或(实例化)使用,一定要在class关键字前加上public修饰符。有一点例外就是,接口中的方法不管加不加public,其实都是默认是public的。

  3. protected——家族权限
    提到protected修饰符,就一定要想到继承的情况,因为protected关键字就是为了这种情况而创造的。protected修饰符可以修饰类的数据成员、方法成员,但不能修饰类本身和接口。protected修饰符修饰一个类的成员的时候,它所提供的被访问范围会比默认修饰符大一点点。大就大在下面这种情况:非同一个包的某个子类继承了该类,将其作为父类的时候,虽然父类的默认修饰符修饰的成员对于子类不可见,但是此时被protected修饰符稀释的父类成员对于子类是可见的。

  4. public——完全开放

    public修饰符可以修饰类的数据成员和方法成员,以及类本身和接口。public修饰符将提供最大的被访问范围。
    一个被public修饰符修饰的类成员可以在任何其他类中被自由访问,不管该类是不是同一个包的,也不管该是是直接访问或者通过继承的方式来访问。
    一个被public修饰符修饰的类或接口可以被同一个包或非同一个包的其他类自由继承和使用。
    对于继承来说,一个覆盖其父类方法的子类方法的访问修饰符只能保持或扩大该方法的被修饰范围,而不能使之缩小。对于接口来说,实现类中对接口方法的实现,必须是public访问修饰符修饰的。

package com.hopeful.earth;

public class Father {
	
	//访问限定符  类型  变量名=值;
	
	private String _private = "_private";
	String _friendly = "_friendly";
	protected String _protected = "_protected";
	public String _public = "_public";
	
	public static void main(String[] args){
		Father father = new Father();
		System.out.println(father._private);
		System.out.println(father._friendly);
		System.out.println(father._protected);
		System.out.println(father._public);
	}

}

测试结果:均可使用
在这里插了入图片描述
下面在本包中创建另一个类进行测试。

package com.hopeful.earth;
//基准类,在地球家庭包

public class SamePkg {
	public static void main(String[] args){
	//在同一个包中进行测试
		Father father = new Father();
		System.out.println(father._private);//这句会报错
		System.out.println(father._friendly);
		System.out.println(father._protected);
		System.out.println(father._public);
	}
}

当把报错行注释掉,结果为:
在这里插入图片描述
同一个包,相当于是在一个家庭,所以家中的东西,除了个人私有的,均可使用。
再来尝试不同的包。

package com.hopeful.mars;

import com.hopeful.earth.Father;
//其他包中的类,位于火星家
//要使用地球家的东西,首先要导包
//由于不在一个包,又没有什么血缘关系,导致只能使用public的属性

public class OtherPkg {
	public static void main(String[] args){
		//在不同包中进行测试
		Father father = new Father();
		System.out.println(father._private);//报错
		System.out.println(father._friendly);//报错
		System.out.println(father._protected);//报错
		System.out.println(father._public);
	}
}

测试结果:除标示为public的属性外,均不能使用。

很显然,由于不是一个家庭,而且没有什么血缘关系,所以除了大家公开的内容外,其他一概不允许访问。如果位于不同包,但有血缘关系(继承)呢?
在这里插入图片描述

如果在不同包内,而且是父子关系,那么如果在子类中继续创建父类对象,或者通过父类引用子类对象,均不可使用除了public修饰外的其他访问修饰符,这是由于你既然继承了父类,那么在子类中创建父类对象是体现不出它们之间的继承关系的。protected修饰符正是为了解决父子之间的特殊关系而设计的一个修饰符,所以一旦我们创建子类对象,就可以访问父类中的受保护的属性和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值