第 8 章 面向对象编程(中级部分)

9/8/2022 韩顺平java笔记

# 8.3.4 课堂练习

在这里插入图片描述

# 8.3.5 IDEA 常用快捷键

在这里插入图片描述
第11点也可以用 alt + enter

# 8.3.6 模板/自定义模板

在这里插入图片描述

# 8.4 包

# 8.4.2 包的三大作用

在这里插入图片描述

# 8.4.3 包基本语法

在这里插入图片描述

# 8.4.4 包的本质分析(原理)

在这里插入图片描述

# 8.4.5 快速入门

在这里插入图片描述

# 8.4.6 包的命名

在这里插入图片描述

# 8.4.7 常用的包

在这里插入图片描述

# 8.4.8 如何引入包

在这里插入图片描述

package com.hspedu.pkg; 
import java.util.Arrays; 
    public class Import01 { 
    	public static void main(String[] args) { 
    			int[] arr = {-1, 20, 2, 13, 3}; 
                Arrays.sort(arr); 
                for (int i = 0; i < arr.length ; i++) { 
			System.out.print(arr[i] + "\t"); 
		}
	}
}	
1
2
3
4
5
6
7
8
9
10
11

# 8.4.9 注意事项和使用细节

在这里插入图片描述

# 8.5 访问修饰符

# 8.5.1 基本介绍

在这里插入图片描述

# 8.5.2 种访问修饰符的访问范围

在这里插入图片描述

# 8.5.3 使用的注意事项

在这里插入图片描述

# 8.6 面向对象编程三大特征

# 8.6.1 基本介绍

面向对象编程有三大特征:封装、继承和多态。

# 8.6.2 封装介绍

在这里插入图片描述

# 8.6.3 封装的理解和好处

在这里插入图片描述

# 8.6.4 封装的实现步骤 (三步)

在这里插入图片描述

# 8.7.1 将构造器和 setXxx 结合

看一个案例

public Person(String name, int age, double salary) { 
    	setName(name); 
    	setAge(age); 
    	setSalary(salary); 
    }
1
2
3
4
5

# 8.8 面向对象编程-继承

# 8.8.2 继承基本介绍和示意图

在这里插入图片描述

# 8.8.3 继承的基本语法

在这里插入图片描述

# 8.8.5 继承给编程带来的便利

  1. 代码的复用性提高了
  2. 代码的扩展性和维护性提高了

# 8.8.6 继承的深入讨论/细节问题

在这里插入图片描述
在这里插入图片描述

# 8.8.7 继承的本质分析(重要)

在这里插入图片描述

package com.hspedu.extend_; 
 
public class ExtendsTheory { 
	public static void main(String[] args) { 
		Son son = new Son();
		System.out.println(son.name);
    	System.out.println(son.hobby);
    	} 
}
    
class GrandPa { 
    String name = "大头爷爷";
    String hobby = "旅游"; 
}

class Father extends GrandPa {
    String name = "大头爸爸"; 
    private int age = 39; 
    public int getAge() { 
    return age; 
    } 
}

class Son extends Father { 
	String name = "大头儿子"; 
}
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

子类创建的内存布局:
在这里插入图片描述
如果Father里的age是private,即使GrandPa里也有age,是public,访问age的时候一样到Father就会停止,不会继续查看GrandPa里是否有age。

# 8.8.8 课堂练习

在这里插入图片描述
由于B()函数里调用了this函数,所以没有super函数,但B(String name)函数有super()。

# 8.9 super 关键字

# 8.9.1 基本介绍

super 代表父类的引用,用于访问父类的属性、方法、构造器。

# 8.9.2 基本语法

在这里插入图片描述

# 8.9.3 super 给编程带来的便利/细节

在这里插入图片描述

# 8.9.4 super 和 this 的比较

在这里插入图片描述

# 8.10 方法重写/覆盖(override)

# 8.10.1 基本介绍

在这里插入图片描述

# 8.10.3 注意事项和使用细节

在这里插入图片描述

# 8.10.4 课堂练习

在这里插入图片描述

# 8.11 面向对象编程-多态

# 8.11.1 先看一个问题

在这里插入图片描述

# 8.11.2 多[多种]态[状态]基本介绍

方法或对象具有多种形态。是面向对象的第三大特征,多态是建立在封装和继承基础之上的。

