1数据类型
基本数据类型存储在栈区,引用数据类型存储在堆区
栈:用于存储局部变量,当数据用完所占空间会自动释放;
堆:通过new建立的实例都存放在堆内存中,每个实体都有内存地址值;实体中的变量都有默认初始化值,实体不在调用会在不确定的时间内被垃圾回收器回收。
自动类型提升:(注意是单箭头)
强制类型转换:
public class child
{
public static void main(String args[]) {
byte b1 = 3,b2 =4,b;
b = b1 + b2;//报错,int转byte会有损失。
b = (byte)(b1 + b2);//7
System.out.println(b);
//b = 3+4;//报错,int转byte会有损失。需要强制转换
b = (byte)3+4;
System.out.println(b);//7
}
}
public class child
{
public static void main(String args[]) {
byte x = (byte)128;
System.out.println(x);//-128
byte y = (byte)-129;
System.out.println(y);//127
int z = (byte)'a';//97
System.out.println(z);
}
}
3和4都是常量,所以java在编译时期会检查该常的和是否超出byte类型的范围。如果没有可以赋值; b1和b2是变量,因为变量的值会量变化,不确定具体的值,所以默认使用int类型进行存储。错误为:不兼容的类型,从int转换为byte可能会有损失。
“&”和“&&”的区别:
&:左边无论真假,右边都进行运算;
&&:如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。短路现象。
“|”和“||”的区别同理,双或时,左边为真,右边不参与运算。三目运算符也存在短路? :
方法的定义:
[修饰符] 返回值类型 方法名(参数类型 形式参数1,参数类型 形式参数2,...)
{
执行语句;
return 返回值;
}
Java中的参数传递只存在一种规则:
按值传递。 但是在实际效果中可以分为两类:
按值传递效果:8种基本数据类型(String对象)
按址传递(按引用传递)传递效果:除String之外的所有复合数据类型,包括数组、类、接口等。
public class child
{
public static void main(String args[]) {
Object x = new Object();
String s = "nihao";
int[][] arr1 = new int[3][2];
int[] arr2 = new int[3];
System.out.println(x);
System.out.println(s);
System.out.println(arr1);
System.out.println(arr2);
//java.lang.Object@15db9742
//nihao
//[[I@6d06d69c
//[I@7852e922 一维数组,int型,哈希值
}
}
public class child
{
public static void main(String args[]) {
String[] names = {"ABC", "XYZ", "zoo"};
String s = names[1]; //按值传递,names[1]的值变了不影响s
names[1] = "cat";
System.out.println(s); //XYZ
System.out.println(names[1]); //cat
}
}
double d = 1.1/0.0;//不报错 Infinity代表一个无穷大的数字
public class child
{
public static void main(String args[]) {
byte x = (byte)127;
System.out.println(x);//127
int z = (byte)'a';//97
System.out.println(z);
double i = 1.0/0.0;
System.out.printf("%.28f", i); //Infinity
char c = (char)1.1f;
System.out.println(c); //一个字符
}
}
public class child
{
public static void main(String args[]) {
int a = 2;
System.out.println((a++)<<a);//16
//括号里的先执行,但是是后++,所有括号的值为2,然后后面的a的值是3
System.out.println(a);//3
a--;
a = (a++)+a;//5 括号值为2后面a值为3,最后a值为5
//a = (a++)+a++;//和上一语句结果一样,后面的++没有作用
System.out.println(a);//
}
}
public class child
{
public static void main(String args[]) {
int a = 5 ,b;
String value;
switch (a) {
default:
{
b=4;
System.out.println("default");
//没有break,继续执行后面的
}
case 1:
{
b=1;
System.out.println("case 1");
}
case 2:
{
b=2;
System.out.println("case 2");
}
case 3:
{
b=3;
System.out.println("case 3");
break;
}
}
System.out.println(b);//3
}
}
运行结果:
default
case 1
case 2
case 3
3
public class child
{
public static void main(String args[]) {
int a = 5 ,b;
String value;
switch (a) {
case 1:
{
b=1;
System.out.println("case 1");
}
case 2:
{
b=2;
System.out.println("case 2");
}
case 3:
{
b=3;
System.out.println("case 3");
break;
}
default:
{
b=4;
System.out.println("default");
//没有break,继续执行后面的
}
}
System.out.println(b);//4
}
}
运行结果:
default
4