自学内容网 自学内容网

day11_oop

今日内容

零、 复习昨日
一、作业
二、封装
三、继承
四、重写
五、this和super
六、访问修饰符

零、 复习昨日

数组创建的两种方式

  • new int[3];
  • new int[]{1,2,3,4};
    手写一个遍历输出数组元素的伪代码

构造方法什么作用?

  • 创建对象,将对象的属性初始化

有参无参构造什么区别?

  • 无参构造创建出的对象,属性值是默认值
  • 有参构造创建出的对象,属性值是指定参数值

创建对象的过程:

  • 创建对象,开辟空间,属性初始化
  • new调用构造方法开始创建对象,先将属性初始化,再执行构造方法内部代码

this是什么,什么作用?

  • this代表当前类对象,可以调用属性,方法,构造方法

解释重载(Overload)

  • 在同一个类中,方法名一样,参数列表不一样的方法叫做重载
  • 作用就是为了方便使用

一、作业

3.老师类
学生类
老师带了很多学生
把学生存倒数组中 Student[] stus = new Student[3];

// 学生类

package com.qf.homework;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/1/29
 * @desc
 */
public class Student {

    int age;
    String name;
    String stuNo;// 学号

    public Student() {
    }

    public Student(int age, String name, String stuNo) {
        this.age = age;
        this.name = name;
        this.stuNo = stuNo;
    }

    // 用于输出对象的属性信息
    public void show(){
        System.out.println("学生姓名:"+name+",学号:"+stuNo+",年龄:"+age );
    }
}

// 老师类

package com.qf.homework;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/1/29
 * @desc
 */
public class Teacher {

    String name;
    String subject;// 学科
    // 存储多个学生,需要学生数组
    Student[] studentArr = new Student[3];

    /**
     * 数据类型[]
     */

    public void show(){
        System.out.println("老师姓名:"+name+",老师所教学科:"+subject+":所带学生有:" );
        for (int i = 0; i < studentArr.length; i++) {
            // System.out.println(studentArr[i]);// 输出地址
            studentArr[i].show();
        }
    }
}

// 测试类

package com.qf.homework;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/1/29
 * @desc
 */
public class TestOOP {
    public static void main(String[] args) {
        Teacher teacher = new Teacher( );
        System.out.println(teacher );// 老师对象地址
        System.out.println(teacher.studentArr );//老师对象中数组地址
        System.out.println(teacher.studentArr[0] );// 数组中默认值 null

        System.out.println("----------" );
        teacher.name = "老王";
        teacher.subject = "java";

        Student s1 = new Student( );
        //System.out.println("单独学生对象地址:" + s1 );
        s1.stuNo = "20240101";
        s1.name = "张同学";
        s1.age = 18;
        teacher.studentArr[0] = s1;
        //System.out.println("数组中的学生对象地址:" + teacher.studentArr[0] );

        teacher.studentArr[1] = new Student(19,"李同学","20240102");
        teacher.studentArr[2] = new Student(20,"赵同学","20240103");

        teacher.show();// 帮助打印属性信息
    }
}

// 内存关系

image-20240129095036327

二、封装[重点]

java面向对象编程有三大特点: 封装,继承,多态(抽象,接口)

2.1 封装

生活的封装: 买东西发的快递,电脑

封装有什么用? 将东西(代码)隔离;方便使用


封装在java中随处可见

  • 方法的封装
  • 类的封装
  • java的框架就是封装好的工具

2.2 类的封装

类的封装,两步骤

  • 属性私有,加上private属性
  • 提供set和get方法

注意:

  • set方法有参数无返回值
  • get方法无参数有返回值
  • 且命名固定: 一定是setXxx,getXxx,xxx是属性首字母大写
  • 封装过后,属性只能通过setget方法访问,即无法再直接通过对象调用属性

2.3 练习

创建电脑类(computer),将属性封装,然后创建测试类创建对象,给属性赋值,并取值

package com.qf.pack;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/1/29
 * @desc
 */
public class Computer {

    private String brand;
    private double price;

    public void setPrice(double price) {
        this.price = price;
    }

    public double getPrice(){
        return price;
    }


    public void setBrand(String brand) {
        this.brand = brand;
    }

    public St n brand;
    }
}
class TestComputer {
    public static void main(String[] args) {
        Computer computer = new Computer( );
        // 属性赋值
        computer.setBrand("华为");
        computer.setPrice(4999);

        // 属性取值
        String brand = computer.getBrand( );
        double price = computer.getPrice( );
        System.out.println(brand );
        System.out.println(price );

    }
}

三、继承extends[重点]

3.1 何为继承?

生活中继承: 子承父业, 父辈的资产子辈可以使用 (子可以使用父的东西)

