面向对象(中)
P215递归 p197 每天一考 P242自定义快捷键-P257重新看 项目二
调方法 用当前类的对象
快捷键
1.面向对象编程的三条主线
类和类的成员:属性, 方法 ,构造器;代码块、内部类
面向对象的三大特征: 封装,继承,多态
其他关键字
值传递机制
方法区: 类的信息加载、常量池、静态域
如果参数是基本数据类型,实参赋给形参的是数据值
如果参数是引用数据类型,实参赋给形参的是地址值
main方法中局部变量(形参),方法的局部变量在堆里
new出来的对象/显示赋值在栈中
实参:方法内定义时,声明的小括号内的参数
形参:方法调用时,不能实例化对象
二、封装与隐藏
权限修饰符 属性属于封装性
属性私有化 提供public方法来获取get setxxx
1. 4种访问权限修饰符
修饰类的内部结构:属性、方法、构造器、内部类
-
private
-
缺省 类 包
-
protected
-
public
类:public 或 缺省
2.构造器 /构造方法:
1.作用:
- 创建对象
- 初始化对象
2.说明:
-
方法名与类名相同
-
权限修饰符 类名/方法名(形参列表) public person();
-
定义多个构造器 构成重载
3.属性赋值的先后顺序
- 默认初始化
- 显示初始化/代码块中赋值
- 构造器中初始化
- 对象.方法 或对象.属性 赋值
注意:
构造器能够被重载(同类中不同参数列表的构造器),不能够被重写(子类使用super方法可以调用)。
不能说能被继承,因为能够调用,但是不能重写。
重载:
方法名相同,参数不同
JavaBean
在java层面 数据库储存
public Employee() { //无参构造器
super();
}
public Employee(String name, int id, double salary) { //有参构造器
super();
this.name = name;
this.id = id;
this.salary = salary;
}
4. this关键字
调用属性、方法、构造器
this.name 为方法/属性
在类的方法中,this.方法 调用当前对象属性或方法,如果方法的形参和类的属性同名时,显示的使用this.变量
在类的构造器中,this.属性或 this.方法 ,调用当前正在创建的对象属性,如果构造器的形参和类的属性同名时,显示的使用this.变量,表明此变量是属性 而非形参
this调用构造器
- 在类的构造器中,显示的使用 this(形参列表),调用本类中指定的其他构造器,不能调用自己
- 一个类中有n个构造器,最多有n-1个构造器中使用了 this(形参列表)
- this(形参列表)必须声明在当前构造器的首行
- 构造器内部,最多只能声明一个this(形参列表),用来调用其他构造器
非静态方法里调用方法,都是this当前类的对象
形参与属性重名
public void setname(String name) { //形参与属性重名
this.name=name;
}
public void eat() {
System.out.println("吃饭"); //方法内调用方法
study();
}
public void study() {
System.out.println("学习");
}
错误示范
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tsOBXvRm-1650201752791)(C:\Users\Lucky\AppData\Roaming\Typora\typora-user-images\image-20220105135405268.png)]
5. import
-
类或接口 是java.lang包下定义的,则可以省略import结构
-
非lang包下引用import
-
在源文件中,使用了不同包下的同名的类,至少有一个类要以全类名显示
三、OOP:继承
1.规范
- 一个类被多个子类继承
- 单继承,一个类只能有一个父类
相同属性或方法 继承
public class Student extends Person{ //子类继承父类
}
子类继承父类后,子类继承父类所有的属性和方法,但是父类中声明private的属性或方法,因为封装不能直接调用,通过get()获得
private int age;
public void setage(10); //先设置
public void getage(p1.getage); //再获取
A->B(直接父类)->C->D(间接继承)
2. Object类
-
Object类是所以Java类的根父类
-
默认父类为java.lang.Object类
1.toString类
- 输出一个对象的引用,实际上是调用当前对象的toString()
- 返回对象的 hashcode码(对象地址字符串)类名+内存地址
- 重写toString()方法表示对象的属性,不再是地址值
2.equals()
自定义类重写 ,重写的是object类中的,方法名=形参列表
Object类中equals方法定义
public boolean equals(Object obj){
return (this==obj); //方法名等于形参列表
}
如何重写equals() (重写:方法名与形参相同)
开发自动生成
数组
调试程序
sysou语句 打印变量
断点
3.重写overwrite 覆盖 day11
子类方法覆盖父类的方法,同名同参数方法的重写
1.定义:
public void eat() { //子类重写
System.out.println("多吃有营养的东西"); //改变方法体
}
- 子类重写的方法和形参列表与父类相同,返回值和形参都不能变
- 子类修饰符权限不小于父类
- 子类不能重写父类中的private权限方法
- 子类重写的方法抛出的异常内向说不大于父类被重写的方法抛出异常类型
- 都是static 或都是 非static
注意
-
方法名和形参相同,只能改变方法体,权限范围相同或更大,返回值类型相同或更大
-
父类返回值类型是void,子类重写返回值类型也是void
4.重载和 重写区别
重载:方法名相同,参数不同
重写:子类继承父类以后,可以对父类中同名同参数的方法
5.super关键字
- 在子类的方法或构造器中,使用super.属性 或 super.方法 ,显示调用父类的属性或方法,通常省略super.
- 特殊:当子类和父类定义了同名的属性,在子类中调用父类中声明的属性,显示的使用super.属性,表明调用的是父类中声明的属性
- 当子类重写了父类中的方法后,在子类的方法中调用父类中被重写的方法时,使用super.方法,表明调用的是父类中被重写的方法
super调用构造器
- super(形参列表)调用父类的构造器
- 声明在子类构造器的首行
- 构造器首行,没有显示声明this(形参列表),默认为空参构造器
super.方法** ,显示调用父类的属性或方法,通常省略super.
2. 特殊:当子类和父类定义了同名的属性,在子类中调用父类中声明的属性,显示的使用super.属性,表明调用的是父类中声明的属性
3. 当子类重写了父类中的方法后,在子类的方法中调用父类中被重写的方法时,使用super.方法,表明调用的是父类中被重写的方法
super调用构造器
- super(形参列表)调用父类的构造器
- 声明在子类构造器的首行
- 构造器首行,没有显示声明this(形参列表),默认为空参构造器
念叨叨
本学习内容来源于【B站尚硅谷】,是个人学习笔记。