Hi i,m JinXiang
⭐ 前言 ⭐
本篇文章主要介绍Java面向对象编程(中级部分)包、访问修饰符、封装、继承、super关键字、多态、向上(下)转型、equals、hashCode、断点调试等知识的详细使用以及部分理论知识
🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁
🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言
目录
1、包
包的三大作用
- 1、区分相同名字的类
- 2、当类很多时,可以很好的管理类
- 3、控制访问范围
包的基本语法
package com.hspedu;
- 说明:
- 1、package 关键字,表示打包.
- 2、com.hspedu 表示包名
包的本质
包的本质就是创建不同的文件夹/目录来保存类文件
快速入门
在不同的目录/文件夹下创建相同名称的类
包的命名
常用的包
一个包下, 包含很多的类 ,java 中常用的包有 :
-
- java.lang.*
- //lang 包是基本包,默认引入,不需要再引入.
-
- java.util.*
- //util 包,系统提供的工具包, 工具类,使用 Scanner
-
- java.net.*
- //网络包,网络开发
-
- java.awt.* //是做 java 的界面开发,GUI
如何引入包
用哪个就导入哪个
注意事项和使用细节
- 1、package 的作用是声明当前类所在的包,需要放在类的最上面,一个类中最多只有一局package
- 2、import指令 位置放在package的下面,在类定义前面,可以有多句且没有顺序要求。
2、访问修饰符
基本介绍
java 提供四种访问控制修饰符号,用于控制方法和属性 ( 成员变量 ) 的访问权限(范围) :
-
- 公开级别:用 public 修饰,对外公开
-
- 受保护级别:用 protected 修饰,对子类和同一个包中的类公开
-
- 默认级别:没有修饰符号,向同一个包的类公开.
-
- 私有级别:用 private 修饰,只有类本身可以访问,不对外公开.
4种访问修饰符的访问范围
使用访问修饰符的注意事项
- 1)修饰符可以用来修饰类中的属性,成员方法以及类
- 2)只有默认的和public才能修饰类!,并且遵循上述访问权限的特点。
- 3)因为没有学习继承,因此关于在子类中的访问权限,我们讲完子类后,在回头讲解4)成员方法的访问规则和属性完全一样.
//com.hspedu.modifier:需要很多文件来说明(A类,B类, Test类.....
3、OOP三大特征(封装、继承、多态)
3.1、封装
封装介绍
封装就是把抽象出来的数据【属性】和对数据的操作【方法】封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作【方法】,才能对数据进行操作
封装的理解和好处
- 1、隐藏实现细节:方法(连接数据库)<--调用(传入参数)
- 2、可以对数据进行验证,保证安全合理
封装实现的步骤
- 1、将属性进行私有化private【不能直接修改属性】
- 2、提供一个公共的(public)set 方法,用于对属性判断并赋值
- public void setXxx(类型参数名) {//Xxx表示某个属性
- //加入数据验证的业务逻辑
- 属性=参数名;
- }
- 3、提供一个公共的(public)get 方法,用于获取属性的值
- public 数据类型getXxx() {//权限判断, Xxx某个属性
- return xx;
- }
快速入门
案例:请大家看一个小程序 不能随便查看人的年龄,工资等隐私,并对设置的年龄进行合理的验证。年龄合理就设置,否则给默认"年龄必须在1-120,年龄,工资不能直接查看,name的长度在2-6之间
代码:
java
package 封装;
public class 快速入门案例 {
// 不能随便查看人的年龄,工资等隐私,并对设置的年龄进行合理的验证。
// 年龄合理就设置,否则给默认"年龄必须在1-120,年龄,工资不能直接查看,
// name的长度在2-6之间。
public static void main(String[] args) {
Person person = new Person();
person.setName("jack");
person.setAge(30);
person.setSalary(3030);
person.info();
}
}
class Person{
public String name; //名字公开
private int age; //年龄私有
private double salary;//...
public String getName() {
return name;
}
public void setName(String name) {
//加入读数据的校验,相当于增加业务逻辑
if (name.length() >=2 && name.length()<=6){
this.name = name;
}else {
System.out.println("名字的长度不对,需要大于2小于6,默认名字");
this.name = "无名";
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
//添加判断
if (age>=1 && age <=120){
this.age = age;
}else {
System.out.println("设置的年龄不正确,需要在1到120之间,给年龄设置了默认值18");
this.age = 18;//给一个默认年龄
}
}
public double getSalary() {
//可以增加一个对当前对象的权限判断
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public void info(){
System.out.println("姓名:"+name+" 年龄:"+age+" 薪水:"+salary);
}
}
封装与构造器
java
//使用构造器指定属性
Person smith = new Person("smith", 120, 30000);
System.out.println("===smith的信息===");
System.out.println(smith.info());
java
//无参构造器
public Person() {
}
//有三个属性的构造器
public Person(String name, int age, double salary) {
/*this.name = name;
this.age = age;
this.salary = salary;*/
//验证数据:把set写在构造器中
setName(name);//这样写的话,下面set中的数据校验和判断在构造器中也能使用
setAge(age);
setSalary(salary);
}
3.2、继承
为什么学继承?
一个小问题,还是看个程序,提出代码复用的问题。
我们编写了两个类,一个是Pupil类(小学生),一个是Graduate(大学毕业生).问题:两个类的属性和方法有很多是相同的,怎么办?
=>继承(代码复用性~)
继承基本介绍和示意图
可以解决代码复用 , 让我们的编程更加靠近人类思维 . 当多个类存在相同的属性 ( 变量 ) 和方法时 , 可以从这些类中 抽象出父类, 在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过 extends 来 声明继承父类即可。
继承的基本语法
class 子类 extends 父类{
}
- 1、子类就会自动拥有父类定义的属性和方法
- 2、父类又叫超类,基类
- 3、子类又叫派生类
继承快速入门
目录
Student父类
java
//父类,是pupil和graduate的父类
public class Student {
//共有属性
public String name;
public int age;
public double score;
//共有的方法
public void setScore(double score) {
this.score = score;
}
public void info(){
System.out.println("学生名:"+name+" 年龄"+age+" 成绩:"+score);
}
}
小学生Pupil子类
java
//让pupil继承student类
public class Pupil extends Student {
//小学生
public void testing(){
System.out.println("小学生"+ name +" 正在考小学数学..");
}
}
大学生Graduate子类
java
//让pupil继承student类
public class Graduate extends Student {
//大学毕业生
public void testing(){
System.out.println("大学生"+ name +" 正在考小学数学..");
}
}
Test测试类
java
public class Test {
public static void main(String[] args) {
Pupil pupil = new Pupil();
pupil.name = "银角大王";
pupil.age = 10;
pupil.testing();
pupil.setScore(60);
pupil.info();
System.out.println("=========");
Graduate graduate = new Graduate();
graduate.name = "金角大王";
graduate.age = 22;
graduate.testing();
graduate.setScore(100);
graduate.info();
}
}
继承给编程带来的遍历
- 1、代码的复用性提高了
- 2、代码的扩展性和维护下提高了
继承的深入探讨/细节问题
-
- 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问**,** 但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问
-
- 子类必须调用父类的构造器, 完成父类的初始化
-
- 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过
-
- 如果希望指定去调用父类的某个构造器,则显式的调用一下 : super( 参数列表 )
-
- super 在使用时,必须放在构造器第一行 (super 只能在构造器中使用 )
-
- super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
-
- java 所有类都是 Object 类的子类 , Object 是所有类的基类 .
-
- 父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类 ( 顶级父类 )
-
- 子类最多只能继承一个父类 ( 指直接继承 ) ,即 java 中是单继承机制
-
- 不能滥用继承,子类和父类之间必须满足 is-a 的逻辑关系
继承的本质
本质详解0293_韩顺平Java_继承本质详解_哔哩哔哩_bilibili
3.3、多态
4、Super关键字
基本介绍
super代表父类的引用,用于访问父类的属性、方法、构造器
基本语法
- 1、访问父类的属性,但不能访问父类的private属性 【super.属性名;】
- 2、访问父类的方法,不能访问父类的private方法 【super.方法名(参数列表)】
- 3、访问父类的构造器 【super(参数列表);】只能放在构造器的第一句,只能出现一句!
super给编程带来的遍历/细节
- 1、调用父类的构造器的好处:分工明确,父类属性由父类初始化,子类的属性由子类初始化
- 2、当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。如果没有重名,使用super、this、直接访问是一样的效果!
- 3.、super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用
super去访问爷爷类的成员;如果多个基类(上级类)中都有同名的成员,使用st访问遵循就近原则。A->B->C,当然也需要遵守访问权限的相关规则
super和this的比较
5、方法重写/覆盖(overwrite)
基本介绍
方法覆盖(重写)就是子类有一个方法,和父类的某个方法的名称、返回类型、参数一样,那么我们就说子类的这个方法覆盖了父类的方法
方法重写快速入门
方法重写/覆盖注意事项和使用细节
- 1、子类的方法的形参列表,方法名称,要和父类方法的形参列表方法名称完全一样。【演示】
- 2、子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类比如父类返回类型是 Object ,子类方法返回类型是String【演示】
- 3、子类万法不能缩小父类方法的访问权限【演示】public >protected >默认>private
方法重写和方法重载的区别
6、Object类详解,垃圾回收机制
7、项目
总结不易,希望宝宝们不要吝啬亲爱的👍哟(^U^)ノ~YO!如有问题,欢迎评论区批评指正😁