Java基础语法笔记

2012-05-26 22:20:35

java语言学习心得


第一章 语言基础知识

一、基本数据类型与表达式

1.变量,常量——标识符

标识符——内存中地址的代表——高级语言不用直接关心内存地址

C语言可以直接操作地址,速度快


2.字符类型采用16位的unicode编码


3.字符串

java不能像C语言一样,用字符数组表示字符串!

引出了String类型


4.类型比较运算符

instanceof

e instanceof Point//e是不是Point类型


int a=3;float b=4.0; float c=(flaot)a/b;


5.类型转换

1.扩展转换

2.窄化转换——可能会损失精度

3.隐含转换——运算时编译器隐含转换

4.强制转换


二、数组


数组概念:一组类型相同的数据,封装在同一个标识符


java中数组是对象!!区别于C!!!

*动态初始化

*可以赋值给Object类型变量

*在数组中可以调用类Object的所有方法

*每个数组都有数据成员:length


数组的引用  — 联系于C语言的指针!


数组引用的声明

语法,两种:Type[] arrayName; Type arrayName[];

这个时候没有分配内存!


数组的创建

arrayName = new Type[components number];


java语言中的变量和对象

在不初始化的时候,会默认置空,而不是随机值!!与C++区别

基本类型默认0,引用默认空,bool默认false


java数组下标越界——数组越界异常!!与C++区别


数组名就是一个引用!

指针与指针之间的赋值——引用与引用之间的赋值


System.arraycopy(copyFrom,2,copyTo,0,7)

System.out.println


java中字符数组不能当字符串用!!!与C++区别


二位数组的声明和构造——多种方式

int [][] myArray;//声明数组引用,引用值默认为null

int [][] myArray = new int[3][5];//声明+初始化,初始化为0。

int [][] myArray = {{1,2},{3,4},{5,6,7,8}}//声明+初始化,赋值


每一行的长度可以不同


三、算法的流程控制

switch语句(switch-expression是整数)

for语句:

增强for语句: 

for(Typename:数组或集合类型对象){

//循环体;

}


第二章 类与对象

一、面向对象特性

面向对象的四大特征:抽象、封装、继承、多态

1.抽象:忽略与当前目标无关的,抽象相关的

2.封装:信息隐蔽技术!将使用者和设计者分开

3.继承: 单继承,多继承——java中只支持单继承!!!区别于C++

4.多态:


二、类的声明与对象创建

1.声明语法:

[public] [abstract|final] class name [extends supername] [implements interfacename]{}


finale类为终结类——不可以再被继承

C++的实现方法:C++11中增加了相应部分,原来的做法是让构造函数Private,然后弄一个静态的create方法~

对象创建过程:

a.对象引用声明2.对象创建:

b.new <classname>();

new的作用:分配内存空间,返回对象引用

c.初始化:构造函数


三、数据成员

——两种:对象的状态,对象各个方法要共享的数据

[public | protected |private]

[static][finale][transient][volatile]

Type name;


1.实例变量(没有static修饰的变量)——属于对象的属性

2.类变量(static变量)——属于类的属性

      类中所有对象共享的属性,或者常用的属性,系统常量等

      类初始化的同时就被赋值

      对象名或者类名.方法都可以调用它

3.transient值变量不需要序列化——即存盘的时候回忽略

4.finale变量的值不能被修改 

System.out.println(类名)

输出类名@类的hash码

打印:默认的toString()返回

getClass().getName()+”@“+Integer.ToHexString(hashCode())



四、方法成员

——两种:类的方法和实例的方法

[public | protected |private]

[static][finale][abstract][native][synchronized]

返回类型 方法名([参数列表]) [throws exceptionList]{}

 

abstract:抽象方法——只有方法原型,没有方法体实现 

synchronized——用来控制多个并发线程对共享数据的访问

native:继承java代码和其他语言的代码


调用方法即给对象传递消息

参数传递:

1.值传递:参数类型为基本数据类型

2.引用传递:参数类型为对象类型或数组时

引用传递即形参与实参引用传递——实参名、形参名,两个不同的引用,指向同一个对象


实例的方法——非static方法

类的方法——类的static方法


这里突然想到:如果不想用对象,只想用一个方法,那么在C++中可以直接定义一个函数,java中则用类的static方法。

这里java对所有方法做了一个规范。

实现了彻底的面向对象。而C++里之所以没有这样做,是因为要完成对C的兼容吗?

C++完成了对C的完美兼容,但同时也背上了称重的历史包袱,不能实现完全的面向对象


可变长参数:用省略号代表,实质是数组

