时隔近一年,我突然想起来这个文章还没有发完,所以就继续开始写。也不知道自己上次写到哪里了,不管了这里从面向对象的三个特性说起。

类和对象

在这之前,我们先了解什么是对象,已经什么是面向对象?对象:万物皆对象,现实中实际存在的事物都可以看成一个对象。而面向对象就是人在关注对象, 关注事物的信息。那什么是类?类就是模子,通常用于确定对象将会拥有的特征(属性)和行为(方法)。也就是说对象是类的具体存在,而类则是对象的抽象化。苹果是一个类,你手里拿的苹果就是一个实例化的对象。

刚才说了对象具有属性和方法,那么属性和方法又是什么呢?属性就是对象具有的各种静态特征,通常用来说明对象有什么;而方法就是说明对象具有的各种动态行为,也即对象能做什么。

假如我有一辆吉普车,它的颜色,价格,型号就是属性;而它能加速,减速,停止就是具有各种方法。

创建类的一般步骤为:创建类》实例化对象》书写具体的逻辑。

通常我们在书写类的时候,都需要遵循单一职责原则(单一功能原则),也就是说 一个类应该有且只有一个引起功能变化的原因。如果在一个类当中承担的功能越多,那么它的交融,耦合性就越高,被复用的可能性就越低。特别是因为耦合度高,可能会因为一个职责的变化,引起其他职责的变化,进而影响整个程序的运行,这一点是我们所不想看到的。

实例化对象的过程可以分为三步:声明对象,实例化对象,将两者进行绑定。其中声明对象是在栈内存中开辟了一块内存空间,但此时还不是一个有效的对象,因为此时对象的空间里是空的。如果此时调用它的属性和方法则会引发错误。而实例化对象则是在堆空间开辟一块空间,它完成了具体对象相关信息的初始化操作。最后通过赋值进行两者绑定。

也就是声明对象和实例化对象是在内存中的不同空间完成的,通过赋值操作,将两者关联。具体的关联就是将堆中具体对象的内存地址存放在之前在栈中开辟的内存中,从而完成绑定。

构造方法

构造方法也称为: 构造函数或者构造器,你可以使用构造方法来完成对象初始化相关操作。

构造方法的调用必须配合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知识总结(二):封装的更多相关文章

  1. 测试必备之Java知识(二)—— Java高级的东西

    Java高级 类加载过程 加载(创建class对象) -> 连接(验证-准备-解析) -> 类初始化 类加载器类别 根类加载器:加载java核心类 扩展类加载器:加载JRE目录中的jar包 ...

  2. Java JDBC的基础知识(二)

    在我的上一篇Java JDBC的基础知识(一)中,最后演示的代码在关闭资源的时候,仅仅用了try/catch语句,这里是有很大的隐患的.在程序创建连接之后,如果不进行关闭,会消耗更多的资源.创建连接之 ...

  3. 打造一款 刷Java 知识的小程序(二)

    学习Java的神器已上线,面向广大Java爱好者! 之前写的一篇:打造一款 刷Java 知识的小程序(一) 一.第二版做了什么? 第一版小程序只具有初级展示功能,知识点都是hardcode在代码里面的 ...

  4. Java基础知识回顾之三 ----- 封装、继承和多态

    前言 在上一篇中回顾了java的修饰符和String类,这篇就来回顾下Java的三大特性:封装.继承.多态. 封装 什么是封装 在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部份包装 ...

  5. 【转】java提高篇(二)-----理解java的三大特性之继承

    [转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...

  6. Java实验报告二:Java面向对象程序设计

    Java实验报告二:Java面向对象程序设计                                                                               ...

  7. Java的继承、封装与多态

    Java的继承.封装与多态 基本概念 面向对象OO(Object Oriented):把数据及对数据的操作方法放在一起,作为一个相互依存的整体,即对象. 对同类对象抽象出共性,即类. 比如人就是一个类 ...

  8. Android开发学习必备的java知识

    Android开发学习必备的java知识本讲内容:对象.标识符.关键字.变量.常量.字面值.基本数据类型.整数.浮点数.布尔型.字符型.赋值.注释 Java作为一门语言,必然有他的语法规则.学习编程语 ...

  9. JAVA基础第二章-java三大特性:封装、继承、多态

    业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...

  10. .net基础学java系列(二)IDE 之 插件

    上一篇文章.net基础学java系列(二)IDE "扎实的基础"+"宽广的视野",基本可以帮我们摆脱码畜.码奴.码农的命运! IT领袖:IT大哥:IT精英:IT ...

随机推荐

  1. .NET中 kafka消息队列、环境搭建与使用

    前面几篇文章中讲了一些关于消息队列的知识,就每中消息队列中间件,我们并没有做详细的讲解,那么,今天我们就来详细的讲解一下消息队列之一kafka的一些基本的使用与操作. 一.kafka介绍 kafka: ...

  2. C# WCF之用接口创建服务契约、部署及客户端连接

    服务契约描述了暴露给外部的类型(接口或类).服务所支持的操作.使用的消息交换模式和消息的格式.每个WCF服务必须实现至少一个服务契约.使用服务契约必须要引用命名空间System.ServiceMode ...

  3. python web的进化历程

    对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 阶段1 socket服务端和客户端都自己编写 实现访问8080端口,返回一个'hello wo ...

  4. 聊聊JavaScript在工作中常用的方法(一)

    一.字符串转数组(split方法) 废话少说,直接上代码: //例子1 var str="abc,def,ghi"; var strArray=str.split(",& ...

  5. elementaryos5安装chrome,修复依赖

    1.首先去下载个chrome:https://www.google.cn/chrome/ 2.尝试安装chrome:sudo dpkg -i google-chrome-stable_current_ ...

  6. Python3 注释和运算符

    Python3 注释 确保对模块, 函数, 方法和行内注释使用正确的风格 Python中的注释有单行注释和多行注释: Python中单行注释以 # 开头,例如:: # 这是一个注释 print(&qu ...

  7. Linux网络管理员:网络概论

    1.TCP/IP网络 包是适合通过网络传输的一小段数据,交换发生于网络的每一个链接点.当不同来源的包必须经过同一条线路传输数据时,这些包将被交替传输. 2.TCP/IP协议组 TCP/IP协议簇是In ...

  8. Android混淆配置及总结

    Android打正式的release包混淆是必备的,避免APP被反编译,使项目中隐秘的技术或信息被别人查看. Android studio则写在proguard-rules.pro中,当然写在prog ...

  9. java 之 构造器 static关键字

    构造器  特点: 方法名和类名一至,没有void没有返回,无参数的称为无参构造器,有参数的称为有参构造器 语法: public 类名 {数据类型 参数名} 目的:创建对象 注意:如果类中没有带有参数的 ...

  10. css-position之fixed vs sticky

    css-position之fixed  vs sticky fixed(固定定位) 元素相对于浏览器窗口是固定的,即使是窗口滚动,元素也是固定的 sticky(粘性定位) 基于用户滚定动来进行定位的, ...