java学习摘要
时间:2010-06-23 来源:ly44770
很久前学java时摘抄的。今天看android源码时,看到>>>操作符,又不明了了,翻出来看了看。发现总结的还不错,至少蛮好用的,就放出来了,方面以后查阅。
Java是什么?
Java= “C++”-“复杂性和奇异性”+“安全性和可移植性”
Java与C及C++的区别
• 不再有#include 和#define 等预处理功能
• 不再有structure,union及typedef
• 不再有函数、不再有指针、不再有多重继承
• 不再有goto
• 不再有操作符重载(Operatior Overloading)
• 取消自动类型转换,要求强制转换
• 等等
一、Java 基本的程序设计结构
public class FirstSample {
public static void main(String[] args) {
System.out.println("HelloWorld");
}
}
1. Java对大小写敏感。
2.Java应用程序中的全部内容都必须放置在类中。
3.源代码的文件名必须与公有类的名字相同,并用.java作为扩展名。在一个源文件中只能有一个公有类,但可以有任意数目的非公有类。
4.Java编译器将字节码文件自动命名为FirstSample.class。
5.运行 java FirstSample
6.java虚拟机将从类的main方法入口执行。
7.main方法必须是public static。
8.注释支持//,/* */(不支持嵌套),另外支持/** */,且这种注释可以用来自动生成文档。
二、数据类型
Java是一种强类型语言,必须为每一个变量声明一种类型。在Java中,一共有8种基本类型,其中有4个整形、2个浮点型、1个字符型char、和1个表示真值的boolean。
1. 整形
int 4 short 2 long 8 byte 1
在Java种整形的范围与运行Java代码的机器无关。长整形数值有一个后缀L。
Java没有任何unsigned类型。
2. 浮点型
float 4 double 8 ,float类型的数值有一个F
3.char 2个字节
4. boolean类型有两个值:false和true,用来判定逻辑条件。这两个值不能与整型互换(C++行)。
• byte 8 位 2 的补码 (byte) 0
• short 16位 2 的补码 (short) 0
• int 32 位 2 的补码 0
• long 64位 2 的补码 0L
• float 32位 IEEE 754浮点数标准 0.0f
• double 64位 IEEE 754浮点数标准 0.0d
• char 16位 同一码字符集 ‘\u0000’
三、变量和常量
Java中不区分变量定义和声明。
final声明常量,const是保留的关键字,但未使用。
不可以嵌套定义同名变量。
可以在不同for语句中定义同名变量。
四、运算符
Java中的操作符:与C基本一致
>>>运算符将用0填充前面的位。>>用符号位填充,C++中不确定。没有<<<运算符。
没有逗号表达式。
Java没有提供运算符重载。
Java中不再有指针了。
在Java中引用是指向一个对象在内存中的位置,在本质上是一种带有很强的完整性和安全性的限制的指针。
当你声明某个类,接口或数组类型的一个变量时,那个变量的值总是某个对象的引用或者是null引用。
指针就是简单的地址而已,引用除了表示地址而外,还像被引用的数据对象的缩影,还提供其他信息。
指针可以有++,--运算,引用不可以运算。
五、字符串
Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类:String
六、控制流程
Java没有goto语句。有break,且break可以带标签。
switch语句的case标签必须是整数或枚举常量,不能检测字符串。
七、数组
int[] a; 或者int a[]; 声明
int [] a = new int[100];初始化
能够动态取得的内存有两种,一种是对象实体,一种数组.
Java用new申请内存,不需要自己释放不用的内存.
在Java中,定义数组时不必给出数组的大小,因为Java的数组是动态分配的。
数组变量实际上是一个引用变量,因此要实例化才能使用。
例:int Array[]; Array=new int[8];
for each循环
for(variable:collection)statement
collection必须是数组或实现了Iterable接口的类。
在Java中,允许将一个数组变量拷贝给另一个数组变量。这时,两个变量将引用同一个数组。
int[]a = new int[100];//java
不同于 int a[100];
而等同于int * a = new int[100]; //C++
Java中的[]运算符被定义为检查数组边界,而且没有指针运算,即不能通过a+1得到数组的下一个元素。
对象与类
class Car
{
int car_number;
void set_number(int car_num)
{ car_number=car_num;}
void show_number()
{System.out.println (“My car No. is :”+car_number); }
}
class TrashCar extends Car
{ int capacity;
void set_capacity(int trash_car_capacity)
{ capacity=trash_car_capacity;}
void show_capacity();
{ System.out.println(“My capacity is: ”+
capacity);}}
类的严格定义及修饰字
[类的修饰字] class 类名称 [extends 父类名称]
{ …. }
abstract类不能直接产生属于这个类的对象
final类不能被其他任何类所继承(安全的考虑)
public类不但可以被同一程序包中的其它类使用,别的程序包中的类也可以使用.
friendly(缺省)类只能被本包中的其它类使用
方法和变量的定义及修饰字
[变量修饰字] 变量数据类型 变量名1,变量名2[=变量初值]…;
[方法修饰字] 方法的返回值类型 方法名称(参数1,参数2,…
{
…//方法的内容
}
public ,private,protected,default
到此为止-----final
final在方法之前,防止该方法被覆盖.
final在类之前,表示该类不能被继承
final在变量之前,定义一个常量.
属于类的变量和方法----static
static属于类且不属于类对象的变量和函数,Java与C++相同。
static 在变量或方法之前,表明它们是属于类的,
静态变量在各实例间共享
如果是public静态变量,则其它类可以不通过实例化访问它们
静态方法称为类的方法,因此不用实例化即可调用(面向过程)
一个对象的方法可以访问对象的数据成员,尽管不属于方法的局部变量
一个类的方法只能访问自己的局部变量
所有的Java对象都是在堆中构造的,构造器总是伴随着new操作符一起使用。
在Java程序设计语言中,所有的方法都必须在类的内部定义,但并不表示它们是内联方法。
接口中的所有方法都自动的属于public。在接口中声明方法时不必提供关键字public。接口中可以定义常量。接口不能有实例域,也不能在接口中实现方法。提供实例域和方法实现的任务由实现该接口的类完成。
接口不是类,尤其是不能使用new运算符实例化一个接口。
然而,尽管不能构造接口对象,却能声明接口变量。接口变量必须引用实现了接口的类对象。
x = new Comparable();//ERROR
Comparable x;//ok
x = new Employee(); //ok provided Employee implements Comparable
接口也可以被扩展
public interface Powered extends Movable
{
}
每个类只能有一个接口,但却可以实习多个接口。
calss Employee implements Cloneable,Comparable{}
在实现接口时,必须把方法声明为public,否则即为默认访问属性。
利用接口可实现多重继承(可同时实现多个接口)
接口的作用和抽象类类似,指定原型,不直接定义方法的内容.
关键字implement用来实现方法,即在使用时要用给出方法的实际内容
接口中的方法和变量是public的
interface Stack
{ void push(object x);
object pop();
}
class A extends Applet
implements Stack
{ void push(object x)
{
…;//具体内容
}
object pop()
{
…;//具体内容}
}
程序包:相当于其它语言中的库函数
打包
package Graphics;
class Square {…;}
class Circle {…;}
class Triangle {…;}
使用程序包中的类要用import命令.表示路径,*表示使用包中的所有类
import java.io.FileInputStream;
import java.io.*;
public class apple extends fruits
{ public apple(int price)
{ super(price); }
}
Java用关键字extends代替了C++中的冒号。在Java中,所有的继承都是公有继承,而没有C++中的私有继承和保护继承。
在Java中使用关键字super调用超类的方法,而在c++中采用超类名加上::操作符的形式。
super指这个对象的父类:super用来引用父类中的方法及变量数据.以上句子表示使用超类的构造函数生成实例super必须是子类构造器的第一条语句
在C++的构造函数中,使用初始化列表语法调用超类的构造函数,而不调用super。
在Java中不需要将方法声明为虚拟方法,动态绑定是默认的处理方式。如果不希望让一个方法具有虚拟特征,可以将它标记为final。
final类不允许继承,其方法自动为final方法,但域不是。
在C++中,在尾部用=0标记的抽象方法来表示纯虚函数,只要有一个纯虚函数,这个类就是抽象类。在Java中用关键字abstract。
Java用于控制可见性的4个访问修饰符:
private仅对本类可见;public对所有类都可见;protected对本包和所有子类可见;默认对本包可见。默认即没有指明任何修饰符的情况。
Object:所有类的超类
Object类是Java中所以类的最终祖先,在Java中,每个类都是由它扩展而来的,但是不需要使用extends指明。
ArrayList是一个采用类型参数的泛型类。。它使用起来有点象数组,但在添加或删除元素是,具有自动调节数组容量的功能,而不需要为此编写任何代码。
ArrayList<Employee> staff = new ArrayList<Employee>();
构造器:在Java中可以通过this()的形式应用另一个构造器函数。C++不可以。
初始化块:在构造器函数前执行。
Java不支持析构器,可以使用finalize方法,不过无法保证该方法什么时候执行。
import语句是一种引用包含在包中的类的简明描述。一旦使用了import语句,在使用类时就不必写出包的全名了。import语句应该位于源文件的顶部但位于package语句的后面。
所有继承都是公有继承,没有私有继承和保护继承。
super是指示编译器调用超类方法的特有关键字。super()调用超类构造器。
在Java中,子类数组的引用可以转换成超类数组的引用,而不需要采用强制类型转换。
子类覆盖超类的方法允许返回类型为原返回类型的子类型。
在覆盖一个方法的时候,子类方法不能低于超类方法的可见性。特别是超类方法是public,那么子类方法一定要声明为public。
instanceof
if(e instanceof Manager){}
在Java中,只有基本类型的值不是对象。而所有的数组类型,不管是对象数组还是基本类型的数组都扩展于Object类的类型。