文章目录
前言
前面我们用sublime Text记事本学习了面向对象初级的内容,从这一章节开始,我们正式使用idea集成开发工具,学习和锻炼更为复杂的编程能力,同时也是对面向对象内容的更深度学习,包括包、封装、继承、重写、多态、转型、断点调试等内容。
受篇幅限制,本篇文章是韩顺平老师课程P264-P296(第8章:面向对象编程中级)上半部分重点内容的详细总结。
- IDEA常用快捷键与模板
 - 包的使用与规范
 - 访问修饰符
 - 封装(重点)
 - 继承(重点)
 
一、IDEA
使用
- out 文件夹 存放 编译后的 .class文件
 - src 文件夹 存放 源码文件 .java 文件
 
常用快捷键
- 删除当前行(默认是ctrl+y,可以自己配置)
ctrl+d - 复制当前行(自己配置)
ctrl+alt+下光标 - 补全代码
alt+/ - 添加注释和取消注释(第一次是添加注释,第二次是取消注释)
ctrl+/ 
- 如何修改快捷键

 
- 导入该行需要的类 
  
- 先配置auto import

 - 然后使用
alt+enter 
 - 先配置auto import
 - 快速格式化代码
ctrl+alt+L - 快速运行程序(自己定义)
alt+R - 生成构造器等 
alt + insert[提高开发效率]


 - 查看一个类的层级关系 
ctrl + H[学习继承后,非常有用] - 将光标放在一个方法上,输入 
ctrl + B, 可以定位到方法 [学继承后,非常有用] - 自动的分配变量名 , 通过 
在后面 + .var 
模板/自定义模板
- main + 回车
 - sout + 回车
 - fori + 回车

 
二、包package
1. 基本介绍
-  
一个应用场景:两个程序员都想定义一个类,名为Dog
 -  
包的三大作用
- 区分相同名字的类
 - 当类很多时,可以很好地管理类(查看API文档)
 - 控制访问范围
 
 -  
基本语法
 
package com.hspedu;
//1.package 关键字,表示打包
//2.com.hspedu 表示包名
com 是一级目录  hspedu 是下一级目录
 

- 原理:实际上就是创建不同的文件夹(目录)来保存类文件

 - 快速入门


 
2. 包的命名规范
- 命名规则:只能包含数字、字母、下划线、小圆点,但不能用数字开头,不能是关键字或保留字

 - 命名规范:一般是小写字母 + 小圆点

 
3. 常用的包和如何引入
-  
常用的包
一个包下,包含很多的类,java 中常用的包有:- java.lang.*
lang 包是基本包,默认引入,不需要再引入 - java.util.*
util 包,系统提供的工具包, 工具类,使用 Scanner - java.net.*
网络包,网络开发 - java.awt.*
是做 java的界面开发GUI 
 - java.lang.*
 -  
如何引入包
- 语法:
import 包; - 主要目的:使用该包下面的一个类
比如importjava.util.Scanner;就只是引入一个类Scanner
import java.util.*;表示将java util 包所有都引入 - 案例:使用系统自带类进行排序

 
 - 语法:
 
4. 注意事项和细节
- package 的作用是声明当前类所在的包,需要放在class的最上面,一个类最多只有一句package
 - import 指令 位置放在package的下面,在类定义前面,可以有多句且没有顺序要求

 
三、访问修饰符(四类)
java 提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围):
-  
公开级别: 用 public 修饰, 对外公开
 -  
受保护级别: 用 protected 修饰,对子类和同一个包中的类公开
 -  
默认级别: 没有修饰符号, 向同一个包的类公开
 -  
私有级别: 用 private 修饰, 只有类本身可以访问, 不对外公开
 

-  
同类中,都可以使用

 -  
同包中,私有无法访问 只有n1, n2, n3 可选

 -  
子类中,只能访问 public 和 protected
 -  
不同包中,只有 public 类可以访问,只有n1可以选 use包 和 qiang包

 
四、封装Encapsulation(重点)
1. 封装介绍
-  
面向对象编程三大特征:封装、继承和多态
 -  
封装(encapsulation)就是把抽象的数据[属性]和对数据的操作[方法]封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作[方法],才能对数据进行操作
 -  
封装的理解和好处
- 隐藏实现细节:方法<–调用
 - 可以对数据进行验证,保证安全合理
 
 
2. 封装步骤
- 将属性进行私有化 private 【不能直接修改属性】
 - 提供一个公共的 (public) set方法,用于对属性判断并赋值
 - 提供一个公共的get方法,用于获取属性的值
 
3. 快速入门

