封装(static的性质、代码块)

目录

前言:

封装:

包: 

什么是包?

导入包中的静态方法: 

定义包:

访问修饰限定符:

private:

default:

static:

static成员变量: 

static方法: 

代码块:

 静态代码块和构造代码块:

练习: 

习题一:

习题二: 

习题三: 

习题四: 

总结:


前言:

       我们知道面向对象语言有三大特征:封装,继承,多态。在此之前我们也知道了什么是类和对象(一定要有这些基础知识,详情请看Java中的类和方法(方法重载)-CSDN博客)。这一篇我们就来详细讲解封装和继承。

封装:

       听名字,像是包装。其实它就是包装,封装简单来说,就是套壳屏蔽细节,也就是包装。比如电脑我们只能看到主机,但是主机里面还有很多核心部件,比如主板,显卡等等。

       但使用者不必注意细节,只用知道如何去使用即可。这也就是封装的概念。在此之前,我们还需要一些预备知识。

包: 

什么是包?

       为了更好的管理类,我们提出了一个包的概念,把多个类收集在一组,称为软件包。

       包其实就是文件夹下的一个类。在同一个工程中,允许存在相同名称的类,只要处在不同的包中即可。我们平时输入要用到Scanner这个类,用到这个类需要导包。

        比如说我们此时要用的date有关于日期的类,如果我们不导包,就只能这样用:

import java.util.Date;public class test2 {public static void main(String[] args) {java.util.Date date = new java.util.Date();//不导包只能这样指定使用Date data1 = new Date();//导入包以后就可以这样使用}
}

       当我们想导入包时,我们可以双击shift,并点击class,输入查找的包,可以查看具体源码实现。

        我们也可以使用通配符:

       但是一般不建议这样写,我们只需要导入具体的包,这样更加精准。

导入包中的静态方法: 

       我们也可以只导入包中的静态方法。

//import static java.lang.Math;//导入Math包中的所有静态方法不能这样写
import static java.lang.Math.*;//只能这样写

       其实导入静态方法是有好处的,它可以方便类中方法的使用,比如我们已经导入了Math中的所有的静态方法,此时我们就可以这样写:

//import static java.lang.Math;//导入Math包中的所有静态方法不能这样写
import static java.lang.Math.*;//只能这样写public class test2 {public static void main(String[] args) {double x = 30;double y = 40;//静态导入的方式写起来更方便//double ret = Math.sqrt(Math.pow(x,2) + Math.pow(y, 2));double ret = sqrt(pow(x, 2) + pow(y, 2));System.out.println(ret);}
}

       导入静态方法会更加方便一些。 和C/C++引用头文件不一样,他们引入头文件其实就是把它所有的内容都拷贝过来;而Java就是要到哪一个才会拿哪一个。

定义包:

       我们可以自己定义包,右击src,新建package(全部使用小写,一般使用公司域名颠倒形式)。之后往包里面创建类。

       所以包名要与代码路径相匹配,例gan.www的包,就会存在一个对应路径gan/www来存储代码。如果没有包(package)语句,则该类被放在一个默认的包中。

访问修饰限定符:

       还记不记得我们之前每次都在使用public修饰,绝大多是是用public修饰的,少数是用private。一共分为3类。

        我们要知道封装,就一定要知道这些访问修饰限定符的含义。

private:

       将属性修改为私有属性,这个属性只能当前包当前类中才能访问。

       我们将其修改为private,之后发现赋值就出现错误了。 此时在类外就看不到name,这就体现了它的封装性。

       此时只能这样赋值,因为不知道其具体属性。

        我们也可以给方法限定为private方法,这样类外也拿不到。比如我们将构造方法修改为private修饰。

        此时只能在当前类中使用。 此时如果我们想使用不带参数的构造方法该如何呢?很简单,在类中设置方法。

       此时我们只能通过提供公开的get和set方法,帮助我们获取或者修改成员。

       当我们都用private修饰时,只能通过内部提供的公开方法才可以拿到属性和赋值属性时,这就叫做封装。

