Java面向对象编程-3

面向对象目录
1 类与对象
2 封装 
  2.1 构造方法
  2.2 类的结构 
3 继承
  3.1 类的设计与扩展 
4 接口
  4.1 事件监听器
5 抽象类
6 泛型
7 枚举

2 封装

2.2 类的结构

类中有什么?

1)属性。

2)方法,包括普通方法和构造方法。

3)代码块。

4)静态资源,用static修饰,由类名可以直接调用,包括静态变量和静态方法。

3 继承

3.1 为什么要继承?

3.2 继承的格式

1)关键字:extends继承(类);implements实现(接口)。

2)继承只能继承一个类,实现可以实现多个接口。

继承的格式:public class 子类名 extends 父类名{}

实现接口的格式:public class 接口的实现类名 implements 接口名1,接口名2,...{}

继承+实现接口的格式:public class 类名 extends 父类名 implements 接口名1,接口名2,...{}

3.3 子类继承了父类的哪些内容?子类可以直接调用父类的哪些内容?

1)子类继承了父类的所有内容。但是,有些内容,虽然继承了,但不能直接调用。

2)按照2.2的介绍,逐项分析子类可以继承、调用的父类的内容:

属性。会继承给子类。

方法。普通方法,子类会继承。构造方法,子类会直接向上调用,连着父类的构造方法一起调用,既会调用自己的构造方法,又会调用父类的构造方法。

代码块。子类会直接执行父类的代码块。

静态资源。由类名可以直接调用。子类也可以调用。

3)关于子类能否直接调用父类的属性和普通方法,要看访问权限修饰符。

访问权限修饰符限制了代码可以使用的范围,具体如下:

- 项目

        - src:自己的代码

                - package:包

                        - 类文件(.java)

                                - 类

        - lib:java源码、导入的其他代码

public整个项目下
private只能在本类中使用
protected(受保护的)同包下&子类中
缺省不写同包下

3.4 方法重写

1)子类中重写父类方法

子类中重新将父类的方法再写一遍。

注意:格式与父类的一模一样,方法中的内容可以不同。

不强制要求重写。重写的情况:父类方法不能满足子类的需求,子类需要将方法进行扩展实现。父类只有一个,子类有多个,所有的子类的方法名可能一样,但实现的具体逻辑不一样。

方法重写之后,子类会调用重写之后的方法,会调用改造的方法。

子类重写的方法一般会在父类的方法上重构、修改、扩展。

不同的子类,再调用相同名字方法的时候,会执行出不一样的结果。

e.g.在子类UNStudent和MIDStudent中重写Student中定义的方法read()。

①不进行重写,直接运行。

//Student.java
public class Student {
    public void read(){
        System.out.println ("Student Read Book");
    }
}

//UNStudent.java
public class UNStudent extends Student{}

//MIDStudent.java
public class MIDStudent extends Student{}

//StuManage.java
public class StuManage{

    public static void main(String[] args){
        UNStudent unstuXZ = new UNStudent ();
        MIDStudent midstuXM = new MIDStudent ();
        unstuXZ.read ();
        midstuXM.read ();
    }

}

运行结果

Student Read Book
Student Read Book 

②重写并运行。 

//Student.java
public class Student {
    public void read(){
        System.out.println ("Student Read Book");
    }
}

//UNStudent.java
public class UNStudent extends Student{
    // 重写的父类的方法
    public void read(){
        System.out.println ("UNstudent Read Book");
    }
}

//MIDStudent.java
public class MIDStudent extends Student{
    public void read(){
        System.out.println ("MIDStudent Read Book");
    }
}

//StuManage.java
public class StuManage{

    public static void main(String[] args){
        UNStudent unstuXZ = new UNStudent ();
        MIDStudent midstuXM = new MIDStudent ();
        unstuXZ.read ();
        midstuXM.read ();
    }

}

运行结果

UNstudent Read Book
MIDStudent Read Book 

2)接口的实现类中,重写接口中的抽象方法(没有方法体的方法)

强制要求重写接口中所有的方法。

重写时,将分号改为大括号。

e.g.在接口ActionListener的实现类LoginListener中重写方法actionPerformed(ActionEvent e)。

public interface ActionListener extends EventListener {

    /**
     * Invoked when an action occurs.
     */
    public void actionPerformed(ActionEvent e);

}

重写后的方法详见登录注册程序v2.0。

3.5 Object类

Java 中所有的类都默认继承了Object这个类,而且是隐式的。

任何类都可以重写Object这个类的方法。

任何类都可以调用Object类中不受限制的方法。

e.g.String类中重写Object类的方法equals(Object obj)。

public class Object {

    ...

    public boolean equals(Object obj) {
        return (this == obj);
    }

    ...

}
public class String{
    
    ...

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

    ...

}

 

3.6 转型

子类对象与父类类型之间:将子类对象转换为父类类型。

e.g.将子类UNStudent对象unstuXZ转换为父类Student类型。

//Student.java
public class Student {
    public void read(){
        System.out.println ("Student Read Book");
    }
}

//UNStudent.java
public class UNStudent extends Student{
    public void exam_CET(){
        System.out.println ("UNStudent CET ");
    }
    // 重写的父类的方法
    public void read(){
        System.out.println ("UNstudent Read Book");
    }
}

//StuManage.java
public class StuManage{
    public static void stuRead(Student stu){
        stu.read ();
    }
    public static void main(String[] args){
        UNStudent unstuXZ = new UNStudent ();
        unstuXZ.read ();
// unstu 小张
        Student stuXZ = unstuXZ;
// stuXZ.exam_CET();// 不能调用
        unstuXZ.exam_CET ();// 能不能调用考试CET 与对象变量名的类型有关系
// 学生小张 在调用重写过的方法时 依然会调用重写之后的方法
        stuXZ.read ();
// 子类对象可以说它是父类类型
// 调用学生阅读
        stuRead (stuXZ);
    }
}

运行结果

UNstudent Read Book
UNStudent CET 
UNstudent Read Book
UNstudent Read Book

小张是一名大学生,小张属于大学生类型,小张也属于学生类型。

小张在属于学生类型时,不能调用大学生类型独有的方法。

依然调用重写之后的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值