# 8.11.3 多态的具体体现

  1. 方法的多态
    重写和重载就体现多态

  2. 对象的多态 (核心,困难,重点)
    在这里插入图片描述

    package com.hspedu.poly_.objectpoly_; 
    public class Animal { 
    	public void cry() { 
    		System.out.println("Animal cry() 动物在叫...."); 
    	} 
    }
    
    package com.hspedu.poly_.objectpoly_; 
    public class Cat extends Animal { 
    	public void cry() { 
    		System.out.println("Cat cry() 小猫喵喵叫..."); 
    	} 
    }
    
    package com.hspedu.poly_.objectpoly_; 
    public class Dog extends Animal {
    	public void cry() { 
    		System.out.println("Dog cry() 小狗汪汪叫..."); 
    	} 
    }
    
    package com.hspedu.poly_.objectpoly_; 
    public class PolyObject { 
    	public static void main(String[] args) { 
            Animal animal = new Dog(); 
    
            animal.cry(); 
    
            animal = new Cat(); 
            animal.cry(); 
    	} 
    }
    
    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

# 8.11.5 多态注意事项和细节讨论

在这里插入图片描述

    package com.hspedu.poly_.detail_; 
    public class Animal { 
    	String name = "动物"; 
    	int age = 10; 
    	public void sleep(){ 
    		System.out.println("睡"); 
    	}
    	public void run(){ 
    		System.out.println("跑");
    	}
    	public void eat(){ 
    		System.out.println("吃"); 
    	}
    	public void show(){ 
    		System.out.println("hello,你好"); 
    	} 
    }
    package com.hspedu.poly_.detail_; 
    public class Cat extends Animal { 
    	public void eat(){
    		System.out.println("猫吃鱼"); 
    	}
    	public void catchMouse(){
    		System.out.println("猫抓老鼠"); 
    	} 
    }
    package com.hspedu.poly_.detail_; 
    public class Dog extends Animal {
    }
    package com.hspedu.poly_.detail_; 
    public class PolyDetail {
    	public static void main(String[] args) { 
    	   	Animal animal = new Cat(); 
       		Object obj = new Cat();
    
       		animal.eat();
       		animal.run();
       		animal.show();
       		animal.sleep();
       		
       		Cat cat = (Cat) animal; 
       		cat.catchMouse();
       		Dog dog = (Dog) animal; 
    		System.out.println("ok~~"); 
    	} 
    }
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
37
38
39
40
41
42
43
44
45
46

向下转型图解:
在这里插入图片描述
animal本来就指向cat对象,所以对animal向下转型为cat是没有问题的,用cat类型指向cat对象。

属性没有重写之说!属性的值看编译类型:

package com.hspedu.poly_.detail_; 
public class PolyDetail02 { 
	public static void main(String[] args) { 
		
		Base base = new Sub();
		System.out.println(base.count);
		Sub sub = new Sub(); 
		System.out.println(sub.count);
	} 
}
class Base { 
	int count = 10;
}
class Sub extends Base {
	int count = 20;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

instanceOf 比较操作符,用于判断对象的运行类型是否为 XX 类型或 XX 类型的子类型:

package com.hspedu.poly_.detail_; 
public class PolyDetail03 { 
	public static void main(String[] args) { 
		BB bb = new BB(); 
		System.out.println(bb instanceof BB);
		System.out.println(bb instanceof AA);
         AA aa = new BB();
         System.out.println(aa instanceof AA); 
         System.out.println(aa instanceof BB); 
         Object obj = new Object(); 
         System.out.println(obj instanceof AA);
         String str = "hello"; 
         System.out.println(str instanceof Object);
	} 
}

class AA {

} 

class BB extends AA {

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 8.11.6 课堂练习

在这里插入图片描述

# 8.11.7 java 的动态绑定机制(非常非常重要.)

在这里插入图片描述

package com.hspedu.poly_.dynamic_; 
public class DynamicBinding { 
	public static void main(String[] args) { 
		
		A a = new B();
		System.out.println(a.sum());
		System.out.println(a.sum1());
	} 
}

class A {
	public int i = 10; 
	
