一、包
1.1、看一个应用场景
现在有两个程序员共同开发一个java项目,程序员某东跟某阳都希望定义一个User类,怎么去解决这个问题呢
1.2、包的三大作用
- 区分相同名字的类
- 当类很多时候,可以很好的管理类
- 控制访问范围
1.3、包基本语法
package com.包名
1、package 关键字 表示打包
2、com.包名 表示包名
包的本质 实际上介绍创建不同的文件夹/目录来保存类文件
1.4、包的命名规则
只能包含数字,字母,下划线,小圆点.,但不能以数字开头,不能是关键字或保留字
一般是com.公司名.项目名.业务模块名
com.sina.crm.user //用户模块
com.sina.crm.order //订单模块
com.sina.crm.utils //工具类
1.5、常用的包
一个包下 , 包含很多的类 ,java 中常用的包有 :
- java.lang.* //lang 包是基本包,默认引入,不需要再引入.
- java.util.* //util 包,系统提供的工具包, 工具类,使用 Scanner
- java.net.* //网络包,网络开发
- java.awt.* //是做 java 的界面开发,GUI
1.6、如何引入包
语法:import 包;
比如 import java.util.Scanner;引入类Scanner
二、访问修饰符
2.1、基本介绍
- 公开级别:用 public 修饰,对外公开
- 受保护级别:用 protected 修饰,对子类和同一个包中的类公开
- 默认级别:没有修饰符号,向同一个包的类公开.
- 私有级别:用 private 修饰,只有类本身可以访问,不对外公开.
2.2、种访问修饰符的访问范围
2.3、使用的注意事项
- 修饰符可以用来修饰类中的属性,成员方法以及类。
- 成员方法的访问规则和属性完全一样
- 只有默认的和public才能修饰类!并且遵循上述访问权限的特点。
三、面向对象编程三大特征(重要!!!!)
3.1、基本介绍
3.2、封装介绍
封装(encapsulation)就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作[方法],才能对数据进行操作。
3.3、封装的实现步骤(三步)
1)将属性进行私有化private 【不能直接修改属性】
2)提供一个公共的(public)set方法,用于对属性判断并赋值
public void setXxx(类型 参数名){//Xxx表示某个属性
//加入数据验证的业务逻辑
属性 = 参数名;}
3)提供一个公共的(public)get方法。用于获取属性的值
public 数据类型 getXxx(){
return xx;
}
四、面向对象编程-继承
4.1、为什么需要继承
我们编写两个类,一个Pupil类(小学生),一个是Graduate(大学毕业生),
两个类的属性跟方法有很多相似,怎么办
继承代码的复用性
4.2、继承基本介绍和示意图
继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过 extends 来声明继承父类即可。画出继承的示意图
4.3、继承基本语法
class 子类 extends 父类{
}
- 子类就会自动拥有父类定义的属性跟方法
- 父类又叫超类,基类
- 子类又叫派生类。
4.4、快速入门案例
package com.hspedu.extend_.improve_;
import com.hspedu.extend_.Graduate;
import com.hspedu.extend_.Pupil;
public class Extends01 {
public static void main(String[] args) {
com.hspedu.extend_.Pupil pupil = new Pupil();
pupil.name = "银角大王~";
pupil.age = 11;
pupil.testing();
pupil.setScore(50);
pupil.showInfo();
System.out.println("=======");
com.hspedu.extend_.Graduate graduate = new Graduate();
graduate.name = "金角大王~";
graduate.age = 23;
graduate.testing();
graduate.setScore(80);
graduate.showInfo();
}
}
package com.hspedu.extend_.improve_;
//父类,是 Pupil 和 Graduate 的父类
public class Student {
//共有属性
public String name;
public int age;
private double score;//成绩
//共有的方法
public void setScore(double score) {
this.score = score;
}
public void showInfo() {
System.out.println("学生名 " + name + " 年龄 " + age + " 成绩 " + score);
}
}
package com.hspedu.extend_.improve_;
//让 Pupil 继承 Student 类
public class Pupil extends Student {
public void testing() {
System.out.println("小学生 " + name + " 正在考小学数学..");
}
}
package com.hspedu.extend_.improve_;
public class Graduate extends Student {
public void testing() {//和 Pupil 不一样
System.out.println("大学生 " + name + " 正在考大学数学..");
}
}
4.5、继承给编程带来的便利
- 代码的复用性提高了
- 代码的扩展性和维护性提高了
4.6、继承的深入讨论/细节问题
- 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问
- 子类必须调用父类的构造器, 完成父类的初始化
- 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无
- 参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过。
- 如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)。
- super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)。
- super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器。
- java 所有类都是 Object 类的子类, Object 是所有类的基类.
- 父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类(顶级父类)。
- 子类最多只能继承一个父类(指直接继承),即 java 中是单继承机制。
五、super 关键字
5.1、基础介绍
5.2、基本语法
5.3、super 给编程带来的便利/细节
1、调用父类的构造器的好处 (分工明确, 父类属性由父类初始化,子类的属性由子类初始化)
2、当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。如果没有重名,使用super、this、直接访问是一样的效果
3、super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super
去访问爷爷类的成员◇如果多个基类(上级类)中都有同名的成员,使用super访问遵循就近原则。A->B->C,当然也需要遵守访问权限的相关规则
5.4、super 和 this 的比较
六、方法重写/覆盖(override)
6.1、基本介绍
简单的说:方法覆盖(重写)就是子类有一个方法,和父类的某个方法的名称、返回类型、参数一样,那么我们就说子类的这个方法覆盖了父类的方法
6.2、注意事项和使用细节
子类的方法的形参列表,方法名称,要和父类方法的形参列表,方法名称完全一样。子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类
父类 返回类型是Object,子类方法返回类型是String
oublic Object getInfo(){
public String getInfo(){
类方法不能缩小父类方法的访问权限 public > protected > 默认> private
6.3、方法的重写和重载做一个比较
七、多态
什么是多态呢?
同一个对象,在不同时刻表现出来的不同形态
举例:猫
我们可以说猫是猫:猫 cat = new 猫();
我们也可以说猫是动物:动物 animal = new 猫();
这里猫在不同的时刻表现出来了不同的形态,这就是多态
多态的前提和体现
- 有继承/实现关系.
- 有方法重写.
- 有父类引用指向子类对象.
7.2、多态的成员访问
- 构造方法:同继承一样,子类会通过 super 访问父类构造方法
- 成员变量:编译看左边(父类),执行看左边(父类)
1. 多态的格式调用变量 , 指的是使用父类类型调用变量
2. 只去查找父类的变量 , 父类中没有我们要调用的变量 , 那么就会报错
- 成员方法:编译看左边(父类),执行看右边(子类)
1. 多态的格式调用方法,指的是使用父类型调用方法。
2. 方法执行时,先执行子类重写的方法,如果子类没有重写,则动态的去父类查找
3. 多态格式调用方法时,只能调用父类型中存在的方法,不能调用子类型中特有的方法(多态的弊端)
7.3、多态的优缺点
- 多态的好处:提高了程序的扩展性,灵活性
多态形式体现(使用方向):
1 定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的任意子类对象
2 定义方法的时候, 使用父类作为方法的返回值类型 , 该方法可以返回此父类任意子类对象
3 定义变量时 , 用父类类型变量接收子类类型对象
- 多态的弊端:不能使用子类的特有功能
感谢大家的观看,欢迎大佬点评