【Java语言】学习笔记-08面向对象【中级】包、访问修饰符、封装、继承、多态、Super、Override(重写)、Object、断点调试等细节详解(上)
跟着一位很厉害的老师学完了java基础,现开始进行javaSE复盘总结知识点,希望可以给java基础薄弱的友友提供一点参考,一起学习Java初级知识,共同进步,打好底层逻辑基础,爱上Java编程❤️❤️❤️
(本文章中知识点如有不同的见解,欢迎评论区留言)
tips: 本章在整个Java基础的知识点处于一个比较重要的地位,其中包括封装、继承、多态,属于我们java的一大特色,但同时这部分的内容比较多和琐碎,希望友友们反复观看笔记加深印象
本章内容较多分为上中下三篇,这里是上篇
让我们开始发车,加油
目录
- 1、包(软件包)
- 1.1、包 介绍
- 1.1.1、包 的三大作用
- 1.2、包 的本质快速入门
- 1.3、包 的命名
- 1.4、常用的 包
- 1.5、如何使用包
- 1.5.1、案例
- 1.5.2、package使用事项
- 1.5.3、类的完善
- 2、访问修饰符
- 2.1、验证四种访问修饰符
- 2.1.1、同包下
- 2.1.2、不同包下
- 2.1.3、同一个包下
- 3、封装
- 3.1、封装的理解和好处
- 3.2、封装实现步骤(三步)
- 3.3、快速入门
- 3.4、将构造器和setXxx结合
- 3.5、小练习
- 恭喜🎉你成功打败了30%的人
- 继续努力
1、包(软件包)
- 包的本质分析原理
包的本质实际上就是创建不同的文件夹/目录来保存类文件,示意图 :
1.1、包 介绍
1.1.1、包 的三大作用
JavaAPI文档连接: Java包使用方法API文档连接
包基本语法
package com.xiaohong;
package:关键字,表示打包.
com.xiaohong:表示包名
1.2、包 的本质快速入门
如果有两个包中两个同样的对象,那么引用时就会出现包名全名称
刚学java的同学很容易遇到这种问题💔,建了两个相同的类引入时出现了全路径变得不知所措,很可能是不小心创建了两次同一个类。
如果只想要一个类,解决方法就是把另一个包中的相同类删除。
(第一个不用报包名,第二个需要)
1.3、包 的命名
1.4、常用的 包
- 常用的包
一个包下,包含很多的类,java 中常见的包有 :
- java.lang .
*
//lang包是基本包,默认引入,不需要 再引入 - java.util.
*
//util包,系统提供的工具包,工具类,使用Scanner - java.net.
*
//网络包,网络开发 - java.awt.
*
//是做java的页面开发,GUI,画图之类的内部包
1.5、如何使用包
相信使用过软件的同学创建java文件时都见过这样的结构
代码演示
package com.fhsdu.pkg;
//建议:我们需要使用到哪个类,就导入哪个类即可,不建议使用 * 导入
import java.util.Scanner;//表示只会引入java.util 包下的Scanner
import java.util.*;//表示将java.util 包下的所有类都引入(导入)
public class Import01 {
public static void main(String[] args) {
}
}
1.5.1、案例
使用系统提供 Arrays 完成数组排序
使用Arrays,sort实现冒泡排序,自动引入java.util类
用哪个类就导入哪个,不要使用*
package com.fhsdu.pkg;
//注意:
//老韩建议:我们需要使用到哪个类,就导入哪个类即可,不建议使用 * 导入
import java.util.Arrays;
import java.util.Scanner;//表示只会引入java.util 包下的Scanner
//import java.util.*;//表示将java.util 包下的所有类都引入(导入)
public class Import01 {
public static void main(String[] args) {
//使用系统提供 Arrays 完成数组排序
int[] arr = {-1 , 20, 2, 13, 3};
//比如对其进行排序
//传统方法是,自己编写排序(冒泡)
//系统是提供了相关的类,可以方便完成 Arrays
Arrays.sort(arr);
for (int i = 0; i < arr.length ; i++) {
System.out.print(arr[i] + " ");
}
}
}
1.5.2、package使用事项
//package的作用是声明当前类所在的包,需要放在类(或者文件)的最上面
//一个类中最多只有一句package
package com.fhsdu.pkg;
//import命令 位置放在package的下面, 在定义前面,可以有多句没有顺序要求
import java.util.Arrays;
import java.util.Scanner;
public class PkgDetail {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] arr = {0, -1, 1};
Arrays.sort(arr);
}
}
1.5.3、类的完善
2、访问修饰符
访问修饰符共有4个
public:全局可以使用,包括同类、同包、子类、不同包
protected:同类、同包、子类
默认:同类、同包
private:同类
- 修饰符可以用来修饰类中的属性,成员方法以及类
- 只有默认的
public
才能修饰类!并遵循上述访问权限的特点 - 之后我们会学到继承,子类中的访问权限也遵循同样的规则
- 成员方法的访问规则和属性完全一样
修饰符 | 同类 | 同包 | 子类 | 不同包 |
---|---|---|---|---|
public | ✅ | ✅ | ✅ | ✅ |
protected | ✅ | ✅ | ✅ | ❌ |
默认void | ✅ | ✅ | ❌ | ❌ |
private | ✅ | ❌ | ❌ | ❌ |
2.1、验证四种访问修饰符
2.1.1、同包下
private不能访问
2.1.2、不同包下
只能访问public
2.1.3、同一个包下
3、封装
面向对象编程的三大特征 : 封装 、 继承、多态
3.1、封装的理解和好处
3.2、封装实现步骤(三步)
3.3、快速入门
可以在setXxx中设置条件,来限制某些条件
代码实现
package com.fhsedu.encap;
public class Encapsulation01 {
public static void main(String[] args) {
Person person = new Person();
// person.setName("jacktomcat 你好吗");长度错误
person.setName("fhs");
person.setAge(300);
person.setSalary(6028.25);
System.out.println(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 String info(){
return "信息为: name=" + name +" age=" + age + " salary=" + salary;
}
}
3.4、将构造器和setXxx结合
构造器中也可以设置条件
//main类
//如果我们自己使用构造器指定属性
System.out.println("====smith的信息====");
Person smith = new Person("smith", 200, 14250);
System.out.println(smith.info());
//Person类
//无参构造器
public Person() {
}
// 有三个属性的构造器
public Person(String name, int age, double salary) {
/*this.name = name;
this.age = age;
this.salary = salary;*/
setName(name);
setAge(age);
setSalary(salary);
}
3.5、小练习
创建两个类:Account和AccountTest
代码实现 :
package com.fhsdu.encap;
public class Account {
//为了封装,将3个属性值设置为private
private String name;
private double balance;
private String pwd;
public Account() {
}
public Account(String name, double balance, String pwd) {
setName(name);
setPwd(pwd);
setBalance(balance);
}
public String getName() {
return name;
}
//名字(长度2位3位或4位)
public void setName(String name) {
if(name.length() >=2 &&name.length() <=4) {
this.name = name;
}else{
System.out.println("名字长度有误(2~4位),默认为无名氏");
this.name = "无名氏";
}
}
public double getBalance() {
return balance;
}
//balance > 20
public void setBalance(double balance) {
if(balance > 20) {
this.balance = balance;
}else{
System.out.println("余额必须大于二十,默认为0");
this.balance = 0;
}
}
public String getPwd() {
return pwd;
}
//pwd必须是6位
public void setPwd(String pwd) {
if(pwd.length() == 6) {
this.pwd = pwd;
}else{
System.out.println("你输入的密码长度有误,默认为:000000");
this.pwd = "000000";
}
}
//显示账号信息
public void showInfo(){
System.out.println("账号信息 name=" + name +
" 余额" + balance + " 密码" + pwd);
}
}
测试类
package com.fhsdu.encap;
public class TestAccount {
public static void main(String[] args) {
//创建Account
Account account = new Account();
account.setName("jack");
account.setBalance(20);
account.setPwd("123456");
account.showInfo();
}
}