package com.mucy.encap;
public class Encapusulation01 {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("jack");
        person.setAge(33);
        person.setSalary(30000);
        System.out.println(person.info());
    }
}
class Person {
    public String name;
    private int age;
    private double salary;
   /* public void setName(String name) {
        this.name= name;
    }
    public String getName() {
        return name;
    } */
    //自己写set xxx  get xxx 太慢,用快捷键
    //Alt + insert 选择setter and getter
    //对代码进行完善
    public String getName() {
        return name;
    }
    public void setName(String name) {
        //加入对数据的校验
        if(name.length() >= 2 && name.length() <= 6) {
            this.name = name;
        } else {
            System.out.println("名字有误");
            this.name = "无名";
        }
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        if(age >= 1 && age <= 120) {
            this.age = age;
        } else {
            System.out.println("信息有误");
            this.age = 22;
        }
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
    //写一个方法,返回属性信息
    public String info() {
        return "信息为 name= " + name + " age= " + age + " 薪水= " + salary;
    }
}
 
4. 封装与构造器
将构造器与set xxx 结合
 
五、继承(重点)
1. 为什么需要继承
观察以下两个代码,发现大学生和小学生考试两个类的很多属性都是相同的
解决方法:用继承解决代码复用性
 
2. 继承原理图
- 继承基本介绍和示意图 
  
- 介绍:继承可以解决代码复用,让我们的编程更加靠近人类思维。当多个类存在相同的属性(变量)和方法时,可以从这些类中 抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过 extends 来 声明继承父类即可。
 
 - 示意图:

 - 继承的基本语法
class 子类 extends 父类- 子类自动拥有父类的属性和方法
 
 
3. 快速入门
使用之前的案例,改进
 
4. 继承的优点
- 代码的复用性提高了
 - 代码的扩展性和维护性提高了
 
5. 使用细节
-  
细节1:
- 子类继承了所有的属性和方法,(通过debug查看)

 - 非私有的属性和方法可以在子类直接访问,但是私有属性和方法不能在子类直接访问

 - 要通过父类提供公共的方法去访问

 
 - 子类继承了所有的属性和方法,(通过debug查看)
 -  
细节2:子类必须调用父类的构造器, 完成父类的初始化

- 默认创建super(), 调用了父类的构造器,父类先被调用

 
 - 默认创建super(), 调用了父类的构造器,父类先被调用
 -  
细节3:
- 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器

 - 如果父类没有提供无参构造器,

 - 则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过
在子类的每个构造器中指定父类的构造器

 
 - 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器
 -  
细节4:如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)

 -  
细节5:super在使用时,需要放在构造器的第一行
 -  
细节6:super() this() 都只能放在构造器的第一行,因此两个方法不能共存在一个构造器
 -  
细节7:java 所有类都是 Object 类的子类 CTRL + H 查看

 -  
细节8:父类构造器的调用不限于直接父类 将一直往上追溯直到 Object 类(顶级父类)
 -  
细节9:子类最多只能继承一个父类(指直接继承),即 java 中是单继承机制。
思考:如何让 A 类继承 B 类和 C 类? 【A 继承 B, B 继承 C】 -  
细节10:不能滥用继承,子类和父类之间必须满足 is-a 的逻辑关系
 
6. 继承的本质(重要)

public class ExtendsTheory {
    public static void main(String[] args) {
        Son son = new Son(); //内存的布局 如上图
        ?-> 这时请大家注意,要按照查找关系来返回信息
        // (1) 首先看子类是否有该属性
        // (2) 如果子类有这个属性,并且可以访问,则返回信息
        // (3) 如果子类没有这个属性,就看父类有没有这个属性(如果父类有该属性,并且可以访问,就返回信息..)
        // (4) 如果父类没有就按照(3)的规则,继续找上级父类,直到 Object...
        System.out.println(son.name); //返回 儿子
        System.out.println(son.age); //返回 39
        System.out.println(son.hobby); //返回 旅游
    }
}
class GrandPa {
    String name = "爷爷";
    String hobby = "旅游";
}
class Father extends GrandPa {
    String name = "爸爸";
    int age = 39;
}
class Son extends Father {
    String name = "儿子";
}
 
总结
前面我们用sublime Text记事本学习了面向对象初级的内容,从这一章节开始,我们正式使用idea集成开发工具,学习和锻炼更为复杂的编程能力,同时也是对面向对象内容的更深度学习,包括包、封装、继承、重写、多态、转型、断点调试等内容。
受篇幅限制,本篇文章是韩顺平老师课程P264-P296(第8章:面向对象编程中级)上半部分重点内容的详细总结。
- IDEA常用快捷键与模板
 - 包的使用与规范
 - 访问修饰符
 - 封装(重点)
 - 继承(重点)
 