	public int sum() {
		return getI() + 10;
	}
	public int sum1() {
		return i + 10;
	}
	public int getI() {
		return i; 
	} 
}

class B extends A {
	public int i = 20; 
    public int getI() {
    return i; 
    }     
}
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

# 8.11.8 多态的应用

在这里插入图片描述

 package com.hspedu.poly_.polyarr_; 
 public class PloyArray { 
 	public static void main(String[] args) { 
         Person[] persons = new Person[5]; 
         persons[0] = new Person("jack", 20); 
         persons[1] = new Student("mary", 18, 100); 
         persons[2] = new Student("smith", 19, 30.1); 
         persons[3] = new Teacher("scott", 30, 20000); 
         persons[4] = new Teacher("king", 50, 25000); 
         for (int i = 0; i < persons.length; i++) { 
 
             System.out.println(persons[i].say());
 
             if(persons[i] instanceof Student) {
             	Student student = (Student)persons[i];
             	student.study(); 
             } else if(persons[i] instanceof Teacher) { 
             	Teacher teacher = (Teacher)persons[i]; 
             	teacher.teach();
             } else if(persons[i] instanceof Person){ 
 
             } else {
             	System.out.println("你的类型有误, 请自己检查..."); 
             } 
 		} 
 	} 
 }
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

# 8.12 Object 类详解

# 8.12.1 equals 方法

在这里插入图片描述
查看jdk源码之前需要配置如下,不过系统已经默认自动帮你配置了:
在这里插入图片描述

# 8.12.2 如何重写 equals 方法

应用实例: 判断两个 Person 对象的内容是否相等,如果两个 Person 对象的各个属性值都一样,则返回 true,反之 false。

package com.hspedu.object_; 
public class EqualsExercise01 { 
	public static void main(String[] args) { 
		Person person1 = new Person("jack", 10, '男'); 
		Person person2 = new Person("jack", 20, '男'); 
		System.out.println(person1.equals(person2));
	} 
}

class Person{ 
    private String name; 
    private int age; 
    private char gender; 
    public boolean equals(Object obj) { 

        if(this == obj) { 
        	return true; 
        }

        if(obj instanceof Person) {

            Person p = (Person)obj; 
            return this.name.equals(p.name) && this.age == p.age && this.gender == p.gender;
        }

        return false; 
	}
}
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

在这里插入图片描述
在这里插入图片描述

# 8.12.4 hashCode 方法

在这里插入图片描述
在这里插入图片描述

# 8.12.5 toString 方法

在这里插入图片描述

   package com.hspedu.object_; 
    public class ToString_ { 
    	public static void main(String[] args) { 
    		 
    		Monster monster = new Monster("小妖怪", "巡山的", 1000); 
    		System.out.println(monster.toString() + " hashcode=" + monster.hashCode()); 
    		System.out.println("==当直接输出一个对象时,toString 方法会被默认的调用=="); 
    		System.out.println(monster); 
    	} 
    }
    class Monster { 
    	private String name; 
    	private String job; 
    	private double sal; 
    	public Monster(String name, String job, double sal) { 
    		this.name = name; 
    		this.job = job; 
    		this.sal = sal; 
    	}
    		@Override 
        	public String toString() { 
        		return "Monster{" + "name='" + name + '\'' + 
        			", job='" + job + '\'' + 
        			", sal=" + sal + 
        			'}'; 
        	}
        	@Override
        	protected void finalize() throws Throwable { 
        		System.out.println("fin.."); 
        	} 
        }
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

# 8.12.6 finalize 方法

在这里插入图片描述

package com.hspedu.object_; 

public class Finalize_ { 
	public static void main(String[] args) { 
		Car bmw = new Car("宝马"); 	
    		bmw = null; 
    		System.gc();
    		System.out.println("程序退出了...."); 
    	} 
    }

class Car { 
    private String name; 
    public Car(String name) { 
        this.name = name; 
}	
	
	@Override 
	protected void finalize() throws Throwable { 
		System.out.println("我们销毁 汽车" + name ); 
		System.out.println("释放了某些资源..."); 
	} 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 8.13 断点调试(debug)

# 8.13.1 一个实际需求

在这里插入图片描述
8.13.3 断点调试的快捷键
在这里插入图片描述
小技巧:将光标放在某个变量上,可以看到最新的数据。
老韩小技巧:断点可以在 debug 过程中,动态的下断点

# 8.15 本章作业

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述