JAVA知识总结(二):封装
时隔近一年,我突然想起来这个文章还没有发完,所以就继续开始写。也不知道自己上次写到哪里了,不管了这里从面向对象的三个特性说起。
类和对象
在这之前,我们先了解什么是对象,已经什么是面向对象?对象:万物皆对象,现实中实际存在的事物都可以看成一个对象。而面向对象就是人在关注对象, 关注事物的信息。那什么是类?类就是模子,通常用于确定对象将会拥有的特征(属性)和行为(方法)。也就是说对象是类的具体存在,而类则是对象的抽象化。苹果是一个类,你手里拿的苹果就是一个实例化的对象。
刚才说了对象具有属性和方法,那么属性和方法又是什么呢?属性就是对象具有的各种静态特征,通常用来说明对象有什么;而方法就是说明对象具有的各种动态行为,也即对象能做什么。
假如我有一辆吉普车,它的颜色,价格,型号就是属性;而它能加速,减速,停止就是具有各种方法。
创建类的一般步骤为:创建类》实例化对象》书写具体的逻辑。
通常我们在书写类的时候,都需要遵循单一职责原则(单一功能原则),也就是说 一个类应该有且只有一个引起功能变化的原因。如果在一个类当中承担的功能越多,那么它的交融,耦合性就越高,被复用的可能性就越低。特别是因为耦合度高,可能会因为一个职责的变化,引起其他职责的变化,进而影响整个程序的运行,这一点是我们所不想看到的。
实例化对象的过程可以分为三步:声明对象,实例化对象,将两者进行绑定。其中声明对象是在栈内存中开辟了一块内存空间,但此时还不是一个有效的对象,因为此时对象的空间里是空的。如果此时调用它的属性和方法则会引发错误。而实例化对象则是在堆空间开辟一块空间,它完成了具体对象相关信息的初始化操作。最后通过赋值进行两者绑定。
也就是声明对象和实例化对象是在内存中的不同空间完成的,通过赋值操作,将两者关联。具体的关联就是将堆中具体对象的内存地址存放在之前在栈中开辟的内存中,从而完成绑定。
构造方法
构造方法也称为: 构造函数或者构造器,你可以使用构造方法来完成对象初始化相关操作。
构造方法的调用必须配合new关键字,不能被对象单独调用。注意,构造方法必须与类同名且没有返回值。
方法名中的参数列表可有可无,但是只能在对象实例化的时候被调用。
当没有指定构造方法时,系统会自动添加无参的构造方法;当有指定的构造方法时,无论是有参、无参的构造方法,系统都不会自动添加无参的构造方法,一个类中可以有多个构造方法。
this: 当前对象的默认引用; this的使用:调用成员属性,解决成员属性和局部变量同名冲突,也可以调用成员方法。
如果你想调用重载的构造方法,那么只能通过this关键字来使用this();同时请记住,如果是通过this()来调用构造方法时,它必须放在方法体内第一行。(这个一定注意)
封装
封装就是将类的某些信息隐藏在类内部, 不允许外部程序直接访问,但是通过该类提供的方法来实现对隐藏信息的操作和访问。也就是说两点:一是隐藏对象的信息,第二留出可以访问的接口(方法)。
封装的具体步骤:1、将访问修饰符替换为private;2、提供公共的setter和getter方法;3、必须有构造方法(系统会默认调用无参的构造方法)。其中setter方法是可写,getter方法是可读。我们可以在setter方法里面添加自己的业务逻辑,从而实现对值的合理性进行判断。
因为已经实现了封装,因此我们在实例化对象的时候就不需要再次传入自定义的参数了,否则就没有使我们提供的setter方法生效了。
包的管理
为什么要说包的管理呢?因为包的管理太重要了,其实很多坑就是包的命令和管理不规范引起的。
我们知道文件夹可以进行文件的管理,同一个文件中可以存放多个不同的文件,同名的文件只能存放在不同的文件夹中。
在Java中我们也是通过包来管理java文件来解决同名文件的冲突问题,Java中一个包里不能存放同名类,但不同包却是可以。
包的定义必须放在Java源文件的第一行。前面说过,我们在定义类的时候,尽量遵循单一职责原则,同样的道理,在建立包的时候,建议每个包内存储的信息功能应该单一。
如何实现跨包类的调用?可以采用Import这个关键字,来实现包的导入。需要注意的是import包名.* 只能访问指定包名下的类,无法访问子包下的类。
还有就是包的效率问题,建议采用import包名.类名
的方式进行包的导入,这样可以提高加载效率
import net.oschina.Test.*; // 加载包下的所有类
import net.oschina.Test.Java; // 加载指定包下的指定类
注意一下,加载类的顺序跟import导入语句的位置无关:指定的具体包的优先级大于通配符。也就是下面加载会大于上面加载的速率。
最后说一下关于包管理的几个注意事项:
1、必须放在Java源文件中的第一行;
2、一个Java源文件中只能有一个package语句;
3、包名全部采用英文字母小写的方式;
4、包的命名方式为:域名倒序+模块+功能。
static关键字
static修饰
static表示静态的。
如果它修饰成员变量,那么该变量被称为静态成员或类成员,它是这个类所有的。也就是说无论这个类实例化出多少对象,它都会共用同一块内存空间。后面的只会覆盖前面的值。
如果它修饰属性,那么该属性被称为静态属性。
如果它修饰方法,那么该方法被称为静态方法。
如果它修饰初始化块,那么该初始化块被称为静态初始化块。
但是static是不能修饰类,不能修饰局部变量,不能内部类中修饰初始化块(不可以在内部类定义静态初始化块)。
静态成员的生命周期很长,在类加载时产生,直到类被销毁时才释放。
static访问
普通的成员方法可以直接访问当前对象(该类实例化的对象)的成员属性和方法,也可以直接访问当前对象的静态属性和静态方法
静态方法或者类方法(前面被static修饰),它不能直接访问同一个类中的非静态成员,因为它缺少隐含的this参数。静态方法只能直接调用同一个类中的静态成员。如果非要访问,只能通过实例化一个对象后,采用对象.成员方法的方式来访问非静态成员。
初始化块(代码块)
初始化块的说明
在Java里面,被{}括起来的代码就称之为代码块(初始化块)。
当代码块出现在方法里的时候,叫做普通代码块,普通代码块和一般语句的执行顺序是一样的:从上到下,顺序执行,先出现,,先执行。
当代码块直接在类中定义,与成员方法,属性并列时,我们此时称之为构造代码块。
记住构造代码块比构造函数优先执行。构造代码块它是在创建对象的时候被调用,优先于构造方法的执行。所以不管构造代码块放在类的其他位置,它都会先于构造函数执行。
多个构造代码块之间有先后顺序,但都先于构造函数前执行。
初始化块的执行
现在考虑一下,静态初始化块,普通初始化块,构造函数这三者的执行顺序?你只要记住静态初始化块只在类初始化时进行加载,而且只执行一次。对于三者,程序的执行优先级:静态初始化块--》初始化块--》构造方法。(这里的初始化块包括构造初始化块(直接在类中声明)和普通的初始化块(在方法中声明)。
初始化块的范围
看一段代码:
public void test(){
{
System.out.println("我是普通代码块1");
}
System.out.println("初始化块的范围");
{
System.out.println("我是普通代码块2");
}
}
我们发现这个test方法空间被分成了三部分,所以我们可以利用这个功能来实现变量的命名冲突。
public void test(){
int temp =10;
int temp =12;
}
上面是不可以的,但是下面却是可以的:
public void test(){
{ int temp =10;
};
{ int temp =12;
};
}
这时两个代码块空间中允许有自己的变量值,不会重名造成冲突。但是不能在方法的全局域位置添加同名变量,因为它会与两个变量都造成重复定义的问题:
public void test(){
{ int temp =10;
};
int temp =11;
{ int temp =12;
};
}
因为temp的作用域是从那里到结尾的,会与后面的代码块里面的变量产生命名冲突。
由于篇幅的问题,继承和多态我下次再说哈,今天就写到这里了,感谢你的赏阅!!!
JAVA知识总结(二):封装的更多相关文章
- 测试必备之Java知识(二)—— Java高级的东西
Java高级 类加载过程 加载(创建class对象) -> 连接(验证-准备-解析) -> 类初始化 类加载器类别 根类加载器:加载java核心类 扩展类加载器:加载JRE目录中的jar包 ...
- Java JDBC的基础知识(二)
在我的上一篇Java JDBC的基础知识(一)中,最后演示的代码在关闭资源的时候,仅仅用了try/catch语句,这里是有很大的隐患的.在程序创建连接之后,如果不进行关闭,会消耗更多的资源.创建连接之 ...
- 打造一款 刷Java 知识的小程序(二)
学习Java的神器已上线,面向广大Java爱好者! 之前写的一篇:打造一款 刷Java 知识的小程序(一) 一.第二版做了什么? 第一版小程序只具有初级展示功能,知识点都是hardcode在代码里面的 ...
- Java基础知识回顾之三 ----- 封装、继承和多态
前言 在上一篇中回顾了java的修饰符和String类,这篇就来回顾下Java的三大特性:封装.继承.多态. 封装 什么是封装 在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部份包装 ...
- 【转】java提高篇(二)-----理解java的三大特性之继承
[转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...
- Java实验报告二:Java面向对象程序设计
Java实验报告二:Java面向对象程序设计 ...
- Java的继承、封装与多态
Java的继承.封装与多态 基本概念 面向对象OO(Object Oriented):把数据及对数据的操作方法放在一起,作为一个相互依存的整体,即对象. 对同类对象抽象出共性,即类. 比如人就是一个类 ...
- Android开发学习必备的java知识
Android开发学习必备的java知识本讲内容:对象.标识符.关键字.变量.常量.字面值.基本数据类型.整数.浮点数.布尔型.字符型.赋值.注释 Java作为一门语言,必然有他的语法规则.学习编程语 ...
- JAVA基础第二章-java三大特性:封装、继承、多态
业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...
- .net基础学java系列(二)IDE 之 插件
上一篇文章.net基础学java系列(二)IDE "扎实的基础"+"宽广的视野",基本可以帮我们摆脱码畜.码奴.码农的命运! IT领袖:IT大哥:IT精英:IT ...
随机推荐
- L16 LeNet
**本小节用到的数据下载 1.涉及语句 import d2lzh1981 as d2l 数据1 : d2lzh1981 链接:https://pan.baidu.com/s/1LyaZ84Q4M75G ...
- K - Downgrade Gym - 101775K
题目大意:一天不玩相当于A-B中将A转换为经验值,B舍弃掉,然后A=1,在通过升级所需要的经验值来判断可以升几级 题目连接:https://codeforces.com/gym/101775/prob ...
- 关于C++线程池的实现的思考
今天突然对前些日子一直很疑惑的c++线程池有了新的想法.其实所谓的线程池无非就是两个技术点,一个,多线程,指工作线程和主线程分离,或者说数据接收和处理分两个线程,一般就是讲需要运行的函数放到子线程执行 ...
- 数据结构(C语言版)---二叉树
1.二叉树:任意一个结点的子结点个数最多两个,且子结点的位置不可更改,二叉树的子树有左右之分. 1)分类:(1)一般二叉树(2)满二叉树:在不增加树的层数的前提下,无法再多添加一个结点的二叉树就是满二 ...
- jmeter插件 --PerfMon Metrics Collector监控工具的使用
PerfMon Metrics Collector 用来监控 被压测服务器的cpu.内存.磁盘.网络等 1.服务端监控程序ServerAgent下载 https://github.com/undera ...
- windows下部署.netcore+docker系列二 (unbuntu 18.4 下 安装 docker)亲测!!!
1.卸载sudo apt-get remove docker docker-engine docker.io containerd runc2.更新sudo apt-get update3.安装依赖包 ...
- 新手上路:Laravel-控制器基础
1.控制器在哪 Controller目录默认存放于app\Htpp\Controllers下,当然,你可以自定义这个目录: Controllers文件夹有一个控制器基类Controller.php,你 ...
- mybatis源码学习(四):动态SQL的解析
之前的一片文章中我们已经了解了MappedStatement中有一个SqlSource字段,而SqlSource又有一个getBoundSql方法来获得BoundSql对象.而BoundSql中的sq ...
- 2018年要学习的10大Python Web框架
通过为开发人员提供应用程序开发结构,框架使开发人员的生活更轻松.他们自动执行通用解决方案,缩短开发时间,并允许开发人员更多地关注应用程序逻辑而不是常规元素. 在本文中,我们分享了我们自己的前十大Pyt ...
- LNMP环境搭建之php安装
和LAMP安装PHP方法有差别,需要开启php-fpm服务 下载php cd /usr/local/src/ wget http://cn2.php.net/distributions/php-5.6 ...