1. Java环境配置
安装完JDK后配置环境变量:计算机→属性→高级系统设置→高级→环境变量。
1、系统变量→新建 JAVA_HOME 变量。变量值填写jdk的安装目录(本人是 D:\Program Java\jdk1.8.0_60);
2、系统变量→寻找 Path 变量→编辑,在变量值最后输入 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;(注意原来Path的变量值末尾有没有;号,如果没有,先输入;号再输入上面的代码);
3、系统变量→新建 CLASSPATH 变量,变量值填写:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意最前面有一点)。
4、系统变量配置完毕,检验是否配置成功 运行cmd 输入 java -version (java 和 -version 之间有空格),显示版本信息,则说明安装和配置成功。
2. Java跨平台的原理
首先什么是平台?
我们把CPU处理器与操作系统的整体叫平台。 CPU的种类很多,除去我们熟知的Intel与AMD外,还有比如SUN的Sparc,比如IBM的PowerPC等等,这些各个公司生产的CPU使用或相同或不同的指令集。指令集就是cpu中用来计算和控制计算机系统的一套指令的集合。指令集又分为精简指令集(RISC)与复杂指令集(CISC), 每种cpu都有其特定的指令集。开发程序,首先要知道该程序在什么CPU上运行,也就是要知道CPU所使用的指令集。
操作系统则是充当用户和计算机之间交互的界面软件,不同的操作系统支持不同的CPU,严格意义上说是不同的操作系统支持不同CPU的指令集。例如 windows和liunx都支持Intel和AMD的复杂指令集,但并不支持PowerPC所使用的精简指令集,而早期的MAC电脑使用的是PowerPC处理器,所以也就无法在MAC下直接安装windows,直到05年MAC改用了Intel的CPU,才使在MAC下安装windows成为可能。但问题来了,原来的MAC 操作系统也只支持PowerPC,在Intel上也不能安装,怎么办?所以苹果公司也得重写自己的MAC操作系统以支持这种变化。最后总结下,不同的操作系统支持不同的CPU指令集。
由于各操作系统支持的指令集,不是完全一致的。就会让我们的程序在不同的操作系统上要执行不同程序代码。Java开发了适用于不同操作系统及位数的java虚拟机来屏蔽各系统之间的差异,提供统一的接口。 对于我们java开发者而言,你只需要在不同的系统上安装对应的不同java虚拟机、这时你的java程序只要遵循java规范,就可以在所有的操作系统上面运行java程序了。
Java通过不同的系统、不同版本、不同位数的java虚拟机(jvm),来屏蔽不同的系统指令集差异而对外体统统一的接口(java API),对于我们普通的java开发者而言,只需要按照接口开发即可。如果我系统需要部署到不同的环境时,只需在系统上面按照对应版本的虚拟机即可。
再说下语言根据执行方式的不同分类:第一是编译执行,如C,它把源程序由特定平台的编译器一次性编译为平台相关的机器码, 它的优点是执行速度快,缺点是无法跨平台;第二是解释执行,如HTML,JavaScript,它使用特定的解释器,把代码一行行解释为机器码,类似于同声翻译,它的优点是可以跨平台,缺点是执行速度慢,暴露源程序;第三种是从Java开始引入的“中间码+虚拟机”的方式,它既整合了编译语言与解释语言的优点,同时如虚拟机又可以解决如垃圾回收,安全性检查等这些传统语言头疼的问题,所以其后微软的.NET平台也使用的这种方式。
Java先编译后解释,同一个.class文件在不同的虚拟机会得到不同的机器指令(Windows和Linux的机器指令不同),但是最终执行的结果却是相同的。
3. 常见的Java名词
EJB:Enterprise Java Bean:Java企业级容器;
JMS:Java Message Service:Java消息服务,主要实现各个应用程序间的通讯,包括点对点和广播;
JTA:Java transaction API:Java事务服务,提供分布式事务服务(只需要调用接口);
JAF:Java Action Framwork:Java安全认证框架,提供一些安全控制方面的框架;
JNDI:Java Naming & Directory Interface:Java命名目录服务;
RMI:Remote method Invocation/Internet:对象请求中介协议,主要用于通过远程调用服务。
常用工具:
Javac.exe:编译源文件(可以没有main方法);
Java.exe:运行class文件,必须要有main方法入口;
J2SDK是编译工具,而不是API;
Appretriewer.exe:用来解释执行java applet应用程序(没有main函数)。
DOC下的一些命令:
Java –version:查看Java开发工具JDK版本;
Javac Test.java(Java源文件):编译Java源文件,生成字节码文件Test.class;
Java Test.class(后缀名.class可以省略);
Javac去编译一个含有package语句的java文件要带参数:javac –d . Java文件名。
4. 面向对象编程的特征
封装
封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言的封装更为清晰、更为有力。面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个“模块”中,也就是一个类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象中的属性。把握一个原则:把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和它操作的数据放在同一个类中。
例如,人要在黑板上画圆,这一共涉及三个对象:人、黑板、圆,画圆的方法要分配给哪个对象呢?由于画圆需要使用到圆心和半径,圆心和半径显然是圆的属性,如果将它们在类中定义成了私有的成员变量,那么,画圆的方法必须分配给圆,它才能访问到圆心和半径这两个属性,人以后只是调用圆的画圆方法、表示给圆发给消息而已,画圆这个方法不应该分配在人这个对象上,这就是面向对象的封装性,即将对象封装成一个高度自治和相对封闭的个体,对象状态(属性)由这个对象自己的行为(方法)来读取和改变。
继承(extend)
1、在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。
2、子类最多只能继承一个父类。
3、Java所有类都是Object类的子类。
4、构造方法不能被继承,构造方法只能被显式或隐式调用,如果希望在子类中调用父类的构造方法,要求在子类的构造函数中调用super()方法。且必需放在子类构造函数的第一行。
5、JDK6中有202个包3777个类、接口、异常、枚举、注释和错误。
注意几点:
1、在一个子类继承的时候,实际上会继承父类之中的所有操作(属性、方法),但是需要注意的是,对于所有的非私有(no private)操作属于显式继承(可以直接利用对象操作),而所有的私有操作属于隐式继承(间接完成)。
2、在继承关系之中,如果要实例化子类对象,总是会先调用父类的构造方法,如果子类没有显式地指明使用父类的哪个构造方法,子类则默认调用无参构造方法。(此时若父类自定义了构造方法,则没有无参构造方法,会报错)。
3、关于类加载过程中代码块的执行顺序,首先是静态代码块,是最先执行的,且只在加载的时候执行一次。构造代码块在每次new对象的时候于构造方法执行之前执行,即每次调用构造方法都执行。即首先执行静态代码块、接着执行构造代码块(非静态代码块)、最后执行构造方法。
在实现继承的类被new的过程中,初始化执行顺序如下:1、实现父类的公共静态属性和静态块级代码。2、实现自身的静态属性和静态块级代码。3、实现父类的非静态属性和非静态代码块。4、执行父类的构造函数。5、实现自身的非静态属性和非静态代码块。6、执行自身的构造函数。
多态
所谓多态就是指一个引用(类型)在不同情况下的多种状态。也可以这样理解:多态是通过指向父类的指针,来调用在不同子类中实现的方法。
引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。
1、Java允许父类的引用变量引用它的子类的实例(对象)。这种转化是自动完成的。
2、java实现多态的机制靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
5. Java重载和覆盖
重载(overload)
1、简单的说:方法重载就是类的同一种功能的多种实现方式,到底采用哪种方式,取决于调用者给出的参数。
2、方法名相同。方法的参数类型,个数,顺序至少有一项不同。
3、不能通过访问权限、返回类型、抛出的异常进行重载;
4、方法返回类型可以不同。但是只是返回类型不一样,不能够构成重载。我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用map.remove(key)方法时,虽然remove方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java就无法确定编程者到底是想调用哪个方法了,因为它无法通过返回结果类型来判断。
覆盖(override)
简单的说:方法覆盖就是子类有一个方法,和父类的某个方法的名称,返回类型,参数一样,那么我们就说子类的这个方法覆盖了父类的那个方法。
1、子类的方法的返回类型,参数,方法名称,要和父类方法的返回类型,参数,方法名称完全一样,否则会编译出错。
2、子类方法不能缩小父类方法的访问权限。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。
3、子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。
6. Java访问修饰符
java中4中修饰符分别为public、protected、default、private,他们这就说明了面向对象的封装性,所以我们要适用他们尽可能的让权限降到最低,从而安全性提高。
private修饰的属性或方法为该类所特有,在任何其他类中都不能直接访问;
default修饰的属性或方法具有包访问特性,同一个包中的其他类可以访问;
protected修饰的属性或方法在同一个包中的其他类可以访问,同时对于不在同一个包中的子类中也可以访问;(因此也不能说protected修饰的属性与方法,在其他包中绝对访问不到,只要是它的子类就可以)。
public修饰的属性或方法外部类中都可以直接访问。