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”);
}