*********************第八章 复用类和多态******************************
可复用
一.方法
二.复用 类
1.组合
2.继承
*****************************组合 has a******************************
一.什么是组合
是关联的特例
组合: 部分只能属于一个整体
整体有一个部分
人和心脏 汽车和发动机
二.how
类A 组合 一个类B的对象
class A {
B b = new B();//组合
}
举例1:
学生有一个女朋友
public class Student{
private int sno;
private String name;
private int age;
private Girl girl = new Girl();//组合
}
举例2:
笔记本有一个屏幕
14寸屏幕
package com.chapter8.演示组合;
//14寸的屏幕
public class Screen14 {
public void display(){
System.out.println("使用14寸屏幕进行显示");
}
}
笔记本
package com.chapter8.演示组合;
//笔记本
public class Notebook {
//组合
//has a 笔记本 有一个屏幕
private Screen14 screen = new Screen14();
public void work(){
System.out.println("主板通电");
System.out.println("硬盘转");
System.out.println("cpu从硬盘中读取操作系统文件");
System.out.println("风扇转");
screen.display();//复用了屏幕类的代码 不需要从新再写一遍屏幕的显示逻辑了
}
public static void main(String[] args) {
Notebook notebook = new Notebook();
notebook.work();
}
}
三.why 为什么用组合
复用类的代码
当多个类中 有相同的代码时 使用方法来复用代码 就不管用了
1.需要把多个类中(战士、法师、弓箭中)相同的代码 抽取出来 抽到一个类中(Knife 刀)
2.定义的战士的时候 让战士组合一把刀 复用刀的代码
//战士 has a 刀
class 战士 {
private Knife knife = new Knife();//组合
public void attack(){
knife.kan();
}
}
其他类也是一样
class 弓箭手 {
private Knife knife = new Knife();//组合
public void attack(){
knife.kan();
}
}
*****************************局部变量能使用 访问控制权限修饰符 修饰吗??***************************
不能.因为局部变量的作用域由程序员定义的位置决定,不能使用 访问权限修饰符修饰
一.修饰类的
二.修饰类的成员的(1.属性 2.方法)
***********************************依赖关系*****************************************
把一个对象 定义成局部变量 并且调用该对象的方法 这时候会产生依赖
例如
package com.chapter8.演示组合;
依赖
// 笔记本的工作---------->屏幕的显示
public class Notebook {
public void work(){
Screen14 screen = new Screen14();//依赖
System.out.println("主板通电");
System.out.println("硬盘转");
System.out.println("cpu从硬盘中读取操作系统文件");
System.out.println("风扇转");
screen.display();//复用了屏幕类的代码 不需要从新再写一遍屏幕的显示逻辑了
}
public static void main(String[] args) {
Notebook notebook = new Notebook();
notebook.work();
}
}
**********************************继承******************************
复用类的第二种方式: 继承
一.why 什么时候想到使用继承
当多个类中有相同的方法(吃饭、睡觉、打豆豆),为了防止多个类中相同的方法或属性
出现多次,可以把多个类中相同的属性和方法 抽取到一个类中 Person,其他类继承这个Person
即可,解决了代码冗余问题
二.what 什么是继承 is a
准确的应该翻译成扩展 ,可以理解成复制
学生类继承人这个类,相当于学生类 在人这个类的基础上扩展代码(加代码)
Person类可以看成代码的0.1版本
子类 Student 可以看成 0.2版 在0.1的基础上加代码
子类 is a 父类
学生 is a Person
老师 is a Person
public class Person {
public void eat() {
System.out.println("吃饭");
}
public void sleep() {
System.out.println("睡觉");
}
public void beatBeanBean() {
System.out.println("打豆豆");
}
}
public class Student extends Person{
public void study(){
//我在学习
}
}
相当于
public class Student{
public void eat() {
System.out.println("吃饭");
}
public void sleep() {
System.out.println("睡觉");
}
public void beatBeanBean() {
System.out.println("打豆豆");
}
public void study(){
//我在学习
}
}
三.how 如何继承
使用extends 关键字
public class Student extends Person{
public void study(){
//我在学习
}
public static void main(String[] args) {
Student s = new Student();
s.eat();//子类中没有定义eat() 但是可以调用 说明从父类中继承了eat()方法
}
}
Person 叫做父类,也叫做 基类、超类
Student 叫做子类, 也叫做派生类、衍生类
**不要重造轮子,父类的代码写过一遍,就不要再从新写了, 直接继承就可以了...
***********************************组合和继承如何选用?*******************************************
多用组合,少用继承。 除非有明确的is a 关系再使用继承
学生 is a Person
为什么要多用组合,少用继承?
因为组合比继承更加灵活
*********************继承中的访问控制权限修饰符******************************
1.private
private修饰的属性和方法 不能被继承
2. protected 和public 修饰的属性和方法 可以被继承
3. default
包权限
本包中的子类 可以继承,其他包中的子类不能继承
举例: 爸爸的宝马车
父亲
//父类
public class Father {
//has a 组合
BMW bmw = new BMW();
}
孩子
public class Son extends Father{
public void goToPlay(){
bmw.drive();
}
public static void main(String[] args) {
Son son = new Son();
son.goToPlay();
}
}