java 基本语法
Java的八种基本类型
- int
- float
- double
- short
- byte
- char
- boolean
- long
Java的内存分配机制
java程序在内存中主要有四个管理的部位:
栈(stack)
堆(heap)
静态域(static)
常量池(方法区)
栈
局部变量、对象声明的引用,放在栈中
局部变量,例如一些int a=10,
如果是对象的话,等号左边是引用,右边是对象变量(在堆中)
堆
new
通过new向堆内存申请空间
new出来的对象实例(包括类实例的成员变量)、数组都在堆里
静态域
static修饰的变量
类变量在类加载时候就会加载到静态域中,一旦加载,不会二次加载
在静态域中,所有的类实例变量都拥有访问和修改的权限
常量池
例如字符串常量;
注意:字符串常量和new一个字符串变量的区别;
String name="小敏敏"; //name 在栈中,***"小敏敏"*** 在常量池中
String name1=new String("小敏敏"); //name1在栈中,String()在堆中,***"小敏敏"*** 在常量池中
上述重点,name直接指向常量池
name1先指向堆中的String类实例,在通过类实例指向常量池
Java的引用数据类型
Class
interface
数组[]
Java默认类型
整数数值默认int
浮点默认double
Java的String连接问题
System.out.println(3+4+"HELLO"); //7HELLO
System.out.println("HELLO"+3+4) //HELLO34
诸如此类 见第二节小练习
要点在于
在连接过程中,所有 ***+***一开始只是加法功能
直到遇到第一个String之后,+变成连接功能,后面所有+都是连接功能
如果我希望出现在后面的+是运算符加呢?
System.out.println("jhkk"+45+1+(5+6));
答案是:通过括号()破坏上述连接规则,实现加。
注意Java的位运算符
注意短路或、短路与
当 (1)&&(2)1为假,2不在计算
当(1)||(2),1为真,2不在计算
Java的instanceof运算符
1.自己类的实例、子类的实例都符合
2.注意看的是运行时环境,注意多态
Java的控制语句
基本跟C无区别
for
switch
while
do while
值得多留心的是foreach
int a[]=new int[10];
...
for(int i:a)
{...
}
注意i前一定要有一个类型声明。
break与continue
continue的有限制的goto
continue f1;
continue 和break都可以加标签
但是,注意各自的意义不变,break跳出整个循环,label标记跳出的是哪个循环,那层循环
continue跳出标记的这层循环的本次循环
public static void main(String []args)
{
int a=0;
lable: for(int i=0;i<10;i++)
{for(int j=0;j<10;j++)
{ System.out.println("("+i+","+j+")");
if (a==0)
continue lable; //结束被label标记的那一层的本次循环,for循环变量能够自己加1
}
}
}
/结果是 :(0,0)
(1,0)
(2,0)
(3,0)
(4,0)
(5,0)
(6,0)
(7,0)
(8,0)
(9,0)
public static void main(String []args)
{
int a=0;
lable: for(int i=0;i<10;i++)
{for(int j=0;j<10;j++)
{ System.out.println("("+i+","+j+")");
if (a==0)
break lable; //结束被label标记的整个循环
}
}
}
//结果是(0,0)
java的对象数组
对象数组的每个值是一个引用
每个元素放在堆中
指向堆内的对象实例
图见老师ppt,我就不画了
关于数组:
- 数组是引用类型
- 可以有对象数组(内存不太一样)
- 数组声明和分配空间不一样,只有new的时候才分配空间,之后才可以访问数组
- 数组默认初始化,对象数组会隐式初始化(那么有个问题,这个类要有无参构造器)
Arrays类
数组工具类
也就是,提供了一堆的类方法,用来处理数组
Arrays.sort() //**后面有接口可以改变sort的顺序,到后面接口再写,默认从小到大
Arrays.equals()
Arrays.fill()
Arrays.binarysearch()
Java中常见的几种数据结构的话
ArrayList 数组,可变长的列表
vector 数组,可变长列表
HashMap
treeMap
等等
建议看看不用深究,可以现场查一下api
补充
Java和CPP的==
对于数值的话居然是可比较的,浮点居然可以等
int a=5;
float b=5.00f;
System.out.println(a==b); //true
Java的对象比较算法
Object类中的equals方法
如果一个类,他的对象会涉及对象比较的话,建议覆盖Object类里的equals方法
这个就根据实际需求进行设计了,主要是根据属性进行比较
见hashcode()和多线程那道银行题
选择表达式
()?():()
这个式子跟if else的区别在于
if 、else不要求有返回值,但是这个式子,一定会有返回值
而且在这个返回值在编译时就产生了位置和类型
知道运行到这里才赋值
于是Java会给这两个值选择一个通用的大家都能用的类型,也就是最大类型
(a>b)?99.9:9
那么就会产生一个最大包容类型,此处为float
真正产生的是9.0或99.9’
即两个返回值必须归一位同一类型