JDK1.2:
1, J2ME
2,J2SE
3,J2EE
J2ME:主要用于控制移动设备和信息家电等有限存储的设备(嵌入式?)
J2SE:整个jave技术的核心和基础,他是JEME和J2EE的基础
J2EE:java技术中应用最广泛的部分,提供企业应用开发相关的完美解决方案
======================================================
java语言需要先编译,后解释执行
负责解释执行的是java虚拟机,也就是java virtural machine JVM
JVM 是可以运行java字节码文件的虚拟计算机。 所有平台上的JVM想编译器提供相同的编程接口,而编译器只需要面向虚拟机,生成虚拟机所能理解的代码,然后由虚拟机来解释执行。
======================================================
java运行时环境:JRE Java Runtime Enviromnet,他是运行java程序的必须条件。
JRE 包含JVM, JVM是运行java程序的核心虚拟机,但是运行java程序不仅需要虚拟机,还需要其他类加载器,字节码校验器以及大量的基础类库,所以JRE除了报刊JVM以外,还需要其他环境支持。
======================================================
JDK全程是Java SE Development Kit 即java标准版开发包,包含了
java编译器, java运行时环境(上面提到的JRE)以及常用的java类库
======================================================
Sun 把java分为 Java SE JavaEE Java ME三个部分:
为 Java SE提供了JDK
为 Java EE提供了Java EE SDK
Java EE SDK包含了JDK
======================================================
Eclips
JBuilder
都是IDE
======================================================
string类型,就是一个类,表示、存储一个字符串,提供了很多已有的方法来处理从字符串
======================================================
java中定义数组使用这种格式:
type [] name;
这样比较好:这说明定义个了一个变量,名字是“name”, 类型是 “type[]"
type[]的确是一种新的类型。
======================================================
extends 关键字,用来让子类继承父类
C++中使用这个语法:
class Y: public class X
类Y 继承自类X
======================================================
定义一个类
[修饰符] class 类名
{
零到多个构造器定义
零到多个属性
零到多个方法
}
修饰符可以是public 或者final
当用final来修饰的时候,这个类不能被继承
java语言用new来调用构造器,也就是说使用new来创建一个类的实例。
如果程序员没有为一个类编写构造器,那么系统会为该类提供一个默认的构造器。
一旦程序员为这个类提供了构造器,系统将不再为该类提供构造器。
======================================================
类中的成员之间可以互相调用。
但是static修饰的成员不能反问没有static修饰的成员
包括函数访问变量?????
======================================================
[修饰符] 属性类型 属性名字 [=默认值];
修饰符可以是 public protected private
static, final
其中 public protected private 只能是出现其中一个,可以和static final组合起来修饰属性。
final变量只能被赋值一次,之后不能再改变
======================================================
根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,
它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。
final类不能被继承,没有子类,final类中的方法默认是final的。
final方法不能被子类的方法覆盖,但可以被继承。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final不能用于修饰构造方法。
注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。
======================================================
当实例化一个类的对象的时候,类的各个成员变量会被分配给空间,每个对象实例,都有各自
独立的内存空间。
static 修饰变量的时候,这个变量的值变成了公共的这个类的多个实例之间公共的变量,不管有
多少个类对象实例,内存空间只有一份,既然是公共的,我们就不通过每个实例,也就是对象的名称来
访问这个变量,而是通过类型名称,也就是类名,来访问这个变量。
也就是说,static修饰的类成员变量,是所有的这个类的对象实例共享的一个变量。
---------------------------------------------------------
static修饰的方法,也差不多。
使用类名来直接调用这个方法。
不过这种方法中不能使用使用this和super关键字,因为这两个都和具体的类的实例关联。
同时这个方法中只能访问static修饰的变量和方法。
因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
======================================================
java里的引用就是C中的指针,只不过java把这个指针封装起来,避免开发者进行繁琐的指针操作
当一个对象被创建成功以后,他保存在堆内存中,java程序不允许直接访问堆内存中的对象,
只能通过该对象的引用操作该对象。
也就是说,不管是数组,还是对象,只能通过引用来访问他们。
JAVA没有指针!!!!
引用变量本身只是存储了一个地址,并没有包含任何实际的有效数据,但他指向了实际的类实例对象。
当我们访问引用变量的属性和方法的时候,实际上就是访问了引用变量指向的类对象的属性和方法。
一言以蔽之,就是把C中指针的,地址解析部分*p屏蔽掉了。 不需要操作复杂的地址,编译器给咱做了。
堆内存的对象可以有多个引用,也就是多个引用指向同一个对象。
======================================================
大部分时候,普通方法访问其他方法、属性的时候,不需要this指针,但如果方法中有个局部变量
和类的属性同名,那么必须使用this前缀。
======================================================
在结构化编程语言中,也就是C中,函数是一等公民,整个软件由一个一个函数构成。
在面向对象的编程语言中,类是一等公民,整个系统由一个一个的类构成,因此在java语言中 ,
方法不能单独存在,方法必须属于类(static修饰的)或者对象(没有static修饰的)。
======================================================
JAVA的不同
方法不能独立定义,只能在类中定义。怪不得,奶奶的,我说那么2的code!!!
方法可以属于一个类,不属于某一个实例。
java中没有指针,引用替代了指针,同时引用就是指针。
final变量的存在。
java只有一种参数传递方法,值传递,所谓的值传递,就是把实际参数的副本(复制一份)传递进去
没有指针传递(C&C++)和引用传递(C++)
======================================================
java只有一种参数传递方法,值传递,所谓的值传递,就是把实际参数的副本(复制一份)传递进去
没有指针传递(C&C++)和引用传递(C++)
======================================================
可变参数:
当使用可变参数的时候,函数调用时候传入的多个参数,在函数体内被当成数组使用。
这个和直接传递一个数组的不同在于,如果是直接传入一个数组,在函数调用之前,我们需要把要传递的
多个参数人为的放入一个数组中,意味着我们得定义数组,为数组赋值,这些操作。
而使用可变参数,我们直接扔进去 就行,我估计又是编译器帮我们做了上述的操作。
----------------------
不过数组形式的参数可以放在参数列表的任意位置,但是可变参数只能放到参数列表最后。
======================================================
方法重载:
同一个类
同一个方法名字
不同的参数列表
======================================================
成员变量和局部变量:
成员变量:类本身的变量
局部变量:方法中的变量
局部变量分为三种:
1) 形参
2) 方法局部变量
3) 代码块局部变量!!!
形参不需要初始化,但是方法局部变量和代码块局部变量必须初始化才可以访问。
======================================================
java 的包机制需要两个方面保证:
1)源文件使用package关键字指定
2)class文件必须放到跟包名字相对应的目录中去
======================================================
java默认所有源文件中导入java.lang包下所有的类,因此所有程序中可以使用string system类时都不需要导入包。
可以导入某一个类的静态属性
======================================================
通常建议为java类保留无参数的默认的构造器,因此,如果为一个类编写了有参数的构造器,
通常建议再为这个类编写一个无参数的构造器
======================================================
多个构造器,之间可以互相调用,使用this();
这个时候,会根据参数的情况,调用先关的构造函数。
======================================================
继承
======================================================
class subclass extends superclass{};
子类不能获得父类的构造器
java只能有一个直接父类
======================================================
方法重载:
两同两小一大:
1)函数名相同
函数参数列表相同
2)子类返回值类型应该比父类的更小或者相等
子类抛出的异常类应该比父类更小或相等
3)子类的访问权限应该比父类的更大或者相等
======================================================
在子类中重写父类的方法后,又需要调用父类的原先方法:
super.func();
======================================================
java程序当创建一个类的引用的时候,系统会默认创建这个类父类的对象。
======================================================
overload重载,在一个类中,同一个方法,有多个实现,通过参数列表的不同,来调用想对应的函数。
override重写,是子类对父类方法的重新实现。
两者没有联系,触了名字重复了一个字
======================================================
多态
======================================================
貌似java的多态,不像C++中那么麻烦,C++还需要virtual关键字来描述方法,java只要在
创建这个对象的时候,使用合适的类型,就可以???
属性不具备多态性
======================================================
java只有单重继承,c++可以有多重继承,这里直说单重继承:
c++为含有虚函数的类维护了一张表,表中存储了所有虚函数的指针
java为所有类都维护了一张表,里面存储了类所有函数的指针,没有虚函数这一说了
======================================================
1) 单继承情况下,两者实现在本质上相同,都是使用方法表,通过方法表的偏移量来调用具体的方法。
2) Java 的方法表中包含 Java 类所定义的所有实例方法,而 C++ 的方法表则只包含需要动态绑定的方法 (virtual 修饰的方法 )。这样,在 Java 下所有的实例方法都要通过方法表调用,而 C++ 中的非虚方法则是静态绑定的。
3) 任意 Java 对象只 “指向”一个方法表,而 C++ 在多重继承下则可能指向多个方法表,编译器保证这多个方法表的正确初始化。
4) 多层继承中 C++ 面临的主要问题是 this 指针的调整,设计更精巧更复杂;而 Java 在接口调用时完全采用搜索的方式,实现更直观,但调用效率比实例方法调用要慢许多。
可以看到,两者之间既有相似之处,也有不同的地方。对于单继承的实现本质上是一样的,但也有细微的差别(如方法表);差别最大的是对于多重继承(多重接口)的支持。实际上,由于 C++ 是静态编译型语言,它无法像 Java 那样,在运行时刻动态的“查找”所要调用的方法。
======================================================
当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,
但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
======================================================
初始化块:
初始化块是java类中个可以出现的第四种成员,前面三种是属性,方法,和构造器。
一个类中可以有多个初始化块,相同类型的初始化块之间有顺序,前面定义的初始化块先执行,
后面定义的初始化块后执行
如果多个构造器有相同的代码,那么为了使得代码更加简介,可以把公共部分拿到初始化块中去执行!!
======================================================
如果使用static修饰初始化块:
那么初始化块的code会在类加载的时候执行,而不是在创建对象的时候执行。
======================================================
所有的引用类型的变量都来自Object类,这个估计跟我们C++/C里面的指针一样,本身没什么类型,他们都可以当成
Object类型的变量来使用,但基本类型的变量不可以,所以我们需要为每一个基本数据类型设计一个包装类。
在创建一个基本类型变量的时候,可以通过对应包装类的构造器,把他转换成一个对象实例。
int it = 5;
Integer it_obj = new Interger(it);
这样就可以使用it_obj这个引用变量来使用基本类型的变量了。
======================================================
==判断两个元素是否相等,只能是基本的数据类型,如果是引用类型,那么只有当两个引用类型指向同一个对象实例的时候,返回true,但是我们通常要比较的是
引用类型变量指向的内容。这个时候就用equals
======================================================
如果一个类只能创建一个实例,那么这个类叫做单例类。创建多个实例没有意义。
======================================================
抽象类
======================================================
定义抽象类只需要在public后面加上abstract修饰符即可。
甚至可以把不包含抽象方法的类定义为抽象类。
也就是说,抽象类和抽象方法不是必须关联的。
而在C++中,含有一个抽象方法的类,就是抽象类,对于类的修饰那,没有什么。
-----------------
抽象类,不能有实例
抽象方法,不能有实现
======================================================
抽象类在java中不同于C++中的抽象类,C++的抽象类更像接口,只是把外部接口暴露给调用者
而java的抽象类,是把通用的部分,放到父类的非抽象函数中区,而需要子类实现的部分,设计为抽象方法,在子类中实现。
也就是说,抽象类把事情的处理划分为两部分: 普通方法+抽象方法。
普通方法中做的是抽象类这一层已经知道的东西,通用的算法。
抽象方法,是子类相关的,由子类实现,往往普通方法中要调用到抽象方法。
======================================================
接口
======================================================
接口更像是C++中的抽象类,但不是一样的语法
C++的抽象类中可以有普通函数+抽象函数
java的接口中,只能有抽象函数。不能有普通函数
======================================================
接口的组成:
只能有常量属性
只能有抽象方法
不能有构造器
不能有初始化块定义
----------------------------------
[修饰符]interface 接口名字 entends 父接口1 , 父接口2,...
一个接口可以继承多个直接父接口,但是只能继承接口,不能继承类
======================================================
接口不能创建实例,但是接口可以创建引用类型变量:
当使用接口来声明应用类型变量的时候,这个引用型的变量必须引用到起实现的类的对象。
除此之外,接口的主要用途就是被实现类实现。
======================================================
P213 接口类和抽象类的区别!!!!
接口类提供的是一个规范,不提供任何实现。
抽象类是一个模版,大的框架在抽象类中实现,具体的实现细节有具体类来实现
======================================================
7章,集合
======================================================
集合就是一个容器,可以把多个对象放进容器中,
集合中只能放对象(其实是对象的引用),数组可以放基本数据类型,也可以放对象的引用
======================================================
java的集合类主要有两个接口派生而来,Collection 和Map
这两个是java集合框架的根接口
======================================================
Set 和List是派生自Collection的两个子接口
他们分别表示无序集合和有序集合
Queue是java提供的队列,有点类似于List。
======================================================
Map中保存的每项数据都是 键值对!!
======================================================
======================================================
泛型,是为了让集合记住存储对象的类型
java的参数化类型成为泛型
List
======================================================
阅读(914) | 评论(0) | 转发(0) |