public class People{private String name;private int age;public People(){System.out.println("不带参数的构造方法");}public People(String name, int age) {this.name = name;this.age = age;System.out.println("带参数的构造方法");}public void setName(String name){this.name = name;}public String getName(){return this.name;}public void sleep(){System.out.println(this.name + "正在睡觉");}
}
public class test2 {public static void main(String[] args) {//People person = new People("脏三",9);//此时只能这样赋值//无参构造需要类中有方法People people = new People();people.setName("脏三");System.out.println(people.getName());}
}

        此时如果都是私有属性,难道我们要一个一个set和get吗?IDEA其实也有快捷键,右击点击generate,并点击Setter and Getter之后全选即可。

       好的,目前我们已经知道如何使用private和它的性质了,那么我们接下来就要知道其他的限定修饰访问符的用法和性质了。

default:

       这里大家会问,default是个啥,也没见过。对,确实没见过,但是我们前面不给任何修饰就是默认(default)的。比如此时我们这样定义成员属性:

private int age;int r;

        其实也就是翻译的问题而已。我们已经知道包是什么了,接下来我们来演示default的权限。

       protected我们等学完继承以后再讲。

static:

static成员变量: 

       接下来我们讲解static修饰符的使用方法。

public class Student {public String name;public int id;public String className;public Student(String name, int id, String className) {this.name = name;this.id = id;this.className = className;}
}
public class Main {public static void main(String[] args) {Student student1 = new Student("zangsan",10,"301");Student student2 = new Student("Lisi",11,"301");Student student3 = new Student("wangwu",13,"301");}
}

       我们创建三个学生变量,他们都在同一个班级上课。既然如此就会显得有些冗余,占据多余空间,此时我们可以将其班级成员变量设置为静态变量。

       此时我们再右击生成形参构造器时也就看不到能构造静态成员变量的选项了。        此时我们先将其className静态成员就地初始化为301。并逐个给每个学生赋值班级。

public static String className = "301";

       在赋值期间,我们发现.不出来className必须全部拼写出来,而且静态成员也不是在对象中存储的,所以可以见得,static静态成员变量并不是这样用的。 因为不是对象中的成员,所以我们直接通过类名调用。

//通过类名访问
System.out.println(Student.className);

static方法: 

       同理,也有静态方法,也是通过调用类名来使用。 

       所以,static修饰的成员变量称为静态成员变量。特征:不属于某具体的对象,是所有对象所共享的。 既可以通过对象访问,也可以通过类名访问(但推荐使用类名访问)。生命周期伴随类的一生。

       静态成员变量存在方法区当中。

       静态方法中不能调用 非静态的成员变量 或者 非静态的成员方法。

       所以静态方法不包含this。

       静态方法无法重写。所以有些地方这样写:

  • 静态成员变量 -> 类变量
  • 静态成员方法 -> 类方法

代码块:

       代码块我们都知道是{},平时用的就是普通代码块,但是在Java中,还有分类:

  • 普通代码块(这里不再赘述)
  • 构造块
  • 静态块
  • 同步代码块(这个后续了解)

 静态代码块和构造代码块:

       这里我们一般使用静态代码块初始化静态成员变量。为了更好举例,我们再给出构造代码块的应用。

       此时我们发现先执行了静态代码块,为了更好的总结规律,此时我们在实例化一个对象:

       此时可以发现静态代码块只执行一次。若一个类中有多个静态代码块,其实相当于合并执行了。

练习: 

习题一:

public class Student {public String name;public int id;public static String className;public static int i;//无参构造器public Student(){}//构造代码块{i++;}public Student(String name, int id) {this.name = name;this.id = id;//System.out.println("hahaha");}
}
public class Main {public static void main(String[] args) {Student s1 = new Student();Student.i++;//i = 2System.out.println(Student.i++);//i = 3System.out.println(Student.i++);//i = 4System.out.println(Student.i += 3);//i = 7Student s2 = new Student();//执行了构造代码 i++//因为静态代码只执行一次System.out.println(Student.i);//i = 8}
}

       static修饰的常量和C语言一样,会延长变量的生命周期。因为并不是在堆区创建的,所以生命周期不会结束。

习题二: 

class Test{	public String toString() {System.out.print("aaa");return "bbb";}
}public static void main(String[] args) {Test test = new Test();System.out.println(test);
}

习题三: 

public class Again {String s;public static void main(String[] args) {System.out.println(s);}
}

