由于学的有点杂,其他方面的后续博客可能会穿插着发布,见谅哈。

    这几天回顾了一下Java面向对象的一些东西,因此也借此机会把这几天的一些体会和内容记录一下。

    说到Java的三大特性,我们也都不陌生了,分别是:封装、继承和多态。首先我们先来说一下封装。


封装

    封装就是将对象的信息隐藏起来,禁止外部对内部信息直接操作,只开放我们提供的方法来进行操作,以此防止对内部信息进行的破坏和修改。比如我们使用电脑,并不需要理解他是怎么工作的,只需知道能用就行,否则反而可能对内部造成不不要的影响。

    为此我们可以隐藏成员变量和实现的过程,只暴露方法供外界操作对象。这样做的好处是,我们能够按照我们的意愿来限制用户的一些不合理的操作,使程序按照我们的设想正常运行,我们也能更好地维护和检查代码。接着既然说到封装了,那么访问控制符就是我们绕不开的一个东西。


    访问控制符

访问控制符就是用来控制类的成员访问权限的一个修饰的关键字。注意,这里的类成员包括内部类!!!

访问控制符总共有三个,分成三个限制访问的等级,分别是:public、protected、private再加上一个默认的、空的限制访问的等级,即总共有四个访问的限制等级。



public

protected

default(无访问控制符修饰)

private

同个类中

同个包中   


子类中



所有类



 

从这里可以看到,访问权限最大的是public,接着依次是protected、default,访问权限最小的是private。

其中protected表示该类的成员可以被同个包以及子类访问,可以用他来修饰方法,一般这样修饰的方法是用来给子类重写的。如果你不希望某个变量或方法被外部直接访问,你可以使用private来修饰,这样就只能在本类的内部使用它。


    外部类使用访问控制符

既然类成员可以有这么多的访问控制符可选,那么类是否可以有访问控制符呢,答案当然是肯定的。但是只能用pubic修饰或者default(无访问控制符修饰)。这两个的区别说白了其实就是能不能被其他的类引用(import),public修饰的类能被其他类引用,而默认的不行。

那为什么protected和private不也能用来修饰类呢?

我们来看看这两个访问控制符的访问范围。首先protected表示能被被修饰成员所在类的子类访问,private能被被修饰成员所在类的内部访问。对于外部类来说,他们是属于包的,并没有在其他类的内部,因此也就不需要使用这两个访问控制符了。使用public和default(无访问控制符修饰)已经可以控制类是否能被引用了,因此只需要这两个就足够我们使用了。当然对于初学者来说这个有点难以理解,没关系,等以后我们再回过头看的时候就能够理解了。


我们一般使用访问控制符有以下几个原则:①成员变量(除了类变量),绝大多数情况我们都应该使用private来修饰,以防止被外部直接操作。②固定的方法也应该用private,一般这些方法是用来做一些部分的。

我知道光是文字看着很累,我们可以看看接下来这一段代码:

class Person {
	private int age;
	private String name;
	
	public Person(int age, String name) {
		this.age = age;
		this.name = name;
		System.out.println("Person类的构造器");
	}
	
	public int getAge() {
		return age;
	}
	
	//通过方法控制内部被隐藏的成员变量,以此控制用户的访问
	public void setAge(int age) {
		if (age > 0 || age < 100) {
			this.age = age;
		} else {
			System.out.println("请输入正确的年龄!");
		}
	}
	
	public String getName() {
		return name;
	}
	
	//通过方法控制内部被隐藏的成员变量,以此控制用户的访问
	public void setName(String name) {
		if (name.length() < 5) {
			this.name = name;
		} else {
			System.out.println("名字长度不符合!");
		}
	}
	
	//可供子类重写的方法
	protected void skills() {
		System.out.println("读书");
	}
}


public class Student extends Person{

	public Student(int age, String name) {
		super(age, name);
		System.out.println("Student类的构造器");
	}
	
	//重写父类的方法
	//当子类具有父类所没有的特殊功能时,可使用重写来覆盖并隐藏父类的同名方法
	@Override
	protected void skills() {
		//子类方法使用super关键字引用父类同名方法的代码
		super.skills();
		System.out.println("做研究");
	}
	
	public static void main(String[] args) {
		Student a = new Student(18, "张三");
		
		System.out.println("学生a的年龄是:" + a.getAge() + " 学生a的名字是: " + a.getName());
		//此时的skills()方法会调用子类重写后的方法,
		//如果子类没有重写则继续向父类查找该方法并使用
		a.skills();
	}
}

通过上面这段简单的代码,我们可以来体验一下刚才说的这些东西,那么这一次我们就先到这里了,如有错误,请大家指出,谢谢。