一、Java简单概述
一 . Java组成部分
JDK : java development kit (Java开发工具)
JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也 包括了JRE。 所以安装了JDK,就不用在单独安装JRE了。其中的开发工具:编译工具(javac.exe) 打包工具(jar.exe)等。
JRE : java runtime environment (Java运行环境)
包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一个开发好
Java程序,计算机中只需要安装JRE即可。
JVM : java Virtual Machine (Java虚拟机)
简单而言,使用JDK的开发工具完成的java程序,交给JRE去运行
- JDK = JRE + 开发工具集(例如Javac编译工具等)
- JRE = JVM + Java SE标准类库
JDK--开发环境(核心)
jdk主要包含三个部分:
- Java运行时环境,JVM
- Java的基础类库,这个类库的数量还是相当可观的
- Java的开发工具,它们都是辅助你更好地使用Java的利器jre--运行环境
JRE--运行环境
- jdk中的jre,jdk中包含的jre,在jre的bin目录里有个jvm.dll, 另,jre的lib目录中放的是一些JAVA类库的class文件,已经打包成jar文件。
- 独立的jre
不管是JDK中的JRE还是JRE既然是运行时环境必须有JVM。所以JVM也是有两个的。
JVM--转换环境
一次编译,随处运行
Java的程序也就是编译的代码都会编译为class文件,class文件就是在jvm上运行的文件,只有JVM还不能完全支持class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而jre包含lib类库。
JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改的运行。
二 . OOP五大特性
面向对象编程的最大挑战就是如何在问题空间的元素和解决方案空间的对象之间建立一对一的关联。
- 万物皆对象
- 程序就是多个对象彼此调用方法的过程
- 从内存角度而言,每个对象都是由其它更基础的对象组成的
- 每一个对象都有类型,都可以进行实例化, 类描述了具有相同特性和行为的对象集合,一个类实际上就是一个数据类型。
- 同一类型的对象可以接收相同的消息
创建抽象数据类型(类)是面向对象程序设计的基本概念之一。抽象数据类型的运行方式与内置类型几乎完全一致:你可以创建某一类型的变量(按照面向对象的说法,程其为对象或实例),然后操作这些变量(称其为发送消息或请求;你发送消息,对象就能够知道需要做什么)。
每个对象都是一个接口
所有的对象都是唯一的,但同时也是具有相同的特性和行为的对象所归属的类的一部分。程序中使用基本关键字class来引入新的类型。事实上,所有的面向对象程序设计语言都是用class这个关键字来表示数据类型。
每个对象都只能满足某些请求,这些请求由对象的接口(interface)所定义,决定接口的便是类型 ,接口确定了对某一特定对象所能发出的请求。但是,在程序中必须有满足这些请求的代码。这些代码与隐藏的数据一起构成了实现. 定义这个对象的“引用”(名),然后调用new方法来创建该类型的新对象。为了向对象发送消息,需要声明对象的名称,并以圆点符号链接一个消息请求
三 . 类间的关系
1.依赖 (dependent)
依赖关系表示一个类依赖于另一个类的定义(引用了), 与关联不同的是,类里并没有另一个类型的属性,另一个类的实例是以参量的方式传入到本类方法中去的。一般而言,依赖关系在Java语言中体现为成员变量、局域变量、方法的形参、方法返回值,或者对静态方法的调用。
在UML图中是用虚线箭头表示
class A {
private B b;//成员变量
public B show(B b) {//形参
B.show();//静态方法的调用
new B();//局部变量
return b;//返回值
}
}
class B {
static void show(){}
}
2.关联 (Association)
关联关系:指的是类与类之间的联接,它使一个类知道另一个类的属性和方法(实例变量体现)。A类依赖于B对象,并且把B作为A的一个成员变量, 则A和B存在关联关系. (依赖且是成员变量)
关联可以是双向的,也可以是单向的。两个类之前是一个层次的,不存在部分跟整体之间的关系。
在UML图中是用实线或实线箭头表示
class AClass {
private BClass b;//A单关联B
}
class BClass {//B双向关联C
private CClass cClass;
}
class CClass {
private BClass bClass;
}
按照多重性分类:
- 一对一:一个A对象属于一个B对象,一个B对象属于一个A对象。
- 一对多:一个A对象包含多个B对象。
- 多对一:多个A对象属于一个B对象,并且多个A对象中的每个A对象只能属于一个B对象。
- 多对多:一个A对象属于多个B对象,一个B对象属于多个A对象。
3.聚合(aggregtion)
- 聚合关系是关联关系的一种特例,他体现的是整体与部分,是一种“弱拥有”的关系,即has-a的关系。聚合是整体和个体之间的关系。
- 例如,汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。
- 与关联关系一样,聚合关系 也是通过实例变量实现的。但是关联关系所涉及的两个类是处在同一层次上的,而在聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。
- 聚合关系表示整体和个体的关系,整体和个体可以相互独立存在,一定是有两个模块分别管理整体和个体。
在UML图中是用空心箭头+实线箭头表示
class Iphone {//整体(手机)
private Card card;//成员变量
}
class Card {//个体(卡)
}
4.组合(composition)
- 组合关系是关联关系的一种特例,他体现的是一种contains-a(包含)的关系,这种关系比聚合更强,也称为强聚合。
- 它要求普通的聚合关系中代表整体的对象负责代表部分对象的生命周期,组合关系是不能共享的。代表整体的对象需要负责保持部分对象和存活,在一些情况下将负责代表部分的对象湮灭掉。代表整体的对象可以将代表部分的对象传递给另一个对象,由后者负责此对象的生命周期。换言之,代表部分的对象在每一个时刻只能与一个对象发生组合关系,由后者排他地负责生命周期。部分和整体的生命周期一样。
- 部分和整体是不能分开的,一定是在一个模块中同时管理整体和个体,生命周期必须相同(级联)。(人和心脏)
在UML类图中,组合通常使用实心菱形+实线箭头表示
class Iphone {//整体(手机)
//手机出厂是必须有屏幕,手机销毁屏幕也G
private Screen screen=new SCreen();
public Iphone() {
screen = new Screen();
}
}
class Screen {//个体(屏幕)
}
5.泛化 (generalization)
泛化关系可以说是继承关系,是依赖关系的特例。
在UML类图中,组合通常使用实线空心三角箭头表示 带箭头的实线,箭头指向父类
6 .实现关系(Implementation)
B类实现了A接口,就说A接口和B类之间有实现关系,实现关系是依赖关系的特例。
在UML类图中,组合通常使用虚线空心三角箭头表示 带箭头的虚线,箭头指向父类
四 . Java主要特性
- Java语言是强制面向对象的。Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。
- Java语言是分布式的。Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
- Java语言是健壮的。Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。
- Java语言是安全的。Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。如:安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查。
- Java语言是体系结构中立的。Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件),然后可以在实现这个Java平台的任何系统中运行。
- Java语言是解释型的。如前所述,Java程序在Java平台上被编译为字节码格式,然后可以在实现这个Java平台的任何系统的解释器中运行。先编译后解释。
- Java是性能略高的。与那些解释型的高级脚本语言相比,Java的性能还是较优的。
- Java语言是原生支持多线程的。在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。
五、 Java程序运行机制及运行过程
- 特点一:面向对象
- 两个基本概念:类、对象
- 三大特性:封装、继承、多态
- 特点二:健壮性
- 吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制
- 主要是因为Java中有一种机制:自动垃圾回收机制(GC机制—garbage collection)。因为Java语言引入了自动垃圾回收机制(GC机制),Java程序启动了一个单独的垃圾回收线程,时刻监测内存使用情况,在特定时机会回收/释放垃圾数据,这样会让内存时刻处于最好的状态。
- 特点三:跨平台性 (针对字节码)
- 跨平台性:通过Java语言编写的应用程序在不同的系统平台上都可以运行。“Write once , Run Anywhere”
- 原理:只要在需要运行java 应用程序的操作系统上,先安装一个Java虚拟机(JVM Java Virtual Machine) 即可。由JVM来负责Java程序在该系统中的运行。
Java两种核心机制
1、Java虚拟机(Java VirtalMachine)
- JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指令,管理数据、内存、寄存器。
- 对于不同的平台,有不同的虚拟机。
- 只有某平台提供了对应的java虚拟机,java程序才可在此平台运行。
- Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行
2、垃圾收集机制(Garbage Collection)
- 不再使用的内存空间应回收——垃圾回收。
- 在C/C++等语言中,由程序员负责回收无用内存。
- Java 语言消除了程序员回收无用内存空间的责任:Java程序启动了一个单独的垃圾回收线程,时刻监测内存使用情况。并在JVM空闲时,检查并释放那些可被释放的存储空间。
- 垃圾回收在Java程序运行过程中自动进行,程序员无法精确控制和干预。
六 Java注意事项
- 尽量使用final修饰符
- 尽量重用对象
- 尽可能使用局部变量
- 及时关闭流
- 尽量减少对同一个变量的重复计算
- 尽量采用懒加载的策略,即在需要的时候才创建
- 慎用异常
- 不要在循环中使用trycatch,应该把其放在最外层
- 尽量能估计到待添加的内容的长度,为底层以数组方式实现的集合、工具类指定初始长度
- 当复制大量数据时,使用system.arraycopy命令
- 乘法和除法使用移位操作
- 循环内不要不断创建对象引用
- 基于效率和类型检查的考虑,应该尽可能使用array,无法确定数组大小时才使用ArrayList
- 尽量使用hashmap、ArrayList、stringbuilder,除非线程安全需要,否则不建议使用hashtable、vector、stringbuffer,后三者由于使用同步机制而导致了性能开销。
- 不要将数组声明为public static final
- 尽量在合适的场合使用单例模式
- 尽量避免使用静态变量
- 及时清除不再需要的会话
- 实现RandomAccess接口的集合比如ArrayList,应当使用最普通的for循环而不是foreach循环
- 使用同步代码块代替同步方法
- 将常量声明为static final,并以大写命名
- 不要创建一些不使用的对象,不要导入一些不使用的类
- 程序运行过程中避免使用反射
- 使用数据库连接池和线程池
- 使用带缓冲的输入输出流进行IO操作
- 顺序插入和随机访问比较多的场景用ArrayList,元素删除和中间插入比较多的场景使用LinkedList
- 不要让public方法中有太多的参数
- 字符串变量和字符串常量equals的时候将字符串常量写在前面
- 请知道,在java中if (i == 1)和if (1 == i)是没有区别的,但从阅读习惯上讲,建议使用前者
- 不要对数组使用toString方法
- 不要对超出范围的基础数据类型做向下强制类型转型
- 公用的集合类中不使用的数据一定要及时的remove掉
- 把一个基本类型转为字符串,toString最快,String.valueOf次之,数据+“”最慢
- 使用最有效率的方法去遍历map
- 对资源的close()建议分开操作
- 一行代码尽量只写一遍
最新文章
- 【BZOJ-3747】Kinoman 线段树
- Ajax请求安全性讨论
- Windows Azure 虚拟机的IP地址操作
- 在java项目中使用AES256 CBC加密
- linux编译安装MySQL
- unity3d DefineManager 全局宏定义
- 安卓学习笔记---Activity
- eclipse插件安装 (zhuan)
- Integer cache
- PHP自定义函数使用外部变量
- Junit4 架构设计系列(1): Request,ClassRequest 和 RunnerBuilder
- HeadFirst设计模式笔记:(六)命令模式 —— 封装调用
- MVC 用法小语法摘录
- Android 应用程序窗口显示状态操作(requestWindowFeature()的应用)
- Using QueryRunner to insert ArrayList<;Object[]>;
- 8. 同步锁Lock
- Vue+Django2.0 restframework打造前后端分离的生鲜电商项目(2)
- 5.HTML+CSS制作一颗流星
- io.netty.resolver.dns.DnsNameResolverContext
- scrapy之downloader执行流程