       在同一个类中,静态方法无法调用非静态方法或者变量。除非在静态方法中实例化了一个对象。

public class Again {String s;public static void main(String[] args) {Again a = new Again();System.out.println(a.s);}
}

习题四: 

public class Test { public int aMethod(){static int i = 0;i++; return i;} 
public static void main(String args[]){Test test = new Test(); test.aMethod(); int j = test.aMethod();System.out.println(j);} 
}

       这个编译出错,因为被static修饰的只能是成员变量,不能是局部变量。static的代码块是从上到下一次执行的。

总结:

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

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

相关文章

[UUCTF 2022 新生赛]ez_rce

[UUCTF 2022 新生赛]ez_rce wp 在做这道题时&#xff0c;我参考了这篇博客&#xff1a; https://www.cnblogs.com/bkofyZ/p/17594549.html 认识到了自己的一些不足。 题目代码如下&#xff1a; <?php ## 放弃把&#xff0c;小伙子&#xff0c;你真的不会RCE,何必在此纠…

突显网页设计优势:不可忽视的四项关键要素

网页网站设计要点 一、主题清晰 在明确目标的基础上&#xff0c;完成网站的创意是整体设计方案。定位网站的整体风格和特点&#xff0c;规划网站的组织结构。网站应根据不同的服务对象&#xff08;机构或人员&#xff09;有不同的形式。有些网站只提供简单的文本信息&#xf…

【程序员的自我修养08】精华!!!动态库的由来及其实现原理

绪论 大家好&#xff0c;欢迎来到【程序员的自我修养】专栏。正如其专栏名&#xff0c;本专栏主要分享学习《程序员的自我修养——链接、装载与库》的知识点以及结合自己的工作经验以及思考。编译原理相关知识本身就比较有难度&#xff0c;我会尽自己最大的努力&#xff0c;争…

穷举vs暴搜vs深搜vs回溯vs剪枝

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;全排列&#x1f449;&#…

微信小程序使用echarts报错 ReferenceError: Image is not defined 解决

报错 ReferenceError: Image is not defined 在用uni-app开发微信小程序时&#xff0c;使用到了echarts&#xff08;V4.6.0&#xff09;配置项中的icon属性&#xff0c;微信开发者工具报错如下&#xff1a; 定位问题 定位问题到了压缩echarts文件中的new Image 使用非压缩…

【LabVIEW FPGA入门】创建第一个LabVIEW FPGA程序

本教程仅以compactRIO&#xff08;FPGA-RT&#xff09;举例 1.系统配置 1.1软件安装 FPGA-RT 1. LabVIEW Development System (Full or Professional) 2. LabVIEW Real-Time Module 3. LabVIEW FPGA Module 4. NI-RIO drivers 1.2硬件配置 1.使用线缆连接CompactRIO至主机…

解决json.decoder.JSONDecodeError: Extra data: line 1 column 721 (char 720)问题

python中将字符串序反列化成json格式时报错 fn result_json[0].decode(utf-8).strip(\00) json_object json.loads(fn) print(type(json_object))排查了以下原因应该是序列化的字符串全都在一行&#xff0c;json库不能一次性处理这么长的序列

jsavascript

JavaScript获取当前时间 效果图当前时间 效果图 当前时间 var now new Date();var year now.getFullYear();var month (now.getMonth() 1) <10 ? "0"(now.getMonth() 1) : (now.getMonth() 1);var day now.getDate() <10 ? "0"now.getDate() :…

【Linux 内核源码分析】GPIO子系统软件框架

Linux内核的GPIO子系统是用于管理和控制通用输入输出&#xff08;GPIO&#xff09;引脚的软件框架。它提供了一套统一的接口和机制&#xff0c;使开发者能够方便地对GPIO进行配置、读写和中断处理。 主要组件&#xff1a; GPIO框架&#xff1a;提供了一套API和数据结构&#x…

纯血鸿蒙 App 上线,目前已超 150 款!

做鸿蒙应用开发到底学习些啥&#xff1f;鸿蒙生态&#xff0c;正在极速扩大&#xff01; 上月底&#xff0c;包括荣耀 V30、30 系列及 Play 4 Pro 六款老机型&#xff0c;获得了鸿蒙 4.0 正式版更新。 前不久&#xff0c;华为 P30 系列、Mate 20 系列、荣耀 20 系列、荣耀 V2…

第7章 表格和表单

学习目标 掌握创建表格的方法&#xff0c;能够在网页中创建表格。 熟悉表格相关标签的属性&#xff0c;能够运用这些属性设置不同形态的表格。 掌握CSS控制表格样式的方法&#xff0c;能够使用CSS设置表格样式。 了解表单的构成&#xff0c;能够说出表单的构成部分。 掌握创…

C#编程-递归

递归 您知道方法可以调用其他方法。但是,方法也可以调用自己。从函数主体调用函数的过程称为递归。 递归的主要优点是在编写清晰、简短和简单的程序方面非常有用。 要理解此概念,请考虑阶乘函数定义为: n != 1 * 2 * 3 * 4 * ... * n此同阶乘函数可定义为: n! = (n-1)!*…

专业服务新篇章:ToB行业运营达人的能力与策略

又逢年底&#xff0c;这两天冷空气南袭&#xff0c;深圳的天气也转为湿冷&#xff0c;又到了年终总结复盘的时候了&#xff0c;其实这样的天气挺适合做深度的思考&#xff0c;清冷的空气&#xff0c;可以让人保持清醒。 月初市场同事希望我写点东西&#xff0c;题目内容自拟&a…

初始py和py开发工具

前言&#xff1a;上一章节给友友们讲解了如何安装py环境&#xff0c;这一章节就来练习一下如何写py的程序以及注意事项。 目录 一.你好世界 1.因为主播liunx用习惯的缘故所以所有的操作都在liunx上面执行&#xff0c;下面我们来看怎么写py的程序&#xff0c; 1.1首先打开liu…

Windows 7 虚拟机的安装以及解决安装VMVMware tools问题

1.Windows 7 虚拟机的安装以及解决安装VMVMware tools问题 参考&#xff1a;Windows 7 虚拟机的安装以及解决安装VMVMware tools问题 注意&#xff1a;下载官方补丁&#xff1a;Microsoft Update Catalog在智慧联想浏览器中打不开&#xff0c;要在火狐中才能打开下载。 2.win7如…

如何区分接口测试和功能测试

接口测试和功能测试的区别&#xff1a; 本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为…

opencv期末练习题(5)附带解析

根据R、G、B的值实时修改图像的颜色 import cv2 import numpy as np""" 滑动块调整图像灰度1. 读取图片&#xff0c;并转为灰度图 2. 定义启动滑块和R、G、B滑块 3. 只有启动滑块的值为1时&#xff0c;拖动R、G、B滑块才生效 4. 根据R、G、B的值实时对修改图片的…

STC进阶开发(三)蜂鸣器、RTC时钟、I2C总线、外部中断、RTC闹钟设置、RTC计时器设置

前言 这一期我们首先学习如何让蜂鸣器响起来&#xff0c;并且如何让蜂鸣器发出简单的歌曲&#xff0c;然后我们介绍RTC时钟&#xff0c;要想明白RTC时钟&#xff0c;我们还需要先介绍I2C总线和外部中断。接下来就开始这一期的学习吧&#xff01; 蜂鸣器 简单介绍 蜂鸣器是一种…

opencv期末练习题(2)附带解析

图像插值与缩放 %matplotlib inline import cv2 import matplotlib.pyplot as plt def imshow(img,grayFalse,bgr_modeFalse):if gray:img cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)plt.imshow(img,cmap"gray")else:if not bgr_mode:img cv2.cvtColor(img,cv2.COLOR_B…

Selenium教程06:单选框+多选框+下拉框组件的示例练习

1.Radio单选框的示例用法&#xff0c;通过网页元素class和type属性多条件共同定位元素&#xff0c;模拟依次选中Android&#xff0c;Apple&#xff0c;Windows。 网页元素结构 <input type"radio" class"ivu-radio-input" name"ivuRadioGroup_170…