当前位置: 首页 > article >正文

JAVA 面向对象编程

一. 类与对象

1.1 定义类 :类是由数据成员和成员方法组成的一个程序单元。数据成员表示类的属性,成员方法表示类的行为。

定义类的语法格式 :

class 类名{
    数据类型 数据成员名;
    ...
    public 返回值类型 方法名(参数 2, 参数 2 ...){
        // 方法体
        [return 表达式;]
    }
}

Java 用 class 关键字标识类,类体中定义数据成员和成员方法。

class Person{
    // 定义数据成员,表示人的特征
    String IDNumber;
    String name;
    int age;

    public String getIDNumber() {
        return IDNumber;
    }

    public void setIDNumber(String IDNumber) {
        this.IDNumber = IDNumber;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
    void eating(String food){
        System.out.println(name + "吃" + food);
    }

    void study(String book){
        System.out.println(name + "正在学习: " + book);
    }
    
    void watchTV(String program){
        System.out.println(name + "正在看: " + program);
    }
    
    void display(){
        System.out.println("姓名: " + name);
    }

}

定义类分3个层次,第1层是类名,第2层是数据成员,第3层是成员方法。

1.2. 创建使用对象

语法格式 : 先声明后实例化对象

类名 对象名表;             //  声明对象

对象名 = new 类名();    //  实例化对象

语法格式 : 声明和实例化对象同时完成

类名  对象名  =  new 类名();

实例化对象后,该对象拥有自己的数据成员和成员方法,通过引用对象成员使用对象。

语法格式 : 引用数据成员

对象名.数据成员名

语法格式 : 引用成员方法

对象名.成员方法名(参数表)

Java数据类型分为基本数据类型和引用数据类型。类属于引用数据类型,引用数据类型指一段堆内存空间能同时被多个栈内存空间指向,对象名指的是保存在栈内存中用来访问其对应堆空间的访问地址。堆内存保存数据成员信息,因此能通过对象名引用堆内存。

1.3 构造方法

1.3.1 定义构造方法

class 类名{
    访问权限 类名(形参列表){
        // 方法体;
        // 构造方法没有返回值
    }
}

构造方法是类中特殊的成员方法,特殊性主要体现在

a) 构造方法名与类名相同

b) 不能为构造方法指定类型,也不能用return 语句返回值。但构造方法由隐含返回值,该值由系统内部使用

c) 可以重载构造方法

d) 编程人员不能显示的直接调用构造方法,每当new 关键字创建对象时,JVM为新建对象在堆内存开辟空间后,JVM将自动调用构造方法初始化新对象。

e) 如果自定义类中未定义构造方法,系统将提供要给默认的空构造方法。如果自定义类中定义了构造方法,系统将不再提供空构造方法

1.9 抽象类

1.9.1 抽象类概念 : 抽象类刻画公共行为特征,但并没有在抽象类内部实现这些公共行为,而是通过继承由派生类实现具体的公共行为。抽象类中定义的方法称为抽象方法,这些方法只有方法声明而没有方法具体定义,派生类覆写抽象方法,实现与该派生类相关的操作。

1.9.2 定义抽象类

用abstract 修饰的类称为抽象类,用 abstract 修饰的方法,且只有方法声明,没有方法体的方法称为抽象方法。

定义抽象类语法格式

abstract class 抽象类名{

        //数据成员

        //构造方法
 

        [访问权限] 返回值类型 方法名(形参列表){

                // 方法体

                返回值

        }

        [访问权限] abstract 返回值类型 方法名(形参列表);

}

Java 程序对抽象类有如下要求 :

(1) 抽象类中可以有0个或者多个抽象方法,也可以包含非抽象方法。

(2) 抽象类中可以不定义抽象方法,但有抽象方法的类必须是抽象类。

(3) 抽象类可以派生子类。如果派生实体类,实体子类必须实现抽象类中定义的所有抽象方法;如果派生抽象子类,抽象子类可以不实现抽象父类的抽象方法。

// 抽象父类
abstract class Person{
    public void talk(){    };  // 普通方法
    abstract void workOn();    //抽象方法
}

// 实体子类
class Teacher extends Person{
    void workOn(){
        System.out.println("教师授课");
    }
}

// 抽象子类
abstract class Student extends Person{
    // 没有实现父类的抽象方法 workOn()
    abstract void study();
}

(4) 抽象类不能实例化对象,由抽象类派生的实体子类实例化抽象父类对象。

package abstract_test;

abstract class Person{
    // 1.1 私有数据成员
    private String name;
    // 1.2 构造方法
    public Person(){ }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public Person(String name){
        this.name = name;
    }

    public void eating(String food){
        System.out.println(this.name + "正在吃" + food);
    }

    abstract public void workOn();
}

// 2. Person类的子类 Teacher
class Teacher extends Person{
    private String department;

    public Teacher() { }
    public Teacher(String name, String department){
        super(name); // 调用父类构造方法
        this.department = department;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    public void workOn(){
        System.out.println(this.getName() + " is " + this.department + " workint");
        System.out.println(this.getName() + " teaching chinese");
    }
}

// 3. Person 的子类 Student

class Student extends Person{
    private int id;
    public Student() {}
    public Student(String name, int id){
        super(name);
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void workOn(){
        System.out.println("id:" + getId() + ", name:" + getName() + " studing");
    }
}

public class abstract_demo {
    public static void main(String[] args) {
        Teacher th = new Teacher("kongzi", "Chinese");
        th.workOn();
        Student st = new Student("zilu", 10001);
        st.workOn();
    }
}

抽象类本身不能通过构造方法创建对象,但能通过实体子类调用抽象父类的构造方法。继承机制中,不管父类是普通类还是抽象类,实例化子类对象前必须先实例化父类对象。


http://www.kler.cn/a/144414.html

相关文章:

  • Vue中项目进行文件压缩与解压缩 (接口返回文件的url压缩包前端解析并展示出来,保存的时候在压缩后放到接口入参进行保存)
  • C语言 移位操作符
  • 间接法加窗分析信号的功率谱
  • 【程序员的自我修养01】编译流程概述
  • 【Web】CmsEasy 漏洞复现
  • 彩纸屋在线少儿编程源码/scratch在线编程系统/培训管理系统源码/在线培训系统源码PHP
  • Leetcode—55.跳跃游戏【中等】
  • 防止应用程序截屏(容器式,防止极域电子教室和录屏软件录制)
  • LVS+Keepalived 高可用群集
  • Ubuntu 22.04.3编译AOSP13刷机
  • 小程序中的大道理之二--抽象与封装
  • 毅速:3D打印随形透气钢为解决模具困气提供了新助力
  • EMQX-5.3.1单机集群部署并基于Nginx实现负载均衡
  • 飞翔的小鸟小游戏
  • 【数据结构】堆(C语言)
  • Java日志技术
  • OpenShift 4 - 部署 RHODS 环境,运行 AI/ML 应用(视频)
  • unbuntu下安装运行服务
  • 台球厅计时软件收费怎么设置时间,佳易王桌球计时计费灯控系统
  • github上不去