Java面向对象与封装

news2024/9/22 15:46:14

目录

封装

封装引入

private修饰符

this关键字

构造函数

JavaBean

标准JavaBean

JavaBean中的成员与数据库的关系

static关键字

static基本使用

static关键字访问特点

可变参数

对象数组与传值/址调用

对象数组

传值调用与传址调用

命令行参数


封装

封装引入

面向对象三大特性:封装、继承和多态

在Java中,封装是将一类事物的属性和方法放到一个class类中,例如Person类

 package com.epsda.java_class;
 ​
 public class Person {
     // 属性
     String name;
     int age;
     Birthday birthday;
 ​
     // 方法
     public void print(){
         System.out.println("name = " + name + " " + "age = " + age + " " + "birthday: " + birthday.year + "/" + birthday.month + "/" + birthday.day);
     }
 }

但是Person类中的成员此时可以被随意访问和修改,为了防止这种问题,从而出现了访问修饰符private

private修饰符

使用private修饰符修饰的成员无法在类外被访问

package com.epsda.java_private;
 ​
 public class Person {
     // 被priavte修饰后无法在类外访问
     private int age;
     private String name;
 ​
 }
 ​
 package com.epsda.java_private;
 ​
 public class java_private {
     public static void main(String[] args) {
         Person person = new Person();
         // 被priavte修饰后无法在类外访问
         // person.age = 10;
         // person.name = "张三";
 ​
     }
 }

但是封装之后需要对外提供使用的接口,在Java中称为getset方法

this关键字

当方法的局部变量和成员变量重名时,可以使用this关键字指代成员变量,防止出现重名时的访问均为局部变量

this关键字指代的是调用对象,其地址和对象地址相同

package com.epsda.java_private;
 ​
 public class Person {
     // 展示this和对象地址
     public void showThis(){
         System.out.println(this);
     }
 }
 ​
 package com.epsda.java_private;
 ​
 public class java_private {
     public static void main(String[] args) {
         Person person2 = new Person();
         System.out.println(person2);
         person2.showThis();
     }
 }
 ​
 输出结果:
 com.epsda.java_private.Person@154617c
 com.epsda.java_private.Person@154617c

结合get/set方法,this关键字的使用

package com.epsda.java_private;
 ​
 public class Person {
     // 被priavte修饰后无法在类外访问
     private int age;
     private String name;
 ​
     // 提供get和set方法
     public int getAge() {
         return age;
     }
 ​
     public void setAge(int age) {
         this.age = age;
     }
 ​
     public String getName() {
         return name;
     }
 ​
     public void setName(String name) {
         this.name = name;
     }
 }

构造函数

Java中创建对象时需要使用new,而new后面的实际上是在调用构造函数构造对象,如果类没有显式写构造函数,那么JVM会隐式生成一个无参数的构造函数,但是如果显式写了构造函数(包括无参数和有参数),那么编译器就不会再生成

 package com.epsda.java_private;
 ​
 public class Person {
     // 被priavte修饰后无法在类外访问
     private int age;
     private String name;
 ​
     // 构造函数
     // 无参数构造
     public Person() {
     }
 ​
     // 有参数构造
     public Person(int age, String name) {
         this.age = age;
         this.name = name;
     }
 }

当无参数构造函数和有参数构造函数共存时,此时出现方法重载现象,如果创建对象不传入参数,则调用无参数构造函数,否则调用有参数构造函数

package com.epsda.java_private;
 ​
 ​
 /**
  * ClassName: java_private
  * Package: com.epsda.java_private
  * Description:
  *
  * @author 憨八嘎
  * @version v1.0
  */
 public class java_private {
     public static void main(String[] args) {
         // 调用无参数构造函数
         Person person = new Person();
         // 通过get方法获取属性值
         System.out.println(person.getName() + " " + person.getAge());
         // 通过set方法设定属性值
         person.setAge(10);
         person.setName("李四");
         System.out.println(person.getName() + " " + person.getAge());
 ​
         // 调用有参数构造函数
         Person person1 = new Person(10, "张三");
         // 通过get函数获取属性值
         System.out.println(person1.getName() + " " + person1.getAge());
     }
 }
 ​
 输出结果:
 null 0
 李四 10
 张三 10
 ​

JavaBean

标准JavaBean

JavaBean是Java语言编写类的一种标准规范。符合JavaBean 的类,要求:

  1. 类必须是具体的(非抽象 abstract)和公共的,public class 类名

  2. 并且具有无参数的构造方法,有参构造

  3. 成员变量私有化,并提供用来操作成员变量的setget 方法。

