Java面向对象编程基础(二)

Java面向对象编程基础二
- 一、package与import关键字的使用
- 1.说明
- 2.包的作用
- 3.JDK中主要的包
- 4. import
- 5.import关键字的使用
- 二、封装性
- 1.为什么要封装?
- 2.如何封装?
- 3.作用
- 4.权限修饰符的权限大小
- 5.案例
- 三、构造器
- 1 构造器的使用说明
- 2 案例:
- 四、实例变量赋值过程
- 1 在类的属性中,可以有哪些位置给属性赋值?
- 2 JavaBean
- 五、随堂复习与企业真题
一、package与import关键字的使用
1.说明
a、package:包
b、package用于指明该文件中定义的类、接口等结构所在的包
c、一个源文件只能有一个声明包的package语句
d、package语句作为Java源文件的第一条语句出现。若缺省该语句,则指定为无名包。
e、包名,属于标识符,满足标识符命名的规则和规范(全部小写)、见名知意
包通常使用所在公司域名的倒置:com.atguigu.xxx。
大家取包名时不要使用"‘java.xx`"包
f、包对应于文件系统的目录,package语句中用“.”来指明包(目录)的层次,每.一次就表示一层文件目录。
g、同一个包下可以声明多个结构(类、接口),但是不能定义同名的结构(类、接口)。不同的包下可以定义同名的结构
2.包的作用
a、包可以包含类和子包,划分项目层次,便于管理
b、帮助管理大型软件系统:将功能相同的类划分到同一个包中。比如:MVC的设计模式
c、解决类命名冲突的问题
d、控制访问权限
3.JDK中主要的包
java.lang:包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。
java.net:包含执行与网络相关的操作的类和接口。
java.io:包含能提供多种输入/输出功能的类。
java.util:包含一些实用工具类,如定义系统特性、接口的集合框架类、使用与日期日历相关的函数。
java.text:包含了一些java格式化相关的类
java.sql:包含了java进行JDBC数据库编程的相关类/接口
4. import
为了使用定义在其它包中的Java类,需用import语句来显式引入指定包下所需要的类。相当于import语句告诉编译器到哪里去寻找这个类。
语法格式
import 包名.类名;
应用举例
import pack1.pack2.Test;//import pack1.pack2.*;表示引入pack1.pack2包中的所有结构
5.import关键字的使用
a、import语句来显式引入指定包下所需要的类。相当于import语句告诉编译器到哪里去寻找这个类。
b、import语句,声明在包的声明和类的声明之间。
c、如果需要导入多个类或接口,那么就并列显式多个import语句即可
d、如果使用a.*导入结构,表示可以导入a包下的所有的结构。举例:可以使用java.util.*的方式,一次性导入util
e、如果导入的类或接口是java.lang包下的,或者是当前包下的,则可以省略此import语句。例如(System、String)
f、如果已经导入java.a包下的类,那么如果需要使用a包的子包下的类的话,仍然需要导入。
g、如果在代码中使用不同包下的同名的类,那么就需要使用类的全类名的方式指明调用的是哪个类。
二、封装性
1.为什么要封装?
高内聚:类的内部数据操作细节自己完成,不允许外部干涉;
低耦合:仅暴露少量的方法给外部使用,尽量方便外部调用。
通俗的讲,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。
2.如何封装?
权限修饰符:private、缺省、protected、public
3.作用
我们可以使用4种权限修饰来修饰类及类的内部成员。当这些成员被调用时,体现可见性的大小。
在题目中,我们给Animal的对象的legs属性赋值。在实际的常识中,我们知道legs不能赋值为负数的。但是如果直接调用属性legs,是不能加入判断逻辑的。那怎么办呢?
举例:
将legs属性私有化(private),禁止在Animal类的外部直接调用此属性
提供给legs属性赋值的setLegs()方法,在此方法中加入legs赋值的判断逻辑if(legs>=0 && legs % 2 == 0);将此方法暴露出去,使得在Animal类的外部调用此方法,对legs属性赋值。
提供给legs属性获取getLegs()方法,此方法对外暴露,使得在Animal类的外部还可以调用此属性的值。
package com.method_more;/*** package:com.method_more** @Author jimmy-yan* @Create 2024/10/15 16:45*/
public class AnimalTest {public static void main(String[] args) {Animal an = new Animal();an.name = "狗";an.eat();//todo 因为legs声明为private,是私有的,出了Animal类之外就不能用了//an.legs=5;//只能通过setLegs()方法去调用an.setLegs(4);an.getLegs();}
}class Animal {String name; //姓名private int legs; //几条腿//设置legs属性值public void setLegs(int l) {if (l >= 0 && l % 2 == 0) {legs = l;} else {System.out.println("不符合规则");}}//获取legs属性值public int getLegs() {return legs;}public void eat() {System.out.println("吃");}
}
4.权限修饰符的权限大小


类:只能使用public、缺省修饰
类的内部成员:可以使用4种权限修饰进行修饰
public class AnimalTest {public static void main(String[] args) {}
}class Animal {String name; //姓名private int legs; //几条腿
}
开发中4种权限使用频率的情况:
比较高:public、private
比较低:缺省、protected
5.案例
1、创建程序,在其中定义两个类:Person和PersonTest类。定义如下:
用setAge()设置人的合法年龄(0~130),用getAge()返回人的年龄。
在PersonTest类中实例化Person类的对象b,调用setAge()和getAge()方法,体会Java的封装性。
package com.method_more;/*** package:com.method_more** @Author jimmy-yan* @Create 2024/10/15 18:29*/
public class PersonTest {public static void main(String[] args) {Person p = new Person();p.setAge(10);System.out.println(p.getAge());}
}class Person {private int age;public void setAge(int a) {if (a > 130 || a < 0) {System.out.println("不符合规定");} else {age = a;}}public int getAge() {return age;}
}
2:自定义图书类
设定属性包括:
书名bookName,
作者author,
价格price;
方法包括:
相应属性的get/set方法,
图书信息介绍等。
package com.method_more;/*** package:com.method_more** @Author jimmy-yan* @Create 2024/10/15 18:40*/
public class BookTest {public static void main(String[] args) {Book book = new Book();book.setPrice(10);System.out.println(book.getPrice());}
}class Book {String bookName;double price;public void setPrice(double p) {price = p;}public double getPrice() {return price;}
}
三、构造器
作用:搭配new关键字,创建类的对象;在创建对象的同时可以给对象的相关属性赋值。
1 构造器的使用说明
a、构造器声明格式:
权限修饰符 类名(形参列表){}
b、创建类以后,在没有显示提供任何构造器的情况下,会默认提供一个空参构造器,且构造器的权限与类声明的权限相同。
package com.constructior.exer1;/*** package:com.constructior.exer1.exer1** @Author jimmy-yan* @Create 2024/10/15 19:02*/
public class Person {//属性String name;int age;//构造器public Person(){}public void eat(){System.out.println("吃饭呢");}public void sleep(int hour){System.out.println("睡觉+"+hour+"小时");}
}
package com.constructior.exer1;/*** package:com.constructior.exer1** @Author jimmy-yan* @Create 2024/10/15 19:10*/
public class PersonTest {public static void main(String[] args) {Person p = new Person();p.eat();}
}
c、一旦类中声明了构造器,则系统不再提供默认的空参构造器


d、一个类中可以声明多个构造器,彼此之间构成重载

2 案例:
(1)定义Student类,有4个属性:
String name;
int age;
String school;
String major;
(2)定义Student类的3个构造器:
第一个构造器Student(String n,int a)设置类的name和age属性;
第二个构造器Student(String n,int a,String s)设置类的name, age 和school属性;
第三个构造器Student(String n,int a,String s,String m)设置类的name,age ,school和major属性;
(3)在main方法中分别调用不同的构造器创建的对象,并输出其属性值。
package com.constructior.exer1.exer2;/*** package:com.constructior.exer1.exer2** @Author jimmy-yan* @Create 2024/10/15 19:25*/
public class Student {//属性String name;int age;String school;String major;public Student(String n, int a) {name = n;age = a;}public Student(String n, int a, String s) {name = n;age = a;school = s;}public Student(String n, int a, String s, String m) {name = n;age = a;school = s;major = m;}
}
package com.constructior.exer1.exer2;/*** package:com.constructior.exer1.exer2** @Author jimmy-yan* @Create 2024/10/15 19:30*/
public class StudentTest {public static void main(String[] args) {Student s1 = new Student("kobe", 18);Student s2 = new Student("kobe", 18, "清华");Student s3 = new Student("kobe", 18, "清华", "tester");}
}
四、实例变量赋值过程
1 在类的属性中,可以有哪些位置给属性赋值?
a、默认初始化;
b、显示初始化;
c、构造器初始化;
d、通过对象.方法的方法赋值;
e、通过对象.属性赋值;
2 JavaBean
所谓JavaBean,是指符合如下标准的Java类:
- 类是公共的
- 有一个无参的公共的构造器
- 有属性,且有对应的get、set方法
五、随堂复习与企业真题
1、面向对象与面向过程
2、类、对象
- 类:抽象的,概念上的定义
- 对象:具体的,类的一个一个的实例。
- 面向对象完成具体功能的操作的三步流程(非常重要)
步骤1:创建类,并设计类的内部成员(属性、方法)
步骤2:创建类的对象。比如:Phone p1=new Phone();
步骤3:通过对象,调用其内部声明的属性或方法,完成相关的功能
3、Java中内存结构划分
- 栈、堆、方法区
- 栈:以栈帧为基本单位,有入栈和出栈操作;每个栈帧入栈操作对应一个方法的执行;方法内的局部变量会存储在栈帧中。
- 堆:new出来的结构(数组、对象):1、数组的元素在堆中,对象的成员变量在堆中。
- 方法区:加载的类的模板结构
4、类的成员之一:属性(成员变量)
属性与成员变量的对比:
- 声明的位置不同
- 内存中存放的位置不同
- 作用域不同
- 权限修饰符不同
- 初始化值不同
- 生命周期不同
5、类的成员之二:方法
方法的声明:权限修饰符 返回值类型 方法名(形参列表){方法体}
- 返回值类型
- 形参列表
6、方法的重载
两同一不同:同一个类,方法名相同;形参列表不同;
7、可变个数形参的方法
格式:(int … args)
8、方法的参数传递机制
- 如果形参是基本数据类型的变量,则将实参保存的数据值赋给形参
如果形参是引用数据类型的变量,则将实参保存的地址值赋给形参
9、对象数组
String[];Person[];
10、package、import
11、面向对象之:封装性
- java规定了4种权限修饰,分别是:private、缺省、protected、public
- 我们可以使用4种权限修饰符来修饰类及类内部的成员。当这些成员被调用时,体现可见性的大小。
- 举例:
场景1:private:提供公共的get、set方法,对此属性进行获取和修改
场景2:将类中不需要对外暴露的方法,设置为private
场景3:单例模式中构造器private,避免在类的外部创建实例
- 高内聚:java程序通常以类的形态呈现,相关的功能封装到方法中。
- 低耦合:给相关的类、方法设置权限,把该隐藏的隐藏起来,该暴露的暴露出去。
12、类的成员之三:构造器
- 如何定义:权限修饰符 类名(形参列表){}
- 构造器的作用:1、搭配new,用来创建对象;2、初始化对象的成员变量
相关文章:
Java面向对象编程基础(二)
Java面向对象编程基础二 一、package与import关键字的使用1.说明2.包的作用3.JDK中主要的包4. import5.import关键字的使用 二、封装性1.为什么要封装?2.如何封装?3.作用4.权限修饰符的权限大小5.案例 三、构造器1 构造器的使用说明2 案例: 四、实例变量赋值过程1 …...
[PHP]重复的Notice错误信息
<?php $a []; var_dump($a[name]);执行结果: 原因: display_errors和error_reporting都打开了Notice错误信息...
2024年第四届“网鼎杯”网络安全大赛-赛前模拟训练
文章目录 网络安全(WEB)签到题WEB01WEB02 二进制漏洞安全(PWN)PWN01潜在的安全漏洞分析攻击步骤exp 逆向工程(REVERSE)REVERSE01代码分析重构密码 密码学(CRYPTO)CRYPTO01CRYPTO02 杂…...
AI金融攻防赛:YOLO理论学习及赛题进阶思路(DataWhale组队学习)
引言 大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的AI金融攻防赛学习总结文档。本文主要讲解如何在金融场景凭证篡改检测中应用YOLO算法。我们将从模型概述、数据准备、训练流程以及模…...
Spring Security 基础配置详解(附Demo)
目录 前言1. 基本知识2. Demo3. 实战 前言 基本的Java知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新) 1. 基本知识 HttpSecurity 是 Spri…...
代码随想录打卡Day1
文章目录 day011 数组理论基础2 二分查找法3 移除元素4 平方数 day01 Java JDK是17.0.11 1 数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合。 数组下标都是从0开始的。 数组内存空间的地址是连续的。 因为数组在内存空间的地址是连续的,所以我们…...
Vue快速创建工程+Element Plus
创建Vue工程 执行命令 npm init vuelatest 执行这两个绿色的命令 执行这个命令启动 npm run dev Element 打开网站https://element-plus.org/zh-CN/ npm install element-plus --save 然后在vscode中打开你的项目工程 // main.ts import { createApp } from vue import Ele…...
汽车管理系统——主界面制作
目录 主界面需要有什么?然后要做什么?添加两个主菜单(声明)下一步应该干什么?能够跳转到文件有哪几个动作?动作如何声明?为什么用选择声明指针,不选择直接声明这个对象? …...
C++ 右值引用深入理解:特性、优化与底层
目录 一、左右值的概念及右值的种类 二、左值引用与右值引用 左值引用给右值取别名: 右值引用给左值取别名: 三、引用的意义及左值引用的场景 四、移动构造: 右值引用在底层里的实现: 一、左右值的概念及右值的种类 在 C …...
C# 文件操作
文章目录 文件系统FileInfo和DirectoryInfo类完成一个文件的拷贝判断一个文件是否存在FileInfo和DirectoryInfo的属性列表FileInfo和DirectoryInfo的方法列表读写文件文件系统 下面的类用于浏览文件系统和执行操作,比如移动,复制和删除文件。 System.MarshalByRefObject 这个…...
FFmpeg 4.3 音视频-多路H265监控录放C++开发三 :安装QT5.14.2, 并将QT集成 到 VS2019中。
一,安装QT, 重点:在安装QT的时候要安装msvc201x版本的组件, 二 , 安装 qt-vs-tools Index of /development_releases/vsaddin/2.8.1 三,需要安装过 windows10 SDK,一般我们在安装vs2019的时候就…...
Linux 累加计算递归算法汇编实现
1...n可以使用公式计算,同时也是递归实现的很好例子,其c实现代码为 int f(int i) {i && (if(i-1));return i; } 其终止条件为0,此时i && (if(i-1))表达式不成立,不计算if(i-1)直接返回0&…...
明日周刊-第23期
十月已过半,气温也转凉了,大家注意保温哦。冬吃萝卜,夏吃姜,在快要到来的冬季大家可以选择多吃点萝卜。 配图是本周末去商场抓娃娃的时候拍的照片,现在抓娃娃单次普遍都控制在1块钱以下了,还记得多年前的抓…...
kubernets(二)
集群操作 查看集群信息 kubectl get查看各组件信息 格式:kubectl get 资源类型 【资源名】 【选项】 events #查看集群中的所有日志信息 -o wide # 显示资源详细信息,包括节点、地址... -o yaml/json #将当前资源对象输出至 yaml/json 格式文…...
《YOLO 标注工具全览》
《YOLO 标注工具全览》 一、YOLO 标注工具的重要性二、常见的 YOLO 标注工具介绍(一)LabelImg(二)Yolo_Label(三)在线标注工具 Make Sense(四)Ybat - YOLO BBox Annotation Tool&…...
财富思维学习
四大象限: 人类财富创造史经历的五个阶段: 1、黄色(土地)财务阶段:拥有土地和劳动力是财富的要求 2、蓝色(海)财富阶段:谁拥有贸易的通道谁就拥有财富(如港口ÿ…...
python爬虫加解密分析及实现
第一种: 1、找到加密的接口地址,通过加密的接口地址全局搜索 2、通过打断点的方式,操作页面,跑到断点处时,即可找到加密串,如图二; 3、找到用的是哪种加密方式,如: cr…...
用Java做智能客服,基于私有知识库
构建Java智能客服系统的整体思路 使用Java构建智能客服系统的整体思路是: 首先将客服QA文档以Word形式导入到系统中,通过向量化处理存入知识库。 当用户提出问题时,系统会根据问题内容从知识库中检索相关的上下文信息,并结合大…...
软考(网工)——网络安全
文章目录 🕐网络安全基础1️⃣网络安全威胁类型2️⃣网络攻击类型 🕑现代加密技术1️⃣私钥密码/对称密码体制2️⃣对称加密算法总结3️⃣公钥密码/非对称密码4️⃣混合密码5️⃣国产加密算法 - SM 系列6️⃣认证7️⃣基于公钥的认证 🕒Hash …...
如何给手机换ip地址
在当今数字化时代,IP地址作为设备在网络中的唯一标识,扮演着举足轻重的角色。然而,有时出于隐私保护、网络访问需求或其他特定原因,我们可能需要更改手机的IP地址。本文将详细介绍几种实用的方法,帮助您轻松实现手机IP…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
