Java面对对象三大特性之封装】

news2024/12/23 17:19:56

目录

  • 1.封装
  • 2. 访问权限
    • 2.1 public权限
    • 2.2private权限
    • 2.3 默认权限
  • 3.包的定义
  • 4. static成员
  • 5.静态成员初始化
  • 6.对象的打印

1.封装

封装:就是将数据和操作数据的方法进行结合,隐藏对象的属性和方法,仅对外实现一些接口和对象进行交互
其实就是:将类的实现细节(属性和方法)进行隐藏,对外只提供一些交互的接口

2. 访问权限

在Java中定义了四种权限修饰符,来控制方法或者属性能否直接在类外使用。

访问修饰限定符 =》权限

我们的四种权限修饰符:
private 《》 默认权限 《》protected 《》 public

在这里插入图片描述

2.1 public权限

public是四种权限修饰符里面范围最大的一个,无论是否在同一个包或者是否在同一类中,public修饰的,始终都能被访问。
就好比人的外貌,任何一个人都能看见

class student{
    public String name;
    public int age;

    public student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void show()
    {
        System.out.println("name:"+name+" "+"age:"+age);
    }
}
public class Test5 {
    public static void main(String[] args) {
        student student=new student("zhangsan",20);
        student.name="lisi";
        student.age=21;

    }
}

我们可以在主类中,随意的修改student类中的,属性

2.2private权限

private权限只能在本类中使用,在其他类和包中不能够使用。

当我们使用private修饰name变量的时候,我们在主类中就不能修改变量了。
相要修改的话,就需要在类中构建getname和setname来获取和修改。

在这里插入图片描述
在这里插入图片描述

class student{
    private String name;
    public int age;

    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 void show()
    {
        System.out.println("name:"+name+" "+"age:"+age);
    }
}
public class Test5 {
    public static void main(String[] args) {
        student student=new student("zhangsan",20);
        student.setName("lisi");
        student.getName();
        student.age=21;

    }
}

2.3 默认权限

默认权限就是我们在定义变量的时候,前面什么也不写,没有任何的修饰符。
在同一个包的不同类,或者同一个包的同一个类 中都可以,

 String name;
class Student1{
    String name;
    public int age;

    public Student1(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void show()
    {
        System.out.println("name:"+name+" "+"age:"+age);
    }
}
public class Test5 {
    public static void main(String[] args) {
        Student1 student1=new Student1("lisi",20);

        student1.show();

    }
}

3.包的定义

包的概念:为了更好地管理类,把多个类放在一起成为一组,称为软件包。

在Java中也引入了包,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。

Java中提供了很多现成的类,比如Scanner Data可以使用Java.util.Data
因此我们就会自动导入这些包,比如

可以使用 import语句导入包

在这里插入图片描述

此外我们还会简单的写成,以下格式

import java.util.*;
import java.sql.*

但是这个样子就会有问题,如果一个类中有两个包,那么这么写的话我们不知道该用的是哪一个。
所以我们更推荐第一种写发

另外可以使用import static导入包中静态的方法和字段。

import static java.lang.Math.*;
public class Test {
public static void main(String[] args) {
double x = 30;
double y = 40;
// 静态导入的方式写起来更方便一些.
// double result = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
double result = sqrt(pow(x, 2) + pow(y, 2));
System.out.println(result);
}
}

常见的包

  1. java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入。
  2. java.lang.reflect:java 反射编程包;
  3. java.net:进行网络编程开发包。
  4. java.sql:进行数据库开发的支持包。
  5. java.util:是java提供的工具程序包。(集合类等) 非常重要
  6. java.io:I/O编程开发包。

4. static成员

成员变量分为:
1.静态成员变量/类变量/类成员
2.非静态成员变量/普通成员变量

静态的不依赖对象,不属于对象,所以不需要通过对象的引用就可以来直接访问。

我们定义了一个,静态的变量day,在主函数中我们没有实例化对象,直接通过类名来访问。

import javax.xml.crypto.Data;
import java.util.Arrays;
import java.util.Scanner;
class Classmate
{
    public String name;
    public  int age;
    public  static int day=10;