在Java项目中,一般有以下包及对应的功能

  1. com.epsda.controller -> 专门放和页面打交道的类(表现层)

  2. com.epsda.service -> 专门放业务处理的类 (业务层)

  3. com.epsda.dao -> 专门放和数据库打交道的类(持久层)

  4. com.epsda.pojo -> 专门放JavaBean类

  5. com.epsda.utils -> 专门放工具类

对于上方的Person类来说,即为一个标准的JavaBean结构

 package com.epsda.java_private;
 ​
 /**
  * ClassName: Person
  * Package: com.epsda.java_private
  * Description:
  *
  * @author 憨八嘎
  * @version v1.0
  */
 public class Person {
     // 被priavte修饰后无法在类外访问
     private int age;
     private String name;
 ​
     // 构造函数
     // 无参数构造
     public Person() {
     }
 ​
     // 有参数构造
     public Person(int age, String name) {
         this.age = age;
         this.name = name;
     }
 ​
     // 提供get和set方法
     public int getAge() {
         return age;
     }
 ​
     public void setAge(int age) {
         this.age = age;
     }
 ​
     public String getName() {
         return name;
     }
 ​
     public void setName(String name) {
         this.name = name;
     }
 }

JavaBean中的成员与数据库的关系

  1. 类名 -> 表名

  2. 属性名 -> 列名

  3. 对象 -> 表中每一行数据

  4. 属性值 -> 表中单元格中的数据

对于Person类来说,Person表结构如下

nameage
张三10
李四10

static关键字

static基本使用

当一个成员是多个对象共享时,可以使用static关键字对该成员进行修饰

static修饰的成员可以直接使用类名调用

定义一个Student类,教室学生共用,所以可以设置为static,其他为每一个对象特有的则可以不设置为static

 package com.epsda.java_static;
 ​
 /**
  * ClassName: Student
  * Package: com.epsda.java_static
  * Description:
  *
  * @author 憨八嘎
  * @version 1.0
  */
 public class Student {
     // 学生特有属性
     private String name;
     private int age;
     // 学生共有属性
     private static int classroom;
 ​
     public Student() {
     }
 ​
     public Student(String name, int age) {
         this.name = name;
         this.age = age;
     }
 ​
     public String getName() {
         return name;
     }
 ​
     public void setName(String name) {
         this.name = name;
     }
 ​
     public int getAge() {
         return age;
     }
 ​
     public void setAge(int age) {
         this.age = age;
     }
 ​
     public static int getClassroom() {
         return classroom;
     }
 ​
     public static void setClassroom(int classroom) {
         Student.classroom = classroom;
     }
 ​
     public void print() {
         System.out.println(name + " " + age + " " + classroom);
     }
 }

测试类

package com.epsda.java_static;
 ​
 /**
  * ClassName: java_static
  * Package: com.epsda.java_static
  * Description:
  *
  * @author 憨八嘎
  * @version 1.0
  */
 public class java_static {
     public static void main(String[] args) {
         Student student1 = new Student("张三", 18);
         Student student2 = new Student("李四", 20);
         // 两个学生在一个班级时,直接用类名调用,而不是每一个单独设置
         Student.setClassroom(112);
 ​
         student1.print();
         student2.print();
     }
 }
 ​
 输出结果:
 张三 18 112
 李四 20 112

static关键字访问特点

static关键字修饰的成员(成员变量和成员函数)与类同时加载到内存,所以会早于普通的成员变量,并且加载到内存堆区的静态域中,所以,在调用时需要注意下面的情况:

  1. 非静态成员可以访问静态成员

    package com.epsda.java_static;
     ​
     /**
      * ClassName: java_static
      * Package: com.epsda.java_static
      * Description:
      *
      * @author 憨八嘎
      * @version 1.0
      */
     public class java_static {
         public static void main(String[] args) {
         }
     ​
         // 非静态成员
         public void func1() {
             // 非静态成员可以直接访问静态成员
             func2();
         }
     ​
         // 静态成员
         public static void func2(){
     ​
         }
     }
  2. 静态成员不可以访问非静态成员,除非创建对象,因为对象创建后,非静态成员也被创建了

    package com.epsda.java_static;
     ​
     /**
      * ClassName: java_static
      * Package: com.epsda.java_static
      * Description:
      *
      * @author 憨八嘎
      * @version 1.0
      */
     public class java_static {
         public static void main(String[] args) {
             // func1(); 非静态成员不可以被静态成员直接调用
             java_static js = new java_static();
             js.func1();// 但是可以通过对象调用
         }
     ​
         // 非静态成员
         public void func1() {
     ​
         }
     }
  3. 非静态成员可以访问非静态成员,静态成员可以访问静态成员

