首页 > 代码库 > JAVA学习笔记(一)

JAVA学习笔记(一)

JDK :给Java开发人员使用的工具包,包括Java的开发工具,也包括JRE。其中开发工具中包括编译工具(javac.exe)、运行工具(java.exe)、打包工具(jar.exe)等。
JRE :Java的运行环境,包括Java虚拟机和Java程序运行所需的核心类库。
JVM :Java虚拟机。
两者之间的关系:
JDK=JRE+开发工具
JRE=JVM+核心类库

JAVA配置jdk环境变量
JAVA_HOME C:\Program Files\Java\jdk1.7.0_21
Path %JAVA_HOME%\bin;

使用jar包时要这样使用“ java –cp test.jar Test”
记住Java程序中很容易犯的第一个错误:java.lang.NoClassDefFoundError
– 初学者经常会遇到这个错误,而遇到这个错误,99.9%的情况,是因为你在CLASSPATH中忘
掉了需要的jar包
– 所以,遇到这个错误,回头去找齐你所有的jar包,然后再到java社区去问问题

关键字中所有字母都为小写;
Java的命名规范:
包名:多单词组成时所有字母都小写,域名倒着写(com.***.www)
类名接口名:多单词组成时,所有单词首字母大写
变量名和函数名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写
常量名:所有字母都大写,多单词时每个单词用下划线连接

Java数据类型:
byte 1个字节 (8位) -2^7------2^7-1 =-128 到127
short 短整型 2个字节 (16位) -2^15------2^15-1 3W多
int 整型 4个字节(32位) -2^31------2^31-1 上亿
long 长整型 8个字节(64位) -2^63------2^63-1 (后面加L)
float 4个字节 (32位) 单精度(后面加f)
double 8个字节(64位) 双精度
char 2个字节
boolean 1个字节 true false
强制类型转换:(byte)(a+10)--将a+10强制转换为byte
字符与数字计算会转化为ASCII码数字与数字计算
switch函数表达式中,java 1.6(包括)以前,只是支持等价成int 基本类型的数据:byte ,short,char,int(其他的都不可以)。1.7加入的新特性可以支持String类型的数据。
方法(函数):
注意:
1)方法不能定义在另一个方法里
2)方法可以调用另一个方法
3)方法没有返回值就不用写return 方法的声明要写void ,有就写return
4)方法不调用不执行
方法命名规则:如果是一个单词要全部小写,如果是二个单词,第二个单词首字母大写
什么是重载:在同一个类中,如果方法名相同,参数的类型及参数的个数不同即可,注意与返回值无关。

内存分析:
栈(stack)内存:用于存储局部变量,当数据使用完,所占空间会自动释放。方法运行时调入栈内存中,不再使用时,只删除栈内存中的方法,方法区内的方法依然保留。
堆(heap)内存:数组和对象,通过new建立的实例都放在堆内存中;每一个实体都有内存地址值;实体中的变量都有默认初始化值;实体不再被使用,会在不确定的时间内被垃圾回收器回收,存储全局变量。
方法区(数据区):用于存放方法,分为静态方法区和非静态方法区。

注意:int [][] arr= new int[10][];一维必须有值才能正确建立二维数组。

数组的特点:
1)创建时就给定大小(可以给0但,用打印或赋值时会报运行时错)
2)数组初始值: int型默认0 float型默认0.0f boolean 型默认false
char型默认’\u0000’ 相于当 ‘ ’(空字符)
3)数组有下标,且从0开始
4)得到数组大小的属性:数组名.length

求最大值:
int maxElement = a[0];
for (int x = 1; x < a.length; x++) {
if (a[x] > maxElement) {
maxElement = a[x];
}
}
return maxElement;
选择排序:
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int min = arr[j];
arr[j] = arr[i];
arr[i] = min;
}
}

