一、继承 extends的概念
1.继承是指一个类包含另一个类的属性和行为,使其成为自己的属性和行为
2.通过继承,子类自动用有父类的所有普通成员(成员变量和成员方法)
父类(基类)中保留共性,子类(派生类)中保留特性(重用)
1 import java.util.*; 2 public class Main 3 { 4 public static void main(String[] args) 5 { 6 zi z = new zi("lian",20,"male"); 7 System.out.println(z.toString()); 8 } 9 10 } 11 class fu 12 { 13 public String name; 14 public int age; 15 public String sex; 16 public fu(String name, int age, String sex) 17 { 18 super(); 19 this.name = name; 20 this.age = age; 21 this.sex = sex; 22 } 23 @Override 24 public String toString() 25 { 26 return "name : "+name+"\n"+ 27 "age : "+age+"\n"+ 28 "sex : "+sex+‘\n‘+ 29 "--------------"; 30 } 31 32 } 33 class zi extends fu 34 { 35 36 public zi(String name, int age, String sex) 37 { 38 super(name, age, sex); 39 } 40 41 }
二、子类的构造方法
1.父类构造方法不能被子类继承
2.子类的构造方法中必须调用父类的构造方法
3.super()表示在子类对象中对其包含的父类对象的引用
-super(参数)表示调用父类构造方法
-super.function表示调用父类成员方法
三、类成员的可访问性
1.protected:
子类可以直接访问父类的protected成员,外界类不能访问其他类的protected成员;
谨慎使用protected:
因为他相当于允许子类直接操作父类对象,破坏了父类的封装性,因此,应优先使用父类的公有成员函数来操作子类中的父类对象
2.继承自Product的food和clothes的内存占用
四、继承的实现|Override
(一)重写(Override):子类覆盖父类的同名方法
1.要求:
(1)两同:必须和被重写方法有相同的名称、参数列表;
(2)两小于等于:
①子类方法的返回值类型比父类方法的返回值类型更小或相等
②子类方法声明抛出的异常要比父类方法抛出的异常类更小或相等
(3)一大于等于:子类方法的访问权限要比父类方法的访问权限更大或相等。即,重写方法不能使用比被重写方法更严格的访问权限。
(二)方法重载(Overload)
1.概念:当多个方法具有相同的名字并含有不同的参数(个数、类型)时,产生重载。
2.调用时根据参数不同加以区分(静态多态性)
五、final关键字
1.final变量:常量
2.final成员变量:初始化后不能被改变
3.final方法形参:不能修改形参的值
-对于形参是对象变量而言,final表示不能修改该形参所指的对象(即该引用值),但是对象的内容可以改变
4.final方法:阻止方法被重写
5.final类:阻止类被继承(final类的方法全是final方法)
六、对象转型
(一)问题引入:如何让Shop管理多种不同类型的产品(食物、服饰)
1.为食物、服饰各维护一个数组Product[] 、Food[] 、Clothes[]
-大量代码重复:可维护性差
-实现针对所有产品的操作变得极为复杂
2.实现核心:对象转型+多态
(二)对象转型
1.is-a关系:每一个子类对象“is-a”父类对象
2.对象转型:子类类型和父类类型之间的转换关系
3.两种转型关系:
4.instanceof:判断该引用所指对象是否属于该类的对象
5.通过父类引用不能访问子新增的成员
1 import java.util.*; 2 public class Main 3 { 4 public static void main(String[] args) 5 { 6 //向上转型 父类类型 = 子类对象 7 Product p = new Clothes("shoes",100); 8 9 System.out.println(p instanceof Product); 10 System.out.println(p instanceof Clothes); 11 12 System.out.println("---------------"); 13 14 //向下转型 子类类型 = (子类类型)父类引用 15 Clothes c = (Clothes)p;//强制转换 16 17 System.out.println(c instanceof Product); 18 System.out.println(c instanceof Clothes); 19 20 //基本数据类型的转换 21 int i = (int)1.123;//转换后数据变为目标类型 22 23 //对象转型casting 24 Product p1 = new Clothes("shirt",300);//转换后对象仍未原类型 25 26 } 27 28 } 29 class Product 30 { 31 public String name; 32 public double price; 33 public Product(String name, double price) 34 { 35 super(); 36 this.name = name; 37 this.price = price; 38 } 39 40 } 41 class Clothes extends Product 42 { 43 44 public Clothes(String name, double price) 45 { 46 super(name, price); 47 } 48 49 }