1.继承使用说明

1.1继承时的封装

封装中我们希望进行封装操作的类的内部实现细节不会被其他类修改(set&get)、想隐藏的信息不能被其他类直接访问(private修饰),但是通过继承的方式,子类虽然无法访问被隐藏的信息,但是子类可以重写父类的方法,修改父类已经写好的实现封装的方法从而破坏封装
破坏封装的示例代码如下:
父类里的代码:

public class Father {
	//隐藏的变量
	private int age;

	//进行封装的getAge方法
	public int getAge() {
		return age;
	}

	//进行封装的setAge方法
	public void setAge(int age) {
		if(age < 23) {
			System.out.println("信息错误");
		}else {
			this.age = age;
		}
	}
}

子类里的代码如下:

public class Son extends Father{
	//重写父类的getAge方法,破坏封装
	public int getAge() {
		return 18;
	}
	
	public static void main(String[] args) {
		Son son = new Son();
		son.setAge(25);
		//破坏封装后,输出的值为:18
		System.out.println("父类private int age的值是:" + son.getAge());
	}
}

1.2父类设计规则

  • 尽量隐藏父类的内部数据,需要隐藏的使用private修饰;
  • 不要让子类可以随意修改、访问父类用于封装的或其他的重要方法;当不希望方法被子类重写但又要供给其他的类使用时,可以使用final修饰符;当该方法可以给子类重写但不能给其他类自由访问时,可以用protected修饰
  • 不要在父类构造器中调用被子类重写的方法。

对于第三项,如果出现在父类构造器找那个调用被子类重写的方法时,会出现空指针异常情况,具体的代码示例如下:
父类代码:

public class Father {
	//父类构造器初始化idea方法
	public Father(){
		idea();
	}
	
	public void idea() {
		System.out.println("要被子类重写的方法");
	}
}

子类代码:

public class Son extends Father{
	private String name;
	
	//重写父类的idea方法
	public void idea() {
		System.out.println("重写父类的idea方法,输出name的长度:" + name.length());
	}
	
	public static void main(String[] args) {
		Son son = new Son();
	}
}

因为此时的name的值为null,会引发空指针异(java.lang.NullPointerException)。

2.利用组合进行复用

2.1组合

组合是把旧类里的成员变量直接作为新类里的成员变量组合进来,用户看到的那么就是新类里的方法;通常需要在新类里使用private修饰被组合的旧类对象。

2.2代码示例

class Old{
	//隐藏的方法,新类不可用
	private void OldIdea() {
		System.out.println("Old类的OldIdea方法");
	}
	//组合后可以直接使用的方法
	public void test() {
		OldIdea();
		System.out.println("Old类的test方法引用private void OldIdea()");
	}
}

public class Conposite {
	//将原来的旧类Old作为新类的一部分,组合进新类
	private Old old;
	//构造器
	public Conposite(Old old){
		this.old = old;
	}
	
	//新类中可以直接使用旧类的方法
	public void test() {
		old.test();
		System.out.println("Conposite类的test方法直接使用Old类的test方法");
	}
	
	public static void main(String[] args) {
		//创建组合对象
		Old old2 = new Old();
		Conposite conposite = new Conposite(old2);
		//使用新类的方法
		conposite.test();
	}
}

运行结果为:
Old类的OldIdea方法
Old类的test方法引用private void OldIdea()
Conposite类的test方法直接使用Old类的test方法

3.总结归纳

3.1继承

3.1.1继承的推荐使用范围

继承是可以对父类进行改造、重写,在不写过多的新方法时通过对父类的部分改造获得一个特殊的版本,将一个较为模糊抽象的类改造成适用于某些特殊情况的类。

3.1.2图解

Java基本知识——继承与组合

3.2组合

3.2.1组合的推荐使用范围

如果两者之间存在着明确的整体和部分关系,那么就可以使用组合来实现复用。

3.2.2图解

Java基本知识——继承与组合

相关文章: