继承
概念:
① 继承背后的思想就是基于已存在的类来构建新类;
② 当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求;
③ 当从其它类导出的类叫作子类,被导出的类叫作父类;
④ 在Java中,除了Object类外,所有类都是子类,都有唯一父类;
⑤ 继承在OO中不可或缺;
⑥ 创建一个类时,总是在继承;
类之间关系:Is-a继承体现,Has-a组合体现,Like-a实现接口体现;
继承的意义:代码重用,体现不同抽象层次;
父子类关系:父类更抽象,更一般;子类更具体,更特殊;
继承的特点:1、子类继承父类的成员;2、具有层次结构;
继承的优点:1、代码重用;2、父类字段和方法可用于子类;3、从抽象到具体形成类的结构体系;4、可轻松定义子类;
实现:
在Java中,用extends关键字来表示一个类继承了另一个类;
public class Teacher extends Person{
//代码
}
super关键字
特点:
① Super代表父类对象的引用,this代表当前对象的引用;
② 当子父类的成员出现重名时,可以通过super来进行区分;
③ 子类的构造方法中,通过super关键字调用父类的构造方法;
public class JavaTeacher extends Teacher(){
public JavaTeacher(String name,String school){
//通过调用父类的构造方法,完成对相关字段值的初始化
super(name,school);
}
}
☆当构造一个类对象的时候一定会先调用父类的构造方法来构造父类的对象,调用父类的构造方法的语句必须是子类构造方法中的第一条指令;
的
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class TeacherDemo{
2 public static void main(String []args){
3 B b=new B();
4
5 //父类中加上showB()方法之后,调用的是子类的showB();
6
7 //若要调用父类的showB();在子类中加上super.showB();
8 b.showB();
9 }
10 }
11
12 class A{
13 public A(){
14 System.out.println("A的构造方法");
15 }
16 public void showA(){
17 System.out.println("A");
18 }
19
20 public void showB(){
21 System.out.println("父类中的showB方法");
22 }
23 }
24
25 class B extends A{
26 public B(){
27 //super();//调用父类无参的构造方法,可以省略
28 System.out.println("B的构造方法");
29 }
30
31 public void showB(){
32 System.out.println("B");
33 //showA();//子类继承父类,可以调用,同super.showA(); 因为名称未冲突
34 super.showB();
35
36 }
37 }
下面这份代码更清晰的表达了继承
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class TeacherDemo{
2 public static void main(String []args){
3 JavaTeacher jTeacher=new JavaTeacher("张三","清华");
4 jTeacher.teaching();
5
6 DBTeacher dTeacher=new DBTeacher("李四","清华");
7 dTeacher.teaching();
8 }
9 }
10
11 class Teacher{
12 private String name;
13 private String school;
14
15 public Teacher(String name,String school){
16 this.name=name;
17 this.school=school;
18 }
19
20 public void teaching(){
21 System.out.println("授课前准备");
22 }
23 }
24
25 class JavaTeacher extends Teacher{
26 public JavaTeacher(String name,String school){
27 super(name,school);
28 }
29
30 public void teaching(){
31 super.teaching();//调用父类teaching
32 System.out.println("打开eclipse");
33 System.out.println("书写java代码");
34 }
35 }
36
37 class DBTeacher extends Teacher{
38 public DBTeacher(String name,String school){
39 super(name,school);
40 }
41
42 public void teaching(){
43 super.teaching();//调用父类teaching
44 System.out.println("打开Oracle");
45 System.out.println("书写pl-sql指令");
46 }
47 }
final关键字
① final可以用来修饰变量、方法、类;
② final修饰的变量是一个常量,一旦赋了值就不能在修改。(常量一般都和static关键字配合使用);
③ final修饰类代表此类不能被继承;
④ final修饰方法代表此类方法不能被重写;
showNumber2未加final前
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class FinalDemo{
2 public static void main(String []args){
3 A a=new A();
4 a.showNumber1();
5
6 B b=new B();
7 b.showNumber2();
8 }
9 }
10
11 class A{
12 public final int number1=1;//常量
13 public int number2=2;
14 public void showNumber1(){
15 //number1++;//不能被修改
16 System.out.println(number1);
17 }
18 public void showNumber2(){
19 System.out.println(number2);
20 }
21 }
22
23 class B extends A{
24 public void showNumber2(){
25 System.out.println(number2);
26 }
27 }
在A中的showNumber2方法中加上final报错
在A类前加上final也会报错
final用在引用变量上,代表次引用变量只能引用刚一开始所引用的变量,中途不能改变指向
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class FinalDemo{
2 public static void main(String []args){
3 A a=new A();
4 a.showNumber1();
5
6 B b=new B();
7 b.showNumber2();
8
9 //可以修改
10 final A a2=new A();
11 a2.number2=5;
12 a2.showNumber2();//打印5
13
14 /*a2=new A();*/ //final用在引用变量上,代表次引用变量只能引用刚一开始所引用的变量,中途不能改变指向
15 }
16 }
17
18 //常量类不能被继承
19 /*final*/ class A{
20 public final int number1=1;//常量
21 public int number2=2;
22 public void showNumber1(){
23 //number1++;//不能被修改
24 System.out.println(number1);
25 }
26 //子类不能对父类中的常量方法进行改写(重写)
27 public /*final*/ void showNumber2(){
28 System.out.println(number2);
29 }
30 }
31
32 class B extends A{
33 public void showNumber2(){
34 System.out.println(number2);
35 }
36 }
Object类常见方法
Java中,所有类都直接或间接继承自java.lang.Object类,可以说Object是java中所有类的祖先即根类;
Java中任何类都继承了Object类中的方法,只要有toString(),equals(),hashcode(),clone(),getClass(),finalizw()
String toString()
① 返回该对象的字符串描述性信息。默认输出的格式是:类名[字段值,字段值…];
② 只要对象与一个字符串通过“+”连接,系统就自动调用toString()以获得对象的字符串描述;
③ 常被改写,可以根据用户的需求对其进行重写;
boolean equals()
① Object类原始功能是实现判断两个对象是否具有相同引用;要求判断两个对象状态的相等性;
② 在jdk标准库中提供了一些类,比如String,Date都对equals方法进行了重写;
③ 常被改写,可以根据用户的需求对其进行重写;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class ObjectDemo{
2 public static void main(String []args){
3 Student stu1=new Student("张三",20);
4 System.out.println(stu1);//打印对象 输出Student@2a139a55 @之前是类名,之后是哈希码(可以认为是堆内存中的地址)
5
6 System.out.println(stu1.toString());
7 //未重写toString()之前 输出与以上内容相同,但Student中未编写toString()方法,
8 //也可以使用是因为它默认继承了Object类,该类中有toString()方法
9 //重写toString()之后,输出内容为重写之后的内容
10
11 Student stu2=new Student("张三",20);
12
13 //未重写equals()方法之前
14 System.out.println(stu2.equals(stu1));//输出false,不是指向同一个对象
15 System.out.println(stu2.equals(stu2));//输出true
16 //重写equals方法之后,如下则全部输出true
17 }
18 }
19
20 //加上与不加上继承Object是一样的,默认就会继承
21 class Student /*extends Object*/{
22 private String name;
23 private int age;
24
25 public Student(String name,int age){
26 this.name=name;
27 this.age=age;
28 }
29
30 //重写Object中的toStirng()方法
31 public String toString(){
32 return "姓名:"+name+",年龄:"+age;
33 }
34
35
36 //重写equals方法
37 public boolean equals(Object obj){
38 //自己与自己比
39 if(this==obj){
40 return true;
41 }
42 if(obj==null)
43 {
44 return false;
45 }
46 if(this.getClass()!=obj.getClass())
47 {
48 return false;
49 }
50
51 Student stu=(Student)obj;
52 if(this.age!=stu.age)
53 {
54 return false;
55 }
56 if(this.name==null)
57 {
58 if(stu.name!=null)
59 {
60 return false;
61 }
62 }
63 else if(!this.name.equals(stu.name)){
64 return false;
65 }
66
67 return true;
68 }
69 }