static成员在开发中一般可以指定一个工具类,工具类是指该类中是某一种对象的常见方法,该方法被修饰为static,便于使用类名直接调用。特殊地,工具类的构造方法全是private修饰

可变参数

在Java中,如果不确定函数参数的具体个数,可以使用可变参数进行代替,声明可变参数的方式如下

 数据类型...变量名

例如,求出n个整数相加之和

 package com.epsda.multiple_variables;
 ​
 /**
  * ClassName: Multi_variables
  * Package: com.epsda.multiple_variables
  * Description:
  *
  * @author 憨八嘎
  * @version 1.0
  */
 public class Multi_variables {
     public static void main(String[] args) {
         int ans1 = sum(1,2,3);
         int ans2 = sum(1,2,3,4);
         int ans3 = sum(1,2,3,4,5);
         System.out.println("ans1 = " + ans1);
         System.out.println("ans2 = " + ans2);
         System.out.println("ans3 = " + ans3);
     }
 ​
     public static int sum(int...arr) {
         int ans = 0;
         for (int i = 0; i < arr.length; i++) {
             ans += arr[i];
         }
         return ans;
     }
 }
 ​
 输出结果:
 ans1 = 6
 ans2 = 10
 ans3 = 15

在Java中,可变参数实际上是一个数组类型,所以可以使用数组的方式进行遍历

一个形参位置只能有一个可变参数,并且如果有其他参数时,可变参数必须放在最后一个参数的位置

package com.epsda.multiple_variables;
 ​
 /**
  * ClassName: Multi_variables
  * Package: com.epsda.multiple_variables
  * Description:
  *
  * @author 憨八嘎
  * @version 1.0
  */
 public class Multi_variables {
     public static void main(String[] args) {
         // 第一个实参给函数的一个形参,剩下的全给可变参数
         String ans = concat("-", "字符串1", "字符串2");
         System.out.println("ans = " + ans);
     }
     
     // 多个参数,可变参数放在最后
     public static String concat(String regex, String... arr) {
         String ans = "";
         for (int i = 0; i < arr.length; i++) {
             if (i == arr.length - 1) {
                 ans += arr[i];
             } else {
                 ans += arr[i] + regex;
             }
         }
 ​
         return ans;
     }
 }
 ​
 输出结果:
 ans = 字符串1-字符串2

对象数组与传值/址调用

对象数组

所谓对象数组,即数组中的元素是对象

package com.epsda.array;
 ​
 /**
  * ClassName: object_array
  * Package: com.epsda.array
  * Description:
  *
  * @author 憨八嘎
  * @version 1.0
  */
 public class object_array {
     public static void main(String[] args) {
         // 创建对象数组
         Person arr[] = new Person[3];
         // 创建对象并存入数组中
         for (int i = 0; i < arr.length; i++) {
             // 数组中的每一个元素都是Person的匿名对象
             arr[i] = new Person(18,"姓名");
             System.out.println(arr[i].getName()+" "+arr[i].getAge());
         }
     }
 }

传值调用与传址调用

在Java中,基本数据类型实参传递给方法的形参时只是传值调用,但是对于引用类型来说,传递给方法形参的实参都是地址,所以是传址调用

package com.epsda.call;
 ​
 /**
  * ClassName: Call
  * Package: com.epsda.call
  * Description:
  *
  * @author 憨八嘎
  * @version 1.0
  */
 public class Call {
     public static void main(String[] args) {
         // 基本数据类型
         int a = 10;
         int b = 20;
         sum(a, b);
         System.out.println("a = " + a);// 方法内修改不影响main函数中的a和b,传值调用
         System.out.println("b = " + b);
         System.out.println("---------------------------");
         // 引用数据类型
         int arr[] = {2, 3, 4, 5};
         change(arr, arr1);// 方法内的修改影响main函数中的引用类型
         for (int i = 0; i < arr.length; i++) {
             System.out.print(arr[i] + " ");
         }
     }
 ​
     // 传值调用
     public static void sum(int a, int b) {
         a = 20;
         b = 40;
         System.out.println("a = " + a);
         System.out.println("b = " + b);
     }
 ​
     // 传址调用
     public static void change(int[] arr, String arr1) {
         for (int i = 0; i < arr.length; i++) {
             arr[i] = i;
             System.out.print(arr[i] + " ");
         }
         System.out.println();
     }
 }
 ​
 输出结果:
 a = 20
 b = 40
 a = 10
 b = 20
 ---------------------------
 0 1 2 3
 0 1 2 3 