static double fun(TypeA... a){

    TypeA[] ta=a;

    for(TypeA t:ta){

        //...

    }   

}

 

五、包

包多个类,或者多个包

利用包来划分名字空间,避免类名冲突——包的命名,必须是独一无二的

包还提供了封装、存取权限


编译单元:一个java源文件

1.package所属包声明(省略,属于默认包)

2.import引入包声明

3.类和接口的声明

一个编译单元只能有一个public类,该类名与文件名相同,编译单元中的其他类是public类的辅助类,经过编译,非public的类也会生成一个单独的class文件


java编译器会为搜有程序自动引入java.lang这个包

其他外部包需要手动引入


import packagename.classname

import packagename.*


静态引入——单一引入,全体引入

单一引入:import static java.lang.Math.PI

全体引入: import static java.lang.Math.*

引入之后就可以直接使用PI,不用再用类名!


六、访问控制



七、对象初始化

构造方法——描述初始化算法


默认构造方法:



构造方法可以重载,可以用this关键字,实现多个关键字调用重载构造方法,避免冗余



final变量(常量)的初始化:

类final变量:必须在声明的同事初始化

实例final变量:可以在声明时候,最晚在构造函数结束前初始化


八、内存回收


无用对象:

*离开了作用域的对象

*无引用指向对象


C/C++语言,动态分配的的变量或对象,必然将它的地址放在一个指针中,并且这个指针是不能丢的,不能再某个时刻再也没有指针指向这个地址,即必须有指针指向,否则内存泄露


Java运行时系统通过垃圾收集器周期性地释放无用对象所使用的内存


其他资源还是要注意释放,否则还是存在泄露问题!!!


Java运行时系统会在对对象进行自动垃圾回收之前,自动调用对象的finalize方法


垃圾收集器:

  自动扫描对象的动态内存区,对不再使用的对象做上标记,在必要的时候进行垃圾回收

一个后台线程,在系统空闲时异步地执行

思考:JVM与JRE,JDK

JDK>JRE>JVM

JDK:bin,include,lib,jre

bin中有javac.exe

include:java和JVM交互用的头文件

lib:java中用到的系统类库?

JRE : lib bin

bin:JVM

lib : JVM调用的类库(平台相关?)


finalize()在类java.lang.Object中声明,因此每个类都有这个方法

用于释放资源

finalize()方法有可能在任何时机以任何次序执行!



六、枚举类



继承自java.lang.Enum

enum类型不可以有public构造函数


第三章 类的重用——继承和组合

Object类是所有类的超类

泛型本质:“将类型参数化”——即允许把类型也当做一个参数

组合:用已有类的对象作为新类的成员

继承与组合区别:继承是隶属关系,组合是有一个的关系


一、继承

Java只支持单继承



二、隐藏与覆盖

变量隐藏:之类中声明了与超类中相同的成员变量名

——super关键字可以访问超类中的同名变量

方法覆盖:之类中声明了与超类中相同的成员方法

权限可以扩大

必须覆盖的方法:abstract方法

禁止覆盖的方法:final方法


三、Object类

所有类的超类


主要方法:

getClass()

toString()

equals(Object obj)

clone()

hashCode()

finalize() throws Throwable


equals判断同一:

相等和同一:

值和属性相等,为相等。两个引用变量指向同一个对象,为同一(identical)。

==操作符判断同一!


四、终结类与终结方法

finale Class name{}

final integer get(){}


五、抽象类

可包括非抽象方法和抽象方法

不能用new方法进行实例化,只能用作超类


抽象方法

只有抽象类可以包含抽象方法

public abstract <returnType> <methodName>();

仅有方法原型,没有方法体



六、泛型类

class GeneralType<Type>{}

GeneralType<Integer> i = new GenralType<Integer>(2);


泛型方法

<Type> void printClassName(Type object){

System.out.println(object.getClass().getName());

 }


泛型与?通配符配合使用,使程序更通用

class GeneralType<Type>{}

class ShowType{

public void show(GeneralType<?> o )

System.out.println(o.getObj().getClass().getName());

 }

public Class Test{

ShowType st = new ShowType();

GeneratlType<Integer> i= new GeneralType<Integer> (2);

GeneratlType<String> i= new GeneralType<String> (“hello”);

st.show(i);

st.show(s);

}

result:

java.lang.Integer

java.lang.String


有限制的泛型:


class GeneralType<Type extends Integer>{}

public Class Test{

ShowType st = new ShowType();

GeneratlType<Integer> i= new GeneralType<Integer> (2);

//error:GeneratlType<String> i= new GeneralType<String> (“hello”);

}