    public Classmate(String name, int age ,int day) {
        this.name = name;
        this.age = age;
    }

    public void  show()
    {
        System.out.println("name:"+name+"age:"+age);
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println(Classmate.day);
    }
}

成员方法:
1.静态成员方法/类方法
2.非静态成员方法

这里有三点是需要大家务必记住的。

1.在静态方法内部,不能直接调用非静态成员方法
如果调用的话会直接报错的。

在这里插入图片描述

2.在静态方法内部,不能直接调用非静态的数据成员,要想调用的话需要通过对象的引用来调用。

在这里插入图片描述

3.静态方法内部不能使用this关键字

在这里插入图片描述

对于这种获取静态成员变量或者设置静态成员变量,此时的方法最好是静态的,如果不是静态的你就还要实例化对象,没有意义。
在这里插入图片描述

5.静态成员初始化

1.直接赋值,在定义的时候就是直接给变量赋值

public  static int day=10;

2.默认初始化
当我们在定义的时候,不给赋值,那么就会自动进行默认赋值。

public  static int day;

3.通过get和set方法进行初始化

public static int getDay() {
        return day;
    }

    public static void setDay(int day) {
        Classmate.day = day;
    }

4.在构造对象的时候,在构造方法中进行赋值
但是这个一般不常用(甚至就不用),所以这里就不讲解了。

5.通过代码块进行赋值

1.普通代码块
2.构造代码块/非静态代码块/实例代码块
3.静态块
4.同步代码块

普通代码块:就是在方法的内部,使用的比较少

 public void show()
    {
        System.out.println("name:"+name+" "+"age:"+age);
        {
            System.out.println("普通代码块");
        }
        {
            int x=10;
            System.out.println(x);
        }
    }

在这里插入图片描述

构造代码块/非静态代码块/实例代码块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。



class Student1{
    String name;
    public int age;

    public Student1() {
        System.out.println("构造方法");
    }

    {
        this.name="lisi";
        this.age=10;
        System.out.println("构造代码块");
    }
    public void show()
    {
        System.out.println("name:"+name+" "+"age:"+age);
        {
            System.out.println("普通代码块");
        }

    }
}
public class Test5 {
    public static void main(String[] args) {
        Student1 student1=new Student1();

        student1.show();

    }
}

在这里插入图片描述

这里大家需要注意:代码是先执行构造代码块的,然后执行构造方法,最后执行普通代码块。

静态代码块:使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。

class Student1{
    String name;
    public int age;
    public static int high;

    public Student1() {
        System.out.println("构造方法");
    }

    {
        this.name="lisi";
        this.age=10;
        System.out.println("构造代码块");
    }
    static {
        high=100;
        System.out.println("静态代码块");
    }
    public void show()
    {
        System.out.println("name:"+name+" "+"age:"+age+"high:"+high);
        {
            System.out.println("普通代码块");
        }

    }
}
public class Test5 {
    public static void main(String[] args) {
        Student1 student1=new Student1();
        student1.show();
        System.out.println("=======");
        Student1 student2=new Student1();
        student2.show();

    }
}

在这里插入图片描述

这就可以看出来:代码是先执行静态代码,然后是执行构造代码块的,然后执行构造方法,最后执行普通代码块
如果我们定义了两个对象,那么第二次就不会再执行静态代码块了,这是因为,静态代码块就执行一次在整个代码中

注意事项
静态代码块不管生成多少个对象,其只会执行一次
静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
实例代码块只有在创建对象时才会执行

6.对象的打印

如果一个来类中定义了两个变量,那我们是否可以直接打印这个类名,去获取变量呢?


class Classmate
{
    public String name;
    public  int age;

    public Classmate(String name, int age ) {
        this.name = name;
        this.age = age;
    }

