视频地址
https://www.bilibili.com/video/BV1xE41137Qy?p=1
目录
对象
P01-面向对象概念-1 1:09:22
P02-面向对象概念-2 52:28
P03-方法的重载 48:38
P04-对象的创建和使用 47:41
P05-对象和引用 39:50
P06-this关键字 30:16
三大特性
P01-封装 1:14:55
P02-继承关系 1:27:13
P03-方法的覆盖 27:08
P10-super关键字 1:07:04
P11-单继承 16:49
P12-继承习题课 42:11
对象
P01-面向对象概念-1 1:09:22
一、 面向对象思想
1.对象组成:
1)属性 对象有什么
2)方法 对象能做什么 对外提供的行为
2.对象之间的关系
1) is a 汽车与车关系 继承关系
2) has a 汽车与发动机的关系 关联关系 一个对象是另一个对象的属性
3) use a 司机开汽车 依赖关系 一个对象调用另一个对象的方法
3.面向对象思想
面对需求, 找出解决问题的对象, 让对象之间建立适当的关系
二、 面向对象编程思想
模拟现实世界,用计算机中的对象,模拟现实世界中的对象
抽象:
用计算机中类型的概念,对象现实世界中类的概念
类: 对象共性的抽象,
三、 如何定义一个JAVA类
类包含: 属性,方法,构造方法
属性 :
成员变量特点
1) 成员变量有默认值 (0: 数值的7种 false boolean null 对象类型 )
2) 成员变量作用范围,整个类
3)成员变量与局部变量可以同名
方法: 行为 函数
方法声明: 修饰符 返回值 方法名(参数列表) 异常
方法实现{}
构造方法:特殊方法
1) 没有返回值类型
2) 方法名必须与类名相同,包括大小写
3) 不允许手工调用
4)如果类没有定义任何构造方法,编译器自动提供默认无参构造方法
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
P02-面向对象概念-2 52:28
在这里插入代码片
- 1
P03-方法的重载 48:38
方法重载:(也叫编译时多态)
1. 参数个数不同
2. 参数类型不同
3. 参数类型排列不同
4. 构造方法也可以重载
为什么有重载的存在
重载的作用: 一个类的同一行为,由于参数不同,造成的实现差异,对对象的调用者是屏蔽的
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
P04-对象的创建和使用 47:41
对象的创建过程:
1. 分配堆空间 属性被赋值为 默认值
2. 初始化属性 属性被赋值为 初始值
3. 调用构造方法 属性被赋值为 构造参数
package day6;
public class TestClass{
public static void main(String[] args){
Student s =new Student();
System.out.println(s.name);
System.out.println(s.age);
System.out.println(s.score);
s.eat();
}
}
class Student{
String name;
int age;
double score;
public Student(){}
public Student(String name){
this.name=name;
}
void eat(){
System.out.println("eating ....");
}
void sleep(){
System.out.println("sleeping ... ");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
P05-对象和引用 39:50
对象都是存储在堆空间内的
String是引用类型,要注意String不是8种基本类型
成员变量 VS 局部变量
简单变量 VS 引用
简单变量: 8中基本类型 存储值 作为函数的参数时候, 实参 形参 值相同
引用: 存储地址 作为函数参数时候 , 实参形参 地址相同 ,指向同一对象
- 1
- 2
- 3
- 4
- 5
- 6
- 7
package day7;
public class TestReference{
public static void main(String[] args){
int a=10;
int b=a;
b++;
System.out.println(a); // 10
MyClass mc1 =new MyClass();
MyClass mc2 =mc1;
mc2.value++;
System.out.println(mc1.value); //21
MyClass mc3 =new MyClass();
changeValue(mc3);
System.out.println(mc3.value); //21
}
static void changeValue(MyClass mc){
mc.value++;
}
}
class MyClass{
int value=20;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
P06-this关键字 30:16
this 代表对象自己 就是当前对象
对this 调用,必须是构造器第一个语句 ,见下图
- 1
- 2
面向对象三大特性
P01-封装 1:14:55
对象有明确的边界,对象边界对对象内部数据起到保护作用,隔离作用
可以利用修饰符,定义类的属性,方法 是否能被外部访问
public
private
默认 属性或方法只能被同包的
访问方法: get属性名(); set属性名();
对于boolean类型,get方法用is方法替换,如:getMale() 通常用isMale();
现实中文一个女生年龄:女生通过getAge()方法返回年龄
1. 认识的人问此女生 会回答你,可能偏小
2. 生病时,医生问此女生 回答一定真实
3. 陌生人问此女生 女生会回答,滚 ,流氓 ....
这就是封装了,如果没有封装,直就是age 属性的公共方法了;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
最简单的方式访问类
公共属性的方式
package day8;
public class TestEncapsulation{
public static void main(String[] args){
CredictCard card=new CredictCard();
System.out.println(card.password);
card.password ="654321";
System.out.println(card.password);
}
}
class CredictCard{
String password="123456";
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
通过方法访问
属性私有化
属性访问通过方法完成,可以在方法中增加验证身份逻辑,来保护数据本身
package day8;
public class TestEncapsulation{
public static void main(String[] args){
CredictCard card=new CredictCard();
// System.out.println(card.password);
// card.password ="654321";
// System.out.println(card.password);
System.out.println( card.getPassword());
card.setPassword("654321");
System.out.println( card.getPassword());
}
}
class CredictCard{
private String password="123456";
public String getPassword(){
// could do someting to protect the access ,such as role
// 只有 管理员 && 用户本身可以访问此方法 ,其他用户不可以访问此方法,(下同)
return password;
}
public void setPassword(String password){
this.password =password;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
P02-继承关系 1:27:13
20201228 55:50
子类 is a 父类 父类 – 子类 一般 – 特殊 父类有什么 ,子类就有什么
继承: 从可重用的角度,可扩展角度,子类自动继承父类,可以在父类基础上扩展
LSP:里氏代换原则 : 将父类替换为子类时,依然合乎逻辑
LSP 的经典案例: 长方形 , 正方形 ,
数学老师教:正方形 is a 特殊的长方形
计算机老师: 正方形 is a 特殊的矩形
长方形 is a 特殊的矩形
父类: 一定个各种子类的抽象,将子类的共性提炼出来形成的。
没有继承前的定义
package day8;
public class TestInheritance{
public static void main(String[] args){
}
}
class Animal{
int age;
char gender;
public void eat(){
}
public void sleep(){
}
}
class Dog{
int age;
char gender;
public void eat(){
}
public void sleep(){
}
public void shout(){
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
dog 继承 了 animal ,下面是示例
package day8;
public class TestInheritance2{
public static void main(String[] args){
Animal2 ani= new Dog2();
ani.eat();
}
}
class Animal2{
int age;
char gender;
public void eat(){
System.out.println("eating by Animal2 ");
}
public void sleep(){
}
}
class Dog2 extends Animal2{
//int age;
//char gender;
@Override
public void eat(){
System.out.println("eating by Dog2 ");
}
//public void sleep(){
//}
public void shout(){
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31