Java课堂笔记之访问控制修饰符:private、protected、public

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011466469/article/details/88782599

背景:介绍Java访问控制修饰符的使用,本篇只贴代码,着重看注释,详见菜鸟教程!

1、新建一个Demo7,受保护的构造函数,只能被在相同包下的其他类调用。被私有的变量不能直接被外部类调用,需要创建公有的setter和getter方法,才能被相同类下其他类调用。

public class Demo7{

	/*
	 * 权限修饰符:private、protected、public、default private、default修饰的类只能在相同的包目录下被使用,
	 * 声明为 private 的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为 private。
	 * private修饰的变量,需要创建公有的getter和setter方法才能被使用 public公有的可以被任何包和外部类使用;
	 * protected修饰的方法、变量、构造器能被同一个包中的任何其他类访问
	 */
	int speed;
	// 私有化,不能被其他外部类访问,只能在同类中使用
	private String str = "我是汽车";

	// protected修饰变量
	protected int endSpeed;

	// 私有变量str的公共方法
	public String getStr() {
		return str;
	}

	public void setStr(String str) {
		this.str = str;
	}

	// 我是demo7的有参构造函数,私有修饰的private不能被继承和外部类调用,所以为了演示java继承类,构造函数不能被私有修饰
	protected Demo7(int startspeed) {
		speed = startspeed;
	}

	// public(公共控制符)
	public String increaseSpeed(int speed) {
		speed++;
		// System.out.println("7加速了~"+speed);
		return str + "加速后:" + speed;
	}

	// protected(保护访问控制符)指定该方法可以被它的类和子类进行访问。
	// 受保护的方法可以被同一个包中的任何类访问
	// 不同包里只能被之类访问
	protected String decreaseSpeed(int speed) {
		speed--;
		return str + "减速后:" + speed;
	}

	// 私有方法,不能被子类调用,只能在本类被调用
	private String reverseCharacters(String originalString) {
		String reverse = "";
		for (int i = originalString.length() - 1; i >= 0; i--) {
			reverse = reverse + originalString.charAt(i);
		}
		return reverse;

	}

}

2、再创建一个Demo8继承Demo7,但是不能调用父类私有修饰的reverseCharacters方法:

// 相同类下的继承父类,子类可以调用父类非private修饰的方法、变量
public class Demo8 extends Demo7 {

	// 继承Demo7中私有变量的公用getter和setter方法
	@Override
	public String getStr() {
		// TODO Auto-generated method stub
		return super.getStr();
	}

	@Override
	public void setStr(String str) {
		// TODO Auto-generated method stub
		super.setStr(str);
	}

	// 子类 的构造方法
	public Demo8(int startspeed) {
		super(startspeed);
		// TODO Auto-generated constructor stub
	}

	public void specialMethod() {
		System.out.println("子类特有的方法!");
	}

	// 被继承的类的方法权限是什么,继承者就使用什么权限
	@Override
	public String increaseSpeed(int speed) {

		// 子类可以直接调用父类的变量和方法
		// 同一个包的其他可以使用父类的protected修饰的变量
		endSpeed++;
		// 子类可以调用父类protected修饰的方式和变量,
		decreaseSpeed(5);

		// TODO Auto-generated method stub
		return super.increaseSpeed(speed);
	}

	@Override
	protected String decreaseSpeed(int speed) {
		// TODO Auto-generated method stub
		return super.decreaseSpeed(speed);
	}

}

3、再创建一个测试类Demo6,创建对象并调用Demo7、Demo8的方法和变量。

public class Demo6 {

	public static void main(String[] args) {
		int speed = 0;
		Demo7 d7 = new Demo7(speed);
		Demo8 d8 = new Demo8(speed);
		// d7.str; 在其他类无法访问demo7中私有的变量
		// 也就是可以覆盖原来类的变量的值
		d7.setStr("给demo7私有的变量str创建public公有的setters和getters方法,供外部类使用赋值:");
		System.out.println(d7.increaseSpeed(100));
		d8.setStr("demo8继承demo7的私有变量str提供的公共的getter和setter方法,共外部类使用赋值:");
		System.out.println(d8.decreaseSpeed(10));
  }
}

结果就是d7通过setter方法改变了原str的值,同样Demo8继承Demo7的结果也是一样被改变:

给demo7私有的变量str创建public公有的setters和getters方法,供外部类使用赋值:加速后:101
demo8继承demo7的私有变量str提供的公共的getter和setter方法,共外部类使用赋值:减速后:9

猜你喜欢

转载自blog.csdn.net/u011466469/article/details/88782599