JavaSE 拾遗(4)——JavaSE 面向对象程序设计语言基础(4)...封装
来源:互联网 发布:人工智能产业发展规划 编辑:程序博客网 时间:2024/04/29 09:58
前面一篇文章《JavaSE 拾遗(3)——JavaSE 面向对象程序设计语言基础(3) 》主要说了 java 应用程序的倒数第二层组成元素——函数,下面接着说 java 应用程序倒数第三层组成元素——类、对象,对象是类动态的概念,类的功能都要转化为对象才能实现。封装这里讲述了什么是封装,什么时候使用封装,如何定义一个类来实现封装。
先说一下面向对象的概念,面向对象是一种把这个世界看做为对象组成的思维方式。面向对象编程是把这个世界看做对象组成,并用面向对象的语言来描述我们对世界里的对象的认识的表达方式,我们认识这个对象的世界主要就是使用 简化、对比等抽象思维方式。面向对象语言中的封装、继承、多态就是这些思维方式的对应形式。
怎么学习面向对象编程
- 掌握一种面向对象语言的语法——java
- 掌握面向对象的思维方式原则——先整体,后局部;先抽象,后具体;先确定谁来做,后确定怎么做
- 熟悉面向对象的设计原则——“开-闭”原则;里氏代换原则; 依赖倒转原则;合成/聚合复用原则; 迪米特法则; 接口隔离原则(看 这里 老外怎么解释OOD)
- 掌握面向对象设计模式
- 封装
- 继承
- 多态
封装
- 类和对象
- 成员变量和局部变量
- 匿名对象
- 构造函数
- 构造代码块
- this 关键字
- static 关键字
- 内部类
类和对象
成员变量和局部变量
匿名对象
构造函数
构造代码块
/**需求:演示构造函数、构造代码块、默认初始化的先后顺序思路:步骤:*/public class Test{private int i = 8;{i = 9;}public Test(){i =10;} public static void main(String[] args) { System.out.println(new Test().i); } }javap 反汇编后:
this 关键字
/**需求:演示 super 的jvm原理思路:步骤:*/public class Test extends Father{public int i = 10; public static void main(String[] args) { new Test().println(); }public void println(){System.out.println(super.i);}}class Father{protected int i = 12;}javap 反汇编结果:
static 关键字
- 随着类的加载而加载
- 优先于对象的存在
- 被所有对象所共享
- 可以直接被类名所调用
/**需求:演示 static 的原理思路:步骤:*/public class Test{public static int i = 10;static{i = 11;} public static void main(String[] args) { }}
对于static 字段的访问,jvm 提供专门的指令 putstatic getstatic。
- 加载类对应的 *.class 文件,创建 Class 对象实例,但是保存在方法区
- 执行该类 static 代码块,给类进行初始化
- 在堆内存中开辟空间,分配内存地址
- 在堆内存中建立对象特有属性,并进行默认初始化
- 对属性进行显示初始化
- 对对象进行构造代码块初始化
- 对对象进行对应构造函数初始化
/**需求:实现饿汉式单例设计模式思路:用 static 把对象创建封装在类内部步骤:1.将构造函数私有化2.在类中创建一个本类对象3.提供一个可以方法可以获取到该对象*/class Single{private static Single single = new Single();private Single(){}public static Single getInstance(){ return single;}}class SingleDemo{public static void main(String[] args) {Single single = Single.getInstance();System.out.println("Hello World!");}}线程安全的懒汉式
/**需求:实现线程同步的懒汉式单例设计模式思路:用 static 把对象创建封装在类内部,延迟创建对象步骤:1.将构造函数私有化2.提供一个可以获取到该类对象的方法,并既在第一次访问该方法的时候才创建对象,以后都是直接返回已经创建的对象*/class Single{private static Single single = null;private Single(){}public static Single getInstance(){if(single == null){synchronized(Single.class){if(single == null){new Single();}}}return single;}}class SingleDemo{public static void main(String[] args) {Single single = Single.getInstance();System.out.println("Hello World!");}}
内部类
内部类的意思就是将类的定义放在另一个类的内部。有时合理的内部类使用会使代码更加简洁,令程序更加巧妙。作为外部类的成员,内部类可以访问外部类私有的成员变量。
静态内部类不可以使用外部类的非静态成员。当内部类中的成员为静态时,内部类必须为静态的。
局部内部类只能访问 final 修饰过的局部变量,因为非 final 局部变量存在于 java 栈的栈帧的局部变量表中,而内部类对象存在于堆中,所以内部类对象的生存周期可能比非 final 局部变量要长。更详细的介绍为什么内部类只能访问 final 修饰的局部变量,看这里
使 用匿名内部类应该注意:
a) 匿名内部类不能有构造方法
b) 匿名内部类不能定义任何静态成员、方法和类。
c) 匿名内部类不能是public,protected,private,static。
d) 只能创建匿名内部类的一个实例。
e) 一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
f) 因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
/**需求:演示内部类思路:成员访问的一些规则: 1.内部类 和 他的所属类 之间成员的相互访问,成员有重名的情况 2.其他外面的类 访问内部类的成员 内部类定义在外部类成员位置上的时候,可以用成员修饰符修饰。private static 静态内部类只能使用外部类的静态成员。内部内既然作为成员,那么就很少对外开 放了。 当内部类定义了静态成员,该内部类必须是 static 的。 匿名内部类,是局部内部类的一种简写形式。步骤:*/class OutsideClass{private int v = 0;//1.成员内部类演示,private 成员类用得较多class InsideClass{int v = 1;void function(){int v = 2;System.out.print(v);System.out.print(this.v);System.out.print(OutsideClass.this.v);//打印结果是 210}}//2.静态内部类演示static class StaticInsideClass{int v = 1;void function(){int v = 2;System.out.print(v);System.out.print(this.v);//System.out.print(OutsideClass.this.v);//报错,只能访问外部类静态成员}}void function(){//3.局部内部类,只能访问外面 final 变量class LocalInsideClass{void function(){System.out.println("局部内部类");}}//4.匿名内部类演示,用得较多,Comparator 就有使用new OutsideClass(){void function(){System.out.println("匿名内部类");}}.function();}}class InsideClassMain{public static void main(String[] args) {// 这种外部使用内部内创建对象的情况基本不使用,因为内部类一般都封装为 private 成员类//OutsideClass.InsideClass part = new OutsideClass().new InsideClass();OutsideClass part = new OutsideClass();part.function();}}
如图,javac 会给所有的非静态内部类自动的添加一个字段,用来保存外部类对象的引用,在内部类的对象中访问外部类对象字段的时候,会使用这个引用来访问,但是 在内部类中访问外部类字段,不是使用 getfeild setfeild 指令,而是调用外部类的 access$000 这个函数,这个函数却不是我们自己定义的。
- JavaSE 拾遗(4)——JavaSE 面向对象程序设计语言基础(4)...封装
- JavaSE 拾遗(1)——JavaSE 面向对象程序设计语言基础(1)...基本概念和常识
- JavaSE 拾遗(2)——JavaSE 面向对象程序设计语言基础(2)...变量
- JavaSE 拾遗(3)——JavaSE 面向对象程序设计语言基础(3)...函数
- JavaSE 拾遗(5)——JavaSE 面向对象程序设计语言基础(5)...继承和多态
- JavaSE 拾遗(2)——JavaSE 面向对象程序设计语言基础(2)...变量
- JavaSE面向对象-封装
- JavaSe基础XX05——面向对象
- JavaSe基础XX06——面向对象
- JavaSe基础XX07——面向对象
- JavaSe基础XX08——面向对象
- JavaSe基础XX09——面向对象
- JavaSE 拾遗(16)——JavaSE 高新技术基础增强...反射
- JavaSE 拾遗(17)——JavaSE 高新技术基础增强...注解
- JavaSe ——2、面向对象(继承、封装、多态)
- javaSE-面向对象-封装特性
- JavaSE面向对象之封装
- JavaSE面向对象封装笔记
- 为什么使用存储过程
- C++全排列
- 一个脚本解释器的实现与分析(HOC改进版)
- HDU 4551 生日猜猜猜
- UVA 10125 - Sumsets
- JavaSE 拾遗(4)——JavaSE 面向对象程序设计语言基础(4)...封装
- WinCE6.0 usb转串口的问题相关转载
- Oracle数据库的连接研究
- Linux 架設使用 SSH 共享存取的 Git Server
- 排序算法 总结&思考(一)
- qt for android 配置指南
- HUST 1000 A+B
- java基础System,RunTime,Date,Math对象
- Linux下编译与ARM下移植opencv1.0.0详细步骤