java学习笔记--随记

来源:互联网 发布:双色球参选数据 编辑:程序博客网 时间:2024/05/14 17:45

<这是一个自学笔记,简要记录,只为加深理解记忆,希望对大家也有帮助>

java相关:

jdk 是java的开发包即开发工具,它提供了java的开发环境和运行环境,是面向开发人员使用的SDK,提供的java API,将java源码编译为class字节码文件,通常jdk中就包含了jre;jre 是java运行环境,用于执行java程序,是面向Java程序的使用者,而不是开发者(当然开发者也是需要的)。




编译执行:

java从源文件创建到程序运行大致需要两个步骤:1.源文件有编译器编译成字节码2.字节码由虚拟机解释执行(由于既要编译又要解释执行所以java又叫半解释语言);

执行过程大概又能分为两个过程:1.类的加载2.类的执行。需要说明的是jvm在程序主动使用类的时候才回去加载,并且只加载一次。

下面是执行的详细步骤

1.)在编译好得到AppMain.class文件后,在命令行上敲java AppMain,系统就会启动jvm进程,jvm进程从classpath路径找到AppMain.class的二进制文件,将AppMain类信息加载到运行时数据区的方法区内,这个过程叫做AppMain类的加载。

2.)然后jvm寻找AppMain的主函数入口并执行main

3.)若new一个animal类,则加载animal类之后,jvm首先做的就是在堆区中为animal分配内存,然后调用构造函数初始化animal实例,这个animal实例持有指向方法区的animal类的类型信息(其中包含方法表,java动态绑定的底层实现)的引用。

4.)当执行animal中的一个eat方法时,jvm先根据animal引用找到animal对象,然后根据animal对象持有的引用定位到方法区中的animal类的类信息的方法表,并获取到eat方法的字节码地址。

5.)执行eat函数。

特别说明:java中使用的public、protected的实例方法都使用动态绑定机制,所有的私有方法、静态方法、构造器、初始化方法都采用静态绑定机制;而使用动态绑定机制的时候才会使用方法表;

一、java技术3大特性:

1、JVM 

java虚拟机的基本功能如下:

(1) 通过classloader寻找和裝载class文件

(2)解释字节码成指令并执行,提供class文件运行环境

(3)进行运行期间垃圾回收

(4)提供与硬件交互的平台

其它:

虚拟机并不关心Class的来源是什么语言,只要它符合Java class文件格式就可以在Java虚拟机中运行。使用Java编译器可以把Java代码编译为存储字节码的Class文件,使用JRuby等其他语言的编译器一样可以把程序代码编译成Class文件

编译器编译java源代码后,会生成字节码,这是为JVM生成的机器码指令。

<图1>




2、垃圾回收

利用系统级线程跟踪内存分配,在java虚拟机空闲周期,垃圾收集线程检查并释放那些可被释放的内存。

3、代码安全

(1)第一关:编写的代码首先要被编译成class文件,如果代码写的有问题,在编译期间就有错误提示。

(2)第二关:再通过编译后,在类装载的时候会进行类装载检查,把本机上的类和网络资源的类相分离,由此限制“特洛伊木马”应用。

(3)第三关:类装载后,在运行前,还会进行字节码校验,以判断程序是安全的。

(4)第四关:如果程序在网络上运行,还有沙箱保护,即程序没有获得授权,只能在沙箱限定范围内运行。

<图2>

二、java开发环境配置

<略>

三、java之helloworld

public class HelloWorldApp{//声明类

public static void main(String args[]){ //声明程序执行起点,static是告知main()是用于HelloWorldApp类

System.out.println("hello world!"); //显示到标准输出流

}

}


四、关键字,java语言自身保留的,由java开发和运行平台认识。

列出部分含义:

abstract:标明类或类中方法是抽象的

catch:处理例外情况,用来捕捉异常

extends:用来表明一个类是另一个类的子类

final:用来标明一个类不能派生出子类,或类中的方法不能被覆盖,或声明一个变量是常量

finally:异常处理,声明一个肯定会被执行到的块

