今日内容
零、 复习昨日
一、作业
二、封装
三、继承
四、重写
五、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();// 帮助打印属性信息
}
}
// 内存关系
二、封装[重点]
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 单继承
单继承,一个类只能继承另外一个类,即一个类只能有一个父类.
3.4.2 属性
父类私有的属性子类无法使用!
如果子类和父类中有同名属性,子类用自己的属性
3.4.3 方法
父类的私有化(private)方法,子类无法使用
如果子类中也定义了与父类一样的方法,子类默认使用自己的方法。这种方式就是重写!
----后续还会再详细讲重写!!!
3.4.4 构造方法
在使用new调用子类构造方法,创建子类对象时,会默认先调用父类的构造方法创建父类对象,并对父类属性初始化,然后才创建子类对象
- 如何调用父类构造方法呢? 子类构造方法中,第一行隐藏了super()在调用父类构造
- 创建子类对象为什么要调用父类构造呢? 因为调用父类构造,就会创建父类对象,父类属性+方法就会初始化,子类就可以使用父类的属性和方法
对象创建的过程:
- 有父类先创建父类对象
- 先属性 后构造
pdf6_t9
四、重写
重写? Override,又叫覆盖,覆写
- 发生在继承中,子类重写父类的方法
- 重写时,子类方法有要求:
- 访问修饰符要与父类一致
- 其实可以不一致: 子类重写后,访问修饰符权限 >= 父类即可
- 返回值类型要与父类一致
- TODO: 其实也可以不一致: 多态来解释
- 方法名要与父类一致
- 参数列表要与父类一致
- 方法体没要求,一般内容不一样
特殊的: 子类 不能重写父类私有方法
为什么需要重写?
- 因为父类的方法不适用于自己(父类方法不好用)
- 也是多态的前提
练习题
pdf6_t11_t12
五、this和super
this | super | |
---|---|---|
代表 | 当前类的对象 | 当前类父类对象 |
调用属性 | 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