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

目录

  • 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://xiahunao.cn/news/352335.html

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

相关文章

Storm入门之第6章一个实际的例子

本文翻译自《Getting Started With Storm》译者:吴京润 编辑:郭蕾 方腾飞 本章要阐述一个典型的网络分析解决方案,而这类问题通常利用Hadoop批处理作为解决方案。与Hadoop不同的是,基于Storm的方案会实时输出结果。 我们的这个…

20222817 2022-2023-2《网络攻防实践》第十一次作业

目录 1.实践内容 2.实践过程 3 学习中遇到的问题及解决 4 实践总结 1.实践内容 1.Web浏览器渗透攻击实验 任务:使用攻击机和Windows靶机进行浏览器渗透攻击实验,体验网页木马构造及实施浏览器攻击的实际过程。 2.取证分析实践—网页木马攻击场景分析…

【Storm入门指南】第六章 真实示例

本章将演示一个典型的网页分析方案,通常使用 Hadoop 批量作业来解决的问题。不像 Hadoop 的实现方案,基于 Storm 的解决方案实时刷新并呈现结果。 示例有三个主要部分(如图6.1所示): 一个 Node.js 的web应用&#xff0…

Storm 实时分析系统详解

一、Storm 概述 1、Storm 简介 Storm 是一个分布式的,可靠的,容错的数据流处理系统。它会把工作任务委托给不同类型的组件,每个组件负责处理一项简单特定的任务。Storm 集群的输入流由一个被称作 spout 的组件管理,spout 把数据传递给 bolt, bolt 要么把数据保存到某种存…

Storm 的一个案例

本章要阐述一个典型的网络分析解决方案,而这类问题通常利用Hadoop批处理作为解决方案。与Hadoop不同的是,基于Storm的方案会实时输出结果。 我们的这个例子有三个主要组件(见图6-1) 一个基于Node.js的web应用,用于测试…

getting start with storm 翻译 第六章 part-4

转载请注明出处:http://blog.csdn.net/lonelytrooper/article/details/9982967 Redis服务器 Redis是一套高级的用于持久化的内存KeyValue存储系统(见http://redis.io)。使用它来存储下述信息: ﹒产品信息,用于服务网站。 ﹒用户导航队列…

Phpstorm调试详解(包含命令行以及浏览器)

2019独角兽企业重金招聘Python工程师标准>>> 运行环境 PHP版本:5.5.12 Phpstorm : 9.0.2 xdebug : 2.2.5 下载地址,请下载与当前PHP版本对应的版本 系统平台:Windows 7 一 ,要先给php安装xdebug扩展 1,…

windows核心编程之进程(3)

获取系统版本的函数: GetVersion返回一个DWORD类型的值,高子返回MS-DOS版本号,低字返回windows版本号 本来按照逻辑来说应该是低字的高字节返回windows的主版本号,低字节返回此版本号,但是编写该代码程序员犯了一个小错误&#…

2023CCPC河南省赛 VP记录

感觉现在的xcpc,风格越来越像CF,不是很喜欢,还是更喜欢多点算法题的比赛 VP银了,VP银也是银 感觉省赛都是思维题,几乎没有算法题,感觉像打了场大型的CF B题很简单没开出来,一直搞到最后&…

大学计算机专业 学习Python学习路线图(最新版)

这是我刚开始学习python时的一套学习路线,从入门到上手。(不敢说精通,哈哈~) 希望对大家有帮助哈~ 大家需要高清得完整python学习路线可以 一、Python入门、环境搭建、变量、数据类型 二、数据库编程 三、Linux系统 四、网页编…

哪些手机待办事项软件可以记录备忘并设置提醒?

当下手机软件的种类那么多,为什么有那么多人使用手机待办事项软件呢?原因很简单,因为这类软件可以记录备忘并设置提醒,非常适合哪些喜欢提前规划待办事项的人使用。但是,面对如此多的手机待办事项软件,具体…

【HTML】第 2 节 - HTML 标签

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、标题标签 3、段落标签 4、文本格式化标签 5、图像标签 5.1、基本作用 5.2、属性 6、超链接标签 7、音频标…

Vivado下时序逻辑模块的仿真

文章目录 D触发器两级D触发器带异步复位的D触发器带异步复位和同步置数的D触发器移位寄存器单口RAM伪双口RAM真双口RAM单口ROM 组合逻辑电路在逻辑功能上特点是任意时刻的输出仅仅取决于当前时刻的输入,与电路原来的状态无关。 时序逻辑在逻辑功能上的特点是任意时刻…

单元测试方法-cmockery实践

目录 单元测试概念 引子 定义 内容 方法 单元测试模型 测试模型构建 单元测试工具简介 Cmockery使用介绍 简介 使用 VPBX实践 UT框架搭建 目录 编译: 实例demo 例1: 例2: 例3: 例4: 例5&#xff…

从0开始搭建vue3+vite+ts+pinia项目

目录 项目搭建选项 项目搭建步骤 本地开发环境 Vite脚手架构建项目 关联Git仓库 开发工具 安装pinia 安装Sass 安装Vant-UI 安装postcss-pxtorem(移动端项目) 安装axios 本地调试 环境变量 本地代理 全局UI组件 路由中间件 项目部署 n…

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"…

AcWing 回转游戏 dfs IDA* 剪枝 统一操作 java

&#x1f351; 算法题解专栏 &#x1f351; 回转游戏 如下图所示&#xff0c;有一个 # 形的棋盘&#xff0c;上面有 1 , 2 , 3 1,2,3 1,2,3 三种数字各 8 8 8 个。 给定 8 8 8 种操作&#xff0c;分别为图中的 A s i m H A \\sim H AsimH。 这些操作会按照图中字母和箭头…

MCGS昆仑通态触摸屏导入博途自定义数据类型和DB块变量的具体方法演示

MCGS昆仑通态触摸屏导入博途自定义数据类型和DB块变量的具体方法演示 如下图所示,在博途中新建项目后,添加自己所需的数据类型,然后选中该数据类型,右击选择“从块生成源“—”仅所选块“, 如下图所示,设置文件名后点击保存, 如下图所示,选中需要导出的DB块,右击选…

vue 自定义el-table穿梭框功能

一、需求描述&#xff1a;前段时间接到一个需求是点击做一个类似穿梭框的表格点击选中功能&#xff0c;弹框的左边是全部数据展示&#xff0c;点击表格行数据可以选中自动增加到右边的已选框&#xff0c;并且可以手动删除、重置选中数据。点击确定后到展示到主页面&#xff0c;…

Java核心知识点常考面试题(持续更新中)

Java核心知识点常考面试题&#xff08;持续更新中&#xff09; 线程与线程池Java锁机制轻量级锁重量级锁 线程与线程池 一、线程 1、线程的状态 2、线程的创建方式 &#xff08;1&#xff09;继承 Thread 类&#xff1b; &#xff08;2&#xff09;实现 Runnable 接口&#…