冒泡排序:
for(int i=0;i<arr.length-1;i++){ //控制比较的次数 -1: 因为是二二比较,比较的次数比数组长度要小1
for(int j=0;j<arr.length-1-i;j++){//-1:因为是二二比较;-i: 每比较一次,最后值一定是在最后面的,所以最大值就不用比较了。
if(arr[j]>arr[j+1]){//小的放前面,大的放后面
int temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
二分查找法:
int min=0;
int max=arr.length-1;
int mid = (min+max)/2;
while(arr[mid] != key){
if(key>arr[mid]){
min=mid+1;
}
else if(key< arr[mid]){
max=mid-1;
}
if(max<min){
return -1;
}
mid=(max+min)/2;
}
return mid;

数组的排序:
Arrays.sort()方法:对数组进行从小到大排序,需要引入包 java.util.Arrays
数组的查找:
java.util.Arrays.binarySearch(object [] arr ,object key)//一个是数组 一个是要查的数
有返回值: 如果找到返回下标,没找到返回-1
注意:此方法底层用的是二分查找法(折半查找法),所以用此方法之前先排序
数组的拷贝:
Java.lang.System.arraycopy(源数组名,源数组起始位置,目标数组,目标数组插入位置,要拷贝的长度)
没返回值
注意:如:源数组里有6个,我们要拷贝出7个到目标数组,就会数组下标越界异常。

面向过程:
每一步都由我们自已亲自去完成,缺点,效率低,不容易维护,复用性差

面向对象的特点:使复杂的事件变简单
由执行者变成了指挥者
效率高,容易维护,复用性好。

注意:类名.方法名()
对象名.方法名()的区别?

类名.方法名() 方法名加了static
对象名.方法名() 方法名没加static
一个类文件可以有多个类,但是类文件名所对应的类前面必须是public,一个类只有一个类名是public的
一个类中没有main()方法是可以的,但是不能被JVM所调用。

注:
类名 变量名 = new 类名 ();
变量名 =null;
变量名.属性=值。
变量名.方法(); 会报空指针异常

局部变量和全局变量的区别?
1.全局变量定在类中,整个类都可以用
局部变量定义在方法中,代码块中,语句中,只有所属的区域有效
2.全局变量存在堆(heap)中,局部变量存在于栈(stack)中
3.全局变量随着对象的创建而存在,随着对象的消失而消失。
局部变量随着所属区域执行而存在,执行结束而消失。
4.全局变量都是有默认初始值的,不给值能用
局部变量没有默认初始值的,不给值不能用

局部变量与全局变量重名
重名先在所在区域中找变量,如果所在区域没有去全局中找,如果都有就用所在区域中的变量

类类型(引用型)当参数:对象中的属性相同我们可以把他们共同的属性写在一个方法里

匿名对象:没有名字的对象 new Ren();
匿名对象特点:如果这个对象里的方法或属性,只被调用一次,那么就可以用匿名对象它主要的功能是为了简化程序员书写代码。

基本数据类型当参数:方法的参数是一个数值
引用数据类型当参数:方法的参数是一个地址

Java权限访问修饰符
1.public:公共权限 修饰类、属性、方法。可以被任意类访问。
2.protected:受保护的权限 修饰属性、方法。可以被同包类访问,如果不是同包类,必须是该类的子类才可以访问。
3.default:同包权限 修饰类、属性、方法。 只能被同包类访问。
4.private:私有权限 修饰属性、方法。 只能在本类中访问。

封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:将变化隔离、便于使用、提高重用性、提高安全性。
封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。
封装主要使用private
用Myeclipse来写set() get()
在类右键-----》source---> getters and setters
注意:private私有是封装的一种体现,私有是封装,但封装不单单指的是私有。

构造方法是干嘛用的?
是为了创建对象用的。
构造方法的分类?
默认构造方法和自定义构造方法
构造方法特点:
类名和方法名相同,访问权限修饰符和类的访问权限修饰符相同(可省略)。
构造方法没有返回值,且不用void 。
默认构造方法和自定义构造方法的区别?
1)默认构造方法是无参的。自定义构造方法是有参的。
2)自定义构造方法可以有多个,多个构造方法是以重载的形式存在的,
默认构造方法只有一个。
3)默认构造方法在类中默认(不写)存在。
4)类中如果有自定义构造方法,但不写出默认构造方法,那默认构造方法就消失。

什么时候用自定义构造方法?
在创建对象时,想让对象一创建出来就带有一些指定的值,用自定义构造方法。
如果带默认值用默认构造方法。

构造方法和普通方法的区别?
1.构造方法:对象创建时,就会自动构造方法,对类进行初始化。
普通方法:对象创建后,才能调用普通方法
2.对象创建时,构造方法只会调用一次
普通方法:对象创建后,可以被调用多次
注意:构造方法和赋值方法不冲突

this:代表当前对象
this如何用?
1.当参数名和全局变量相同时,在赋值时用this!!!!!!(必须),
2.对象调用属性时用this(不是必须,可省略)
3.对象调用方法时用this(不是必须,可省略)
4.默认构造方法调用自定义构造方法: Book3(,,)
1)默认构造方法中this(,,),必须放在当前构造方法的第一行
2)自定义构造方法调用默认构造方法 Book3()
自定义构造方法this(),必须放在当前构造方法的第一行
注意:用this在调用构造方法时,不要出现死循环。

static : 静态的。可以修饰属性,方法,代码块。
属性:
1)通过类名.属性名
2)被所有对象共享
方法:通过类名.方法名 -----》对象名.方法名()
代码块:在类加载时就执行,且执行一次
静态代码块 > 构造代码块 > 构造方法

static代码块
随着类的加载而加载,只执行一次
用于给类进行初始化
构造代码块(构造方法给对象初始化)
{ }
static代码块和构造代码块同时出现时优先级
静态代码块>构造代码块>构造方法
static使用时间:
static修饰属性:这个属性如果被所有对象共享。
static修饰方法:该方法是访问对象中的静态变量的。

static方法只能访问static变量;非static方法能访问static和非static变量。
static方法不能使用this关键字,局部变量不能用static来修饰。

非静态变量和静态变量的区别?
二个变量的生存周期不同
  非静态变量随着对象的创建而存在,随着对象的回收而释放
  静态变量随着类的加载而存在,随着类的消失而消失
调用方式不同
  非静态变量只能被对象调用
  静态变量可以被对象,还可以被类调用
别名不同
  非静态变量称为实例变量
  静态变量称为类变量
数据存储位置不同
  非静态变量存储在堆内存的对象中,也称为对象的特有数据
  静态变量数据存储在方法区(数据区)的静态区中

JAVA学习笔记(一)