implements:声明一个类实现了给定接口

import:表明要访问指定的类或包

instanceof:用来测试一个对象是否为指定类的实例

interface:接口

native:用来声明一个方法是由与机器语言相关实现的(如c、c++)

new:用来申请新对象

package:包

private:私有模式

protected:保护模式

public:公共模式

return:从方法中返回值

static:表明域或方法是静态的,属于类的

super:当前对象的父类对象的引用

synchronized:表明一段代码执行需要同步

this:当前对象的引用

throw:抛出一个异常

throws:声明方法中抛出的所有异常

try:尝试一个可能抛出异常的程序块

volatile:表明两个或多个变量必须同步发生变化

assert:声明断言

enum:声明枚举类型

关键字不是一成不变的,可能随发布版本变动;所有关键字都小写;boolean是关键字,true和false不是关键字;表示类的关键字是class。

五、java类和对象

(1)对象包括实体对象(看得见摸得着的具体事物)和逻辑对象(存在思维中的东西的反应);

(2)对象的抽象,如对张三、李四“人”可以从身高体重爱好等方面描述,而这种描述就构建出了“人”这个对象;

(3)java中的类就是把抽象的对象用类来表达;

(4)java中的对象是一个类的实例,一个实际例子;

(5)类可以称作是模板,即一个对象模型;

1、面向对象的3大特征

(1)封装 :把东西包裹起来,是java相面对象特点的表现,封装是一种信息隐藏技术。也就是说如果使用了封装技术,别人只是用我们做出来的东西,而看不见我们所做东西的内部结构。

封装的功能:

---隐藏对象的实现细节

---迫使用户去使用一个界面访问数据

----使代码更好维护

(2)继承:是一种关系,继承可以使得子对象具有父对象的各种属性和方法,而不用再次编写相同的代码,在继承的同时,还可以重新定义某些属性,并重写某些方法,即覆盖父对象的原有属性和方法,使其获得与父对象不同的功能。

(3)多态:同一行为的多种不同表达,或同一行为多种不同实现就叫多态。

2、java类基本构成

包定义语句

import语句

类定义{

成员变量

构造方法

成员方法

}

(1)包是类、接口或其它包的集合,包主要用来将类组织起来成为组,从而对数目众多的类进行层次式管理,简而言之:从逻辑上讲包是一组相关类的集合,从物理上讲,同包即同目录。java是一个单根系统,最终的根就是“Object”。

(2)import 为了使用某一个包的成员,我们需要在java程序中导入该包,import语句为编译器指明了寻找类的途径。

3、访问修饰符

为了实现信息封装和隐藏,java对类中属性和方法进行有效访问和控制,将他们分为4个等级:

private、无修饰符、protected、public

4、构造方法

(1)创建对象时,会自动调用构造方法来初始化成员变量。

(2)构造方法没有返回,名称与类名相同,一般以public来说明;

(3)如果不写构造方法,java默认提供一个无参,空体的方法

(4)当定义构造方法后,系统不再提供默认的

(5)this作为方法名初始化对象时,相当于调用本类其它构造函数,它必须作为构造方法的第一句

5、包装类

(1)基本数据类型的包装类,由于基本数据类型不支持面向对象的机制,当基本数据类型转换为String时会很麻烦,于是采用了包装类来处理。

8个基本数据类型对应8个包装类。包装类常用功能就是将字符串类型转成为基本数据类型,如:String str = “123”;int a = Integer.parserInt(str);

(2)自动包装和自动解包,Integer a1 = 5;//自动包装 int a2 = new Integer(5);//自动解包


六、java高级类特性

1、继承

(1)extends关键字

(2)初始化子类,必先初始化父类

(3)单继承,java允许一个类仅能继承一个其它类,即一个类只能有一个父类,后面还有个叫接口的东西,允许了多继承的大部分好处。(单继承和多继承的优点是面向对象程序员广泛讨论的话题)(mark:多继承有啥缺点呢?)

(4)构造方法不能被继承,换句话说类得到构造方法只有两种方法,或者重写构造,或者是一个默认的构造,子类不会继承父类的构造方法