    public void show()
    {
        System.out.println("name:"+name+"age:"+age);
    }
}

public class Main {
    public static void main(String[] args) {
        Classmate classmate=new Classmate("lisi",20);
        System.out.println(classmate);
    }
}

在这里插入图片描述
其实这个结果是我们Java自带的toString返回的结果,如果我们想返回我们想要的结果,那么我们就要重写toString就可以了。
在这里插入图片描述
当我们重写toString的时候,再次运行程序,我们就会得到我们想要的结果
在这里插入图片描述

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

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

相关文章

中国振华刘昕:携手用友打造电子行业的数智化平台,服务全行业

近期,一年一度的用友BIP技术大会圆满召开。来自行业领先企业的CIO/CDO、生态伙伴、开发者、分析师、媒体等共聚北京用友产业园,了解最新技术发展趋势、探讨行业热点话题。期间,中国振华电子集团有限公司信息中心主任兼研究院副院长刘昕在数科…

layui(2)----页面元素

水平导航栏 依赖加载模块&#xff1a;element <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport"…

目标检测算法:YOLO v1论文解读

目标检测算法&#xff1a;YOLO v1论文解读 前言 ​ 其实网上已经有很多很好的解读各种论文的文章了&#xff0c;但是我决定自己也写一写&#xff0c;当然&#xff0c;我的主要目的就是帮助自己梳理、深入理解论文&#xff0c;因为写文章&#xff0c;你必须把你所写的东西表达清…

zigbee 模拟密码解密

代码&#xff1a; #include "iocc2530.h"#define uchar unsigned char #define uint unsigned int#define D3 P1_0 #define D4 P1_1 #define D5 P1_3 #define D6 P1_4#define SW1 P1_2 #define SW2 P0_1#define LIGHT P1_7void delay_ms(int x){for(int i0;i<x;i…

docker卷--docker volumes 使用学习

一、在Docker中管理数据 1.1、Docker 保存容器数据的方法 Docker 卷&#xff08;Docker Volumes&#xff09;&#xff1a;可以将数据保存在 Docker 卷中&#xff0c;这样可以在容器和宿主机之间共享数据&#xff0c;并保证容器中的数据不会因为容器被删除而丢失。Docker 卷可以…

Vivado_除法器 IP核

本文介绍使用Vivado中除法器Divider Generator&#xff08;5.1&#xff09;的使用方法。 参考资料&#xff1a;pg151 文章目录 Divider Generator仿真测试 Divider Generator Channel Settings选项卡 #Common Options&#xff1a; Algorithm Type: 一共有三种类型&#xff0c;…

如何才能做好企业内部客服知识管理?

企业内部客服知识管理是指企业通过对客户服务过程中所涉及的信息、知识和技能进行系统化、规范化、科学化、数字化的管理&#xff0c;提高企业内部客服人员的服务质量和效率&#xff0c;帮助企业提高客户满意度&#xff0c;增强客户黏性&#xff0c;提高企业的市场竞争力。本文…

【Linux初阶】基础IO - 简易 shell添加重定向功能

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;shell重定向功能的代码实现 &#x1f6a2;&#x1f6a2;作者简介&#xff1a;计算机海洋的新进船长一枚&#…

tinkerCAD案例:1.戒子环

基本戒指 在本课中&#xff0c;您将学习使用圆柱形状制作戒指。来吧&#xff01; 说明 将圆柱体拖动到工作平面上并使其成为孔。 圆柱体应缩放以适合其制造手指。 在本例中&#xff0c;我们将使用 17mm 作为直径&#xff0c;但请根据您的需要随意调整尺寸。 将“圆柱”形状拖…

【操作系统真象还原】第5章:保护模式进阶,向内核迈进(5.1获取物理内存)

目录 5.1 获取物理内存容量 5.1.1 学习 Linux 获取内存的方法 5.1.2 利用 BIOS中断 0x15 子功能 0xe820 获取内存 5.1.3 利用BIOS中断 0x15 子功能 0xe801 获取内存 5.1.4 利用BIOS中断0x15子功能0x88获取内存 5.1.5 实战内存容量检测 5.1 获取物理内存容量 操作系统是计…

构建智能电商推荐系统:大数据实战中的Kudu、Flink和Mahout应用【上进小菜猪大数据】

上进小菜猪&#xff0c;沈工大软件工程专业&#xff0c;爱好敲代码&#xff0c;持续输出干货。 本文将介绍如何利用Kudu、Flink和Mahout这三种技术构建一个强大的大数据分析平台。我们将详细讨论这些技术的特点和优势&#xff0c;并提供代码示例&#xff0c;帮助读者了解如何在…

数据分析--Numpy初级(二)

Numpy初级 Numpy数组属性Numpy的routines函数 Numpy数组属性 Numpy数组的维数成为秩&#xff08;rank&#xff09;&#xff0c;即轴的数量&#xff0c;一维数组的秩为1…。在Numpy中&#xff0c;每一个线性的数组称为是一个轴&#xff08;axis&#xff09;&#xff0c;也就是维…

procomponents组件库采坑日记

ModalForm组件: const formRef useRef<any>();<ModalFormkey{51}title数据仓库formRef{formRef} // 用于获取表单数据autoFocusFirstInput // 自动对话框打开后&#xff0c;首个表单项自动获得焦点width"33%"modalProps{{ // 扩展ant modal属性destroyOnC…

电动力学专题:电磁场规范不变性与规范自由度

对称性&#xff0c;不变性&#xff0c;相对性&#xff0c;协变形 在现代物理学中常常被认为具有相同的含义&#xff08;好拗口&#xff09; 规范与规范的自由度 保证电磁场物理量不改变的情况下&#xff0c;有多组势可供选择&#xff0c;而每组势可以称为一个规范 规范不变性…

linux-动态库制作与使用

​​​​​​(6条消息) linux-静态库制作与使用_云的小站的博客-CSDN博客 目录 创建动态库 使用动态库 根据静态库创建时写的两个源文件&#xff0c;我们来制作动态库 创建动态库 根据这2个源文件和2个头文件我们来学习制作动态库。 我们先让编译两个源文件成.o文件,注意要…

vite技术揭秘--环境变量

目录 环境变量 生产环境替换 自定义环境变量 .env 文件 环境加载优先级 自定义环境变量 模式 TypeScript 的智能提示 在node环境里使用环境变量 前言 我们开发中不可避免的要根据环境变量来做一些逻辑分支&#xff0c;在vite中有两种实现方式&#xff0c;即define和.env…

MIT6.824 lab 1 小白实现过程

1.总体思路 构建一个简单的MapReduce系统&#xff0c;Coordinator线程用于分配任务&#xff08;包括Map任务和Reduce任务&#xff09;&#xff0c;Worker线程向Coordinator线程请求任务&#xff0c;要求所有map任务完成后才可以请求到reduce任务&#xff0c;否则的话这个worker…

Springboot +spring security,基于默认数据库模型实现授权

一.简介 上一篇文章中讲解了如何基于内存模型来实现授权&#xff0c;在这种模型里&#xff0c;用户的信息是保存在内存中的。但是&#xff0c;保存在内存中的信息&#xff0c;是无法持久化的&#xff0c;也就是程序一旦关闭&#xff0c;或者断电等情况发生&#xff0c;内存中的…

0基础学习VR全景平台篇第36篇:场景功能-导览

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 本期为大家带来蛙色VR平台&#xff0c;场景管理—导览功能操作。 功能位置示意 一、本功能将用在哪里&#xff1f; 导览&#xff0c;指给VR漫游作品预先设置好路线&#xff0c;并且可以自定义路线的旋…

DMBOK知识梳理for CDGA/CDGP——第三章数据治理

关 注gzh“大数据食铁兽” 回复“知识点”获取《DMBOK知识梳理for CDGA/CDGP》常考知识点&#xff08;第三章数据治理&#xff09; 第三章 数据治理 第三章在是CDGA|CDGP考试的重点考核章节之一&#xff0c;知识点比较密集&#xff0c;本章重点为语境关系图及数据治理概念…