oopDay02 对象数组、继承与访问控制

对象数组

对象类型数组

  1. 什么是对象数组

在java中,对象数组是指由对象类型的元素组成的数组

与基本类型数组不同,对象数组可以存储对象的引用

对象数组的声明和初始化方式与基本类型数组类似

ClassName[] arrayName = new ClassName[arrayLength];
  1. 初始化对象数组

    当创建一个对象数组时,数组中的每个元素会被初始化为对象的默认值

    对象数组的默认值是null,表示数组中的元素尚未被赋予有效的对象引用

    Student[] students = new Student[3] 
  2. 静态初始化

    在静态初始化中,可以直接为对象数组的每个元素赋值

    在初始化时,可以提供具体的对象引用,将其分配给数组的每个位置

  3. 动态初始化

动态初始化:先创建一个指定长度的对象数组,然后逐个为每个元素对象的引用

  1. [案例]使用对象数组管理
 package day02;

/**
* 学生类
*/
public class Student {
//提供四个属性
String name;
int age;
char gender;
double score;
//无参构造器
public Student() {
}
//四个参数的构造器
public Student(String name, int age, char gender, double score) {
this.name = name;
this.age = age;
this.gender = gender;
this.score = score;
}
}

package day02;

/**
* 对象数组
*/
public class Demo01 {
public static void main(String[] args) {
//创建学生对象的数组
Student[] students = new Student[3];
students[0] = new Student("Tom",20,'男',88.5);
students[1] = new Student("Jerry",22,'男',86.6);
students[2] = new Student("Toddles",18,'男',88);
//遍历数组
for (int i = 0; i <students.length; i++) {
Student student = students[i];
System.out.println("姓名:"+student.name);
System.out.println("年龄:"+student.age);
System.out.println("性别:"+student.gender);
System.out.println("成绩:"+student.score);
System.out.println();
}
}
}

继承

利用继承复用代码

  1. 什么是继承

继承是面向对象编程中的一种重要概念,它允许一个类(称为子类或派生类)从另一个类(称为父类或基类)继承属性和方法

通过继承,子类可以获得父类的特性

子类可以添加自己特定的特性扩展代码

通过继承可以减少代码的冗余,提高代码的复用性

  1. 利用泛化设计父类

泛化是面向对象编程中的一种关系,它描述了一般性和特殊性之间的关系

通过泛化,我们可以识别出多个类之间共享的属性和方法,并将它们提取到一个公共的父类中

子类可以继续父类的属性和方法,并且可以添加自己特定的属性和方法

[案例]


public class Person {
String name;
int age;
char gender;
}
public class Student extends Person {
//提供四个属性
double score;
//无参构造器
public Student() {
}
//四个参数的构造器
public Student(String name, int age, char gender, double score) {
this.name = name;
this.age = age;
this.gender = gender;
this.score = score;
}
}
public class Teacher extends Person {
double salary;

public Teacher() {
}

public Teacher(String name, int age, char gender, double salary) {
this.name = name;
this.age = age;
this.gender = gender;
this.salary = salary;
}
}
  1. Java继承语法

在java语言中,继承通过使用关键字”extends”实现,java是单继承, 只能有一个父类

继承的语法结构为: 子类名 extends 父类名

继承的特性

  1. 单继承
  2. 传递性:子类可以继承父类继承的父类的属性和方法

继承中的构造器

  1. 重用构造器

Java提供了一种机制让子类能够调用父类的构造器

通过在子类的构造器中使用super关键字调用父类的构造器

子类可以继承父类的属性,并且将属性的初始化工作交给父类的构造器来完成

  1. 关于super()方法

在继承关系中,super()方法用于子类调用父类的构造器

  • super()方法在子类的构造器中使用
  • 子类构造器没有用super(),编译器会自动添加一个默认的super()调用,用于调用父类的无参构造器,如果父类没有无参构造器,会导致编译错误
  • 通过super(参数)的形式,可以调用父类中的有参数的构造器
  • super()方法必须写在子类构造器的第一行,即在子类构造器执行之前调用父类的构造器
  • 使用super()方法可以在子类构造器中显式地调用父类的构造器,已完成父类的属性的初始化工作

方法的继承

  1. 利用继承复用方法

利用继承可以实现方法的复用,子类可以继承父类的方法并在子类中直接使用

通过继承复用方法,我们可以避免在子类中重复编写相同的方法逻辑,提高了代码的效率和可维护性

  1. 方法的重写

方法的重写(Override)是指子类在继承父类的方法后,对该方法进行修改或重新实现,以满足子类的特定需求

在继承中,如果子类需要对父类的方法进行修改或定制化,可以使用方法的重写

子类可以重写(覆盖)父类的方法,使得子类在调用方法时执行子类自定义的逻辑

方法重写的规则

  • 子类的重写方法必须和父类的被重写方法具有相同的方法名\参数列表和返回类型
  • 子类的重写方法的访问修饰符不能比父类的被重写的方法的访问修饰符更严格(即不能降低访问权限)
  • 子类的重写方法不能抛出比父类的被重写方法更宽泛的异常(可以抛出相同的异常或子类异常)
  1. 使用super关键字

在继承关系中,子类可以使用super关键字来访问父类中的属性和方法

super关键字的一般形式为 super.属性名和super.方法名()

  • super.属性名用来访问父类的属性
  • super.方法名()用于调用父类的方法
  • 重写与重载的区别

重写用于子类对父类方法的重新定义,重载用于同一个类中多个方法的差异处理

访问控制

  1. 什么是package

    Java中利用package对类进行分类,方便管理代码

    不同的包中可以定义同名类,减少了命名冲突

  2. package语句

定义报名的语法为:package 报名;

类的全称应该是 “包名.类名” :test.Point

不同的包中可以定义相同的类名

包名也可以有层次结构:在一个包中可以包含另外一个包

  1. 声明包的语法要点

  2. 全限定名

全限定名:也称为全名,是指由包名和类名组成的完整名称

Java程序编译和运行期间都采用全名

  1. import

在同一个包中,或者,使用了import语句导入以后可以省略包名直接写类名

访问控制修饰符

  1. 什么是访问控制

访问控制: 用于设定类\属性\方法等资源的可见范围

利用访问控制可以控制数据及方法的可见范围,避免意外篡改,保护软件组件(对象)的安全可靠

  1. 访问控制修饰符

    Java提供访问控制修饰词,实现软件组件之间的访问控制

    Java提供4个访问修饰词:public protected 默认的 private

  2. public 与 private

private 私有的 可见范围最小 仅仅在当前类体内部可见

离开类体范围就不能被访问了

  1. public与默认

默认访问修饰是指不写任何修饰词的情况

可见范围是当前包内部可见

包的外部不能访问包内默认修饰的资源

  1. protected 与 默认

    protectd 已为”保护的”,其修饰的资源的可见范围是子类和当前包内部可见

    因为在开发工作中很少使用包作为访问控制的范围,所以保护的修饰资源主要是为子类使用

    从子类”泛化”到父类中的属性和方法经常定义为protected :子类通过继承得到这些属性和方法

  2. 封装

封装:将抽象性函数接口的实现细节部分包装\隐藏起来

防止外界调用端,去访问对象内部的实现细节

简单理解:封装数据和算法细节,暴露可以安全访问的方法和数据

Java中的封装通过访问修饰词实现

  • 需要隐藏的属性和方法定义为私有的private
  • 需要留给子类使用的属性和方法定义为保护的protectd
  • 确实需要公开访问的属性和方法定义为公有的public
  • 不清楚使用那种访问控制修饰符时候,有限选择私有private