(5)关键字super,可被用来引用该类的父类成员变量或方法,父类行为被调用就好像行为是本类的一样,而且调用行为不必发生在父类中

super的功能:

获取父类中被子类隐藏了的数据成员;

获取已经覆盖了的方法;(也可以从祖先类中获取,具有追溯性,一直向上找,直到找到为止,很重要的一个特点)

作为方法名表示父类构造方法;(调用父类构造)

(6)调用父类构造,无论super还是this都必须放在构造方法的第一行

2、方法的覆盖和重载

(1)方法的覆盖:在类继承中,子类可以修改从父类继承来的行为,即有不同功能,但又有着相同的:名称、返回类型、参数列表

哪个方法被调用:规则是,编译时看数据类型,运行时看实际对象类型(new后跟的构造方法是哪个类的),一句话new谁就调用谁的方法,这里也是多态性的一个特性

覆盖方法的规则:

覆盖方法的返回类型、方法名称、参数列表与它所覆盖的方法相同;

覆盖方法不能比它所覆盖方法的访问性差,即权限不允许变小;

覆盖方法不能比它所覆盖方法抛出更多的异常;

(2)方法的重载:就是同一方法,有多个不同版本,即方法名称相同,参数列表不同,返回类型可以相同也可以不同;

构造方法也是可以重载的;

3、java中的多态

(1)多态是同一行为具有多个不同表现形式或形态的能力。

Employee e = newEmployee ();

Employee e = new Manager();

一个员工既可以是普通员工,也可以是经理,这就是多态

(2)instanceof运算符 多态性带来一个问题,就是如何判断一个变量实际引用的类型,c++使用RTTI,java使用instanceof

(3)动态绑定

程序运行以前执行绑定(由编译器和链接程序,如果有的话),这叫做早期绑定;

后期绑定叫作动态绑定,由语言实现;如果一种语言实现了后期绑定,同时必须提供一些机制,可在运行期判断对象类型,并分别调用适当的方法;

java采用的都是后期绑定技术,除非他是一个final。

4、static修饰符

static表示静态的,类中的静态变量和静态方法能够和类名一起使用,不需要创建对象来访问静态成员,所以静态修饰的变量又称为类变量,这和实例对象变量值不同,而静态变量只会有一个内存空间,即使多个实例也只共享同一个内存空间。访问有两种方式,对象或类名如Employee.salary

在类装载(类是由类加载器加载到内存中)的时候static就会被初始化。

有关静态变量或方法的要点:

(1)一个类的静态方法只能访问静态属性

(2)一个类的静态方法不能直接调用非静态方法

(3)如访问控制权限允许,static属性和方法可以使用对象名+‘.’方式调用,当然也可使用实例+‘.’方式

(4)静态方法中不存在当前对象,因而不能使用this,也不能使用super

(5)静态方法不能被非静态方法覆盖

(6)构造方法不允许声明为static

(7)静态初始器在类第一次使用时,只被初始化一次(只运行一次)

(8)静态import,静态引用可以使我们像调用本地方法一样调用这个引入的方法 (mark:那该方法也是静态的吗?)

5、final 最终态

final规则:

final标记的类不能被继承;

final标记的方法不能被子类重写;

final标记的变量(成员和局部)成为常量,只能赋值一次;

final标记的成员变量必须在声明的时候同时赋值,如果在声明的时候没有赋值,那么只有一次赋值的机会,而且只能在构造方法中显示赋值,然后才能使用;

final标记的局部变量可以只声明不赋值,然后在进行一次性赋值;

final一般标记那些通用性的功能、实现方式或取值不能随意被改变的成分,以避免被误用;

(public final int max = 25;)

java允许final被用在类上,如果这样做了(放在class前面),如果这样做了,类便不能派生出子类,这样做是出于安全原因,如String类是一个final类,对字符串的引用,就保证是String的引用,而不是某个其它类的字符串,因为String可能被恶意修改过

被标记为static或private的方法被自动的final,因为动态联编在这两种情况下都不能应用;

0 0