目录
(1)继承是面向对象的三大特征之一,继承可以解决编程中代码冗余的问题,是实现代码重用的
重要手段之一。
(2)继承是软件可重用的一种表现,新类可以在不增加自身代码的情况下,通过从现有的类中继
承其属性和方法,来充实自身内容,这种现象或行为就称为继承。此时,新类称为子类,现有的类
称为父类。
(3)继承最基本的作用就是使得代码可重用,增加软件的可扩充性。
(4)Java中只支持单根继承,即每个类只能有一个直接父类。
(5)继承表达的是“XX is a XX”的关系,或者说是一种特殊和一般的关系。如Dog is a Pet.
(6)继承的语法格式如下:
[访问修饰符] class
//代码
}
-->在Java中,继承通过extends关键字实现,其中SubClass称为子类,SuperClass称为父类或基
类。
-->访问修饰符如果是public,那么该类在整个项目中可见。
-->若不写访问修饰符,则该类只在当前包中可见。
-->在Java中,子类可以从父类中继承以下内容:
》 可以继承public和protected修饰的属性和方法,不论子类和父类是否在同一个包里。
》 可以继承默认访问修饰符修饰的属性和方法,但是子类和父类必须在同一个包里。
》 无法继承父类的构造方法
public class Dog extends Animal
Dog 继承 Animal
(1)super关键字代表父类引用,和this关键字的作用类似,都是将屏蔽了的成员变量、成员方法
变得可见、可用,也就是说,用来引用被屏蔽的成员变量或成员方法。
(2)super是用在子类中,目的只有一个,就是访问直接父类中被屏蔽的内容,进一步提高代码的
重用性和灵活性。
(3)super关键字可以访问父类的构造方法、属性、一般方法。
(4)通过super访问父类成员的语法格式如下:
访问父类构造方法:super(参数)
访问父类属性/方法:super.<父类属性/方法>
-->super只能出现在子类(子类的方法和构造方法)中,而不是其他位置。
-->super用于访问父类的成员,如父类的属性、方法、构造方法。
-->具有访问权限的限制,如无法通过super访问父类的private成员。
- public Dog() {
- super();//表示使用Animal类中的无参构造方法
- }
-
- public Dog(String name, int health, int love, String strain) {
- super(name, health, love);//表示使用Animal类中的有参构造方法
- this.strain = strain;
- }
(1)在Java中,一个类的构造方法在如下两种情况下总是会被执行。
-->创建该类的对象(实例化)
-->创建该类的子类的对象(子类的实例化)
(2)当在Java语言中创建一个对象时,Java虚拟机会按照父类—子类的顺序执行一系列的构造方
法。
(3)子类继承父类时构造方法的调用规则如下:
1)如果子类的构造方法中没有通过super显示调用父类的有参构造方法,也没有通过this显示调用
自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,是否写“super();”
语句,效果是一样的。
2)如果子类的构造方法中通过super显示地调用了父类的有参构造方法,那么将执行父类相应的
构造方法,而不执行父类无参构造方法。
3)如果子类的构造方法中通过this显示地调用了自身的其他构造方法,在相应构造方法中遵循以上
两条规则。
4)如果存在多级继承关系,在创建一个子类对象时,以上规则会多次向更高一级传递,一直执行
到顶级父类Object类的无参构造方法为止。
- public static void main(String[] args) {
- //创建学生对象
- Student stu1 = new Student("张三", 18);
- Student stu2 = new Student("张三", 18);
- Student stu3 = stu1;
-
-
- boolean result1 =stu1.equals(stu2);
- System.out.println("stu1和stu2是同一个对象:"+result1);//false
-
- boolean result2 =stu1.equals(stu3);
- System.out.println("stu1和stu3是同一个对象:"+result2);//true
-
- System.out.println(stu1==stu2);//false
- System.out.println(stu1==stu3);//true
-
- System.out.println("qwert".equals("123"));//false
-
-
-
- System.out.println(stu1);//地址值
- System.out.println(stu1.toString());//地址
-
-
- /*
- * stu1是Student类对象,Student类中没有equals()方法,为什么Student类对象可以调用?
- * 因为Student类默认继承了Object类,所以Student类对象可以调用Object类中的方法
- *
- * Object类中的equals()方法比较的是两个对象的地址值,地址值相同,返回true,否则,返回false
- * String类中比较两个对象,通常比较的是两个String对象里得内容是否相同,所以Object类中的equals()不能满足String类使用,所以,在String类中重写了Object里的equals()方法
- *
- * 需求:
- * 比较两个Student类对象,如果两个Student类对象的name属性值和age属性值相同,我就认为这个两个对象是同一个对象。
- * 实现:
- * 要实现上述需求,原来Object类中的equals()方法不能满足这个需求,所以需要在Student类中重写Object类中的equals()方法
- *
- * Student类的对象调用toString()方法(Object类中方法)输出的结果与直接输出对象名效果一样,输出的都是地址值,
- * 没有太大意义,我希望直接输出对象或者对象调用toString()输出的是对象的所有属性信息
- * Object类中的toString()方法不能满足这个需求,只能在Student类中重写Object类中的这个toString()方法
- *
- */
(1)如果从父类继承的方法不能满足子类的需求,可以在子类中对父类的同名方法进行重写(覆
盖),以符合需求。
(2)方法重写(方法覆盖)必须满足如下要求:
-->重写方法和被重写方法必须具有相同的方法名
-->重写方法和被重写方法必须具有相同的参数列表
-->重写方法的返回值类型必须和被重写方法的返回值类型相同或者是其子类
-->重写方法不能缩小被重写方法的访问权限。
3)方法重载和方法重写的区别
- 比较相 位置 方法名 参数列表 返回值 权限修饰符
-
- 方法重载 同一类中 相同 不同 无关 无关
-
- 方法重写 子类中 相同 相同 相同或是子类 不能比父类更严格
当父类中的方法不能够满足子类使用的时候,我们可以在子类中重新定义一个与父类方法同名的
方法,这个过程称之为方法重写
-
- 1)在子类中重写
- 2)方法名相同
- 3)参数列表相同
- 4)方法体不同
- 5)返回值类型相同或者是其子类
- 6)访问权限修饰符不能严于父类
-