代码中继承: 子类继承父类,子类就使用父类的东西

3.2 为什么需要继承?

编程中继承好处:

  • 减少代码重复,可以将重复代码抽取到父类中,让你子类重复使用
  • 是多态前提,为多态做准备

3.3 如何继承?

class A extends B{}

称为: A类为子类,B类为父类, A类继承B类


继承后,A类对象就可以使用B类中的属性和方法

// 父类-Animal

public class Animal {

    int age;
    String color;

    void eat(){
        System.out.println("吃" );
    }

}

// 狗类-Dog

public class Dog extends Animal{

}

// 测试

public class TestExtends {

    public static void main(String[] args) {
        Dog dog = new Dog( );
        dog.color = "黄色"; // color是使用的父类属性
        dog.age = 2;  // age是使用的父类属性

        System.out.println(dog.age + ","+dog.color );
    }
}

3.4 继承的特点

继承中的特点,或者说是继承中需要注意的地方

3.4.1 单继承

单继承,一个类只能继承另外一个类,即一个类只能有一个父类.

image-20240129112452827

3.4.2 属性

父类私有的属性子类无法使用!

image-20240129112835974

如果子类和父类中有同名属性,子类用自己的属性

image-20240129113153428

3.4.3 方法

父类的私有化(private)方法,子类无法使用

image-20240129113424353

如果子类中也定义了与父类一样的方法,子类默认使用自己的方法。这种方式就是重写!

----后续还会再详细讲重写!!!

image-20240129114040048

3.4.4 构造方法

在使用new调用子类构造方法,创建子类对象时,会默认先调用父类的构造方法创建父类对象,并对父类属性初始化,然后才创建子类对象

  • 如何调用父类构造方法呢? 子类构造方法中,第一行隐藏了super()在调用父类构造
  • 创建子类对象为什么要调用父类构造呢? 因为调用父类构造,就会创建父类对象,父类属性+方法就会初始化,子类就可以使用父类的属性和方法

image-20240129144949292

对象创建的过程:

  • 有父类先创建父类对象
  • 先属性 后构造

pdf6_t9

四、重写

重写? Override,又叫覆盖,覆写

  • 发生在继承中,子类重写父类的方法
  • 重写时,子类方法有要求:
    • 访问修饰符要与父类一致
      • 其实可以不一致: 子类重写后,访问修饰符权限 >= 父类即可
    • 返回值类型要与父类一致
      • TODO: 其实也可以不一致: 多态来解释
    • 方法名要与父类一致
    • 参数列表要与父类一致
    • 方法体没要求,一般内容不一样
    • 特殊的: 子类 不能重写父类私有方法

为什么需要重写?

  • 因为父类的方法不适用于自己(父类方法不好用)
  • 也是多态的前提

image-20240129153856569

练习题

pdf6_t11_t12

五、this和super

thissuper
代表当前类的对象当前类父类对象
调用属性this.属性;调用子类(父类)属性super.属性;调用的是父类属性
调用方法this.方法();调用子类(父类)方法super.方法();调用父类的方法
构造方法this();this(参数) 调用自己类中的构造方法super();调用父类无参构造
super(参数);调用父类有参构造

this()和super()这些调用构造方法的句子只能在构造方法中使用


super();很特殊, 在每个构造方法默认第一行都有一个super();

super(参数); 可以调用父类的有参构造(前提父类得定义有参构造),将数据传递给父类

pdf6_t1_t2

六、访问修饰符

访问修饰符:

  • 位置: 修饰属性和方法的,放在属性和方法前
  • 作用: 访问修饰又叫做访问控制,或者访问权限,即可以控制能不能用这个属性或者方法
  • 哪些修饰符?
    • public , protected , 缺省(默认|不写),private
当前类同包不同类不同包子类中不同包非子类
public
protected√子类能调用×
缺省(默认,包级别)××
private×××

总结: 访问权限范围 public > protected > package > private

经验:

  • 因为学过封装,后续再写代码,属性一般使用private私有化
  • 方法一般都是public

七、总结

封装

  • 属性私有
  • setget方法
  • 后续:一键生成

重点: 继承

  • 掌握如何编写继承的代码? 什么时候需要继承?
  • 继承中关于属性,方法,构造
    • 子类只能使用父类非私有的属性和方法
    • 方法有重写. 什么是重写?有什么要求?为什么需要重写?
    • 在创建子类对象时,父类构造会怎么样?为什么?super()默认在哪?
    • this和super特点

作业:

  • 看笔记,笔记中涉及的知识点敲出来(演示出来),不要照抄代码
  • 能解释上面这些点即可
  • 写pdfT19,T24

原文地址:https://blog.csdn.net/weixin_39641494/article/details/135919455

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!