需要注意的是String类型引用,在Java中,字符串是不可改变的量,所以如果在方法内尝试对实参的String类型值进行改变并不会影响实参。每一个字符串都有对应的地址,当指向字符串的实参传入方法中,在方法内改变该实参对应的形参内容只是改变形参指向的地址值,并不会改变实参指向的地址值,本质这里还是传值调用,例如:


 package com.epsda.call;
 ​
 /**
  * ClassName: Call
  * Package: com.epsda.call
  * Description:
  *
  * @author 憨八嘎
  * @version 1.0
  */
 public class Call {
     public static void main(String[] args) {
         String arr1 = "字符串";
         change(arr1);// 方法内的修改不影响main函数arr1
         System.out.print(arr1);
     }
     public static void change(String arr1) {
         arr1 = "修改字符串";
         System.out.print(arr1);
         System.out.println();
     }
 }
 ​
 输出结果:
 修改字符串
 字符串

命令行参数

Java中的main方法有一个形参String[] args,当需要临时测试方法时,可以通过这个形参传递值

 public class CommandParam{
     public static void main(String[] args){
         for(int i = 0; i < args.length; i++){
             System.out.println("第" + (i+1) + "个参数的值是:" + args[i]);
         }
     }
 }

在命令行中输入命令:

 javac CommandParam.java
 java CommandParam 字符串1 字符串2

此时即可输出下面的内容:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2037044.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity 中创建动画的教程

Unity 动画创建教程 在游戏开发中&#xff0c;生动的动画能够极大地提升玩家的体验。在这篇教程中&#xff0c;我们将一起探索如何在 Unity 中创建动画。 一、准备工作 首先&#xff0c;确保您已经安装了最新版本的 Unity 引擎。创建一个新的 Unity 项目或者打开您现有的项目…

昂科烧录器支持PAI-IC澎湃微电子的32位微控制器PT32L031K6T6

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中PAI-IC澎湃微电子的32位微控制器PT32L031K6T6已经被昂科的通用烧录平台AP8000所支持。 PT32L031K6T6是基于Cortex-M0内核的一款32位高性能微控制器&#xff0c;支持工作电压 1…

C# VisionPro 海康相机SDK源代码

运行界面如下所时&#xff1a; 实时图像效果如下&#xff1a; Winform窗体代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Fo…

为什么选择搭建自己的大模型?

在数字化和智能化的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;正迅速成为企业和机构的核心驱动力。无论是在数据分析、自然语言处理&#xff0c;还是自动化决策&#xff0c;AI的应用范围广泛且深远。而在众多AI解决方案中&#xff0c;本地搭建专属的大模型正逐渐成…

前端vue项目——打包部署(nginx中部署静态资源)

1、当前的开发方式 前端人员开发前端&#xff0c;后端人员开发后端的java工程&#xff0c;最终要将开发完毕的前端工程和后端工程分开部署在对应的服务器上&#xff08;前端流行的nginx&#xff09; 2、打包 &#xff08;1&#xff09;原理 &#xff08;2&#xff09; &#xf…

git 两个分支对比以及合并

git 两个分支对比以及合并 git 两个分支对比以及合并显示两个分支提示之间的差异使用图形化工具&#xff0c;如pycharm 打补丁的一般流程diff命令&#xff1a;生成补丁包文件patch命令&#xff1a;打补丁命令 Git Merge 与 Rebase[重要]使用 merge 命令来进行分支合并rebase 命…

使用 GPT-4 Vision 的 CLIP 嵌入来改进多模态 RAG

多模态 RAG 将附加模态集成到传统的基于文本的 RAG 中&#xff0c;通过提供额外的背景信息和基础文本数据来增强 LLM 的问答能力&#xff0c;从而提高理解力。 我们直接嵌入图像进行相似性搜索&#xff0c;绕过文本字幕的有损过程&#xff0c;以提高检索准确性。 使用基于 CL…

Ted靶机

端口扫描 靶机ip地址为 192.168.153.156 目录扫描 访问80端口 测试弱口令 根据响应包分析&#xff0c;存在弱口令 admin&#xff0c;admin 但是需要hash加密 加密后得到 8C6976E5B5410415BDE908BD4DEE15DFB167A9C873FC4BB8A81F6F2AB448A918 登录成功 有搜素框&#xff0c;测…

网站数据导出为excel 源码大全java php c# js python 与网络安全兼顾-阿雪技术观

一、阿雪技术观谈网站安全 1.保护用户隐私和数据 用户在访问网站时会提供各种个人信息&#xff0c;如姓名、地址、联系方式、信息等。如果网站存在安全漏洞&#xff0c;这些敏感信息可能会被黑客窃取&#xff0c;导致用户遭受身份盗窃、欺诈等 2.维护企业声誉和信任 一个安全可…

【Windows】Q-Dir(资源管理器)软件介绍

软件介绍 Q-Dir是一款免费的文件管理器软件&#xff0c;它可以让您更方便地浏览和管理计算机上的文件和文件夹。与Windows自带的资源管理器相比&#xff0c;Q-Dir具有更多的功能和选项。 安装教程 软件下载完成&#xff0c;解压软件。 点击Q-Dir.exe即可打开软件。 功能…

WPF WindowChrome、WindowStyle 自定义窗体样式

渐变参数 WindowChrome 这个图就是WindowChrome的模型。其中Caption区域&#xff0c;表示标题栏&#xff0c;就是它&#xff0c;允许窗体被鼠标拖动。GlassFrameThickness就是Aero窗体的透明边框&#xff08;Aero主体只在部分操作系统中支持&#xff09;。ResizeBorderThicknes…

从快到慢学习Git指令

Git是现在最流行的版本控制工具之一。无论是在开源社区还是企业软件开发中,Git都扮演着至关重要的角色。本文将根据不同的需求,分别提供快速上手和深入学习Git的指南。 如果你只想下载代码 如果你只是想下载GitHub或其他代码仓库的代码,那你只需要了解以下两个命令: git clo…

SpringBoot 整合 Elasticsearch 实现商品搜索

一、Spring Data Elasticsearch Spring Data Elasticsearch 简介 Spring Data Elasticsearch是Spring提供的一种以Spring Data风格来操作数据存储的方式&#xff0c;它可以避免编写大量的样板代码。 常用注解 常用注解说明如下&#xff1a; 注解名称 作用 参数说明 Docu…

Python面试宝典第34题:旋转图像

题目 给定一个n n的二维矩阵matrix表示一个图像&#xff0c;请你将图像顺时针旋转90度。 注意&#xff1a;你必须在原地旋转图像。这意味着&#xff0c;你需要直接修改输入的二维矩阵&#xff0c;而不能使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matri…

Spark SQL Catalyst工作流程

我们写的SQL语句&#xff0c;会经过一个优化器 (Catalyst)&#xff0c;转化为 RDD&#xff0c;交给集群执行。 而Catalyst在整个Spark 生态中的地位也是至关重要的。 SQL到RDD中间经过了一个Catalyst&#xff0c;它就是Spark SQL的核心&#xff0c;是针对Spark SQL语句执行过程…

【计算机网络】LVS四层负载均衡器

https://mobian.blog.csdn.net/article/details/141093263 https://blog.csdn.net/weixin_42175752/article/details/139966198 《高并发的哲学原理》 &#xff08;基本来自本书&#xff09; 《亿级流量系统架构设计与实战》 LVS 章文嵩博士创造 LVS(IPVS&#xff09; 章⽂嵩发…

Agile Modbus移植教程--基于GD32F103C8T6+RT-Thread+mdk5

主机移植 0.下载源码 开源地址:GitHub - loogg/agile_modbus 1.复制源码 1.2、目录结构 名称说明doc文档examples例子参考示例figures素材inc头文件移植需要src源代码移植需要util提供简单实用的组件移植需要 本次移植需要的有 参考demo 头文件 源码 从机辅助文件 2.添…

【中等】 猿人学web第一届 第5题 js混淆-乱码增强

请求流程 打开 调试工具&#xff0c;查看数据接口 https://match.yuanrenxue.cn/api/match/5 请求参数 请求参数携带了 page, m, f 3个字段&#xff0c; page为页数&#xff0c; m 为时间戳 像是 new Date().getTIme() 生成的 f 为时间戳 像是 Date.parse(new Date()) 生成的 …

Spring boot敏感参数加密配置

一&#xff0c;背景 在项目中很多参数会被配置到配置文件中&#xff0c;比如说密钥&#xff0c;用户名&#xff0c;数据库连接&#xff0c;账号密码之类的&#xff0c;如果用明文配置&#xff0c;会有一定的安全风险。为了减小风险&#xff0c;增加对敏感配置数据的加密配置。…

Gerrit 使用教程

一、Gerrit简介 Gerrit&#xff0c;一种开放源代码的代码审查软件&#xff0c;使用网页界面。利用网页浏览器&#xff0c;同一个团队的程序员&#xff0c;可以相互审阅彼此修改后的代码&#xff0c;决定是否能够提交&#xff0c;退回或是继续修改。它使用版本控制系统Git作为底…