-------android培训、java培训、期待与您交流! ----------
Java基本类型分为两类:数值型和布尔型。数值型可分为整型以及浮点型,整形中的字符型也可单独分为一类。所以一般把基本类型分为4类,如下表:
分类 | 类型 | 长度 |
整数型 | int | 32位 |
long | 64位 | |
short | 16位 | |
byte | 8位 | |
字符型 | char | 16位 |
浮点型 | double | 64位 |
float | 32位 | |
布尔型 | boolean | 1位 |
public class IntegerValTest {
public static void main(String[] args) {
//下面代码是正确的,系统会自动把56当成byte类型处理
byte a = 56;
/*
下面代码是错的,系统不会把9999999999999当成long类型处理,
所以超出int的表数范围,从而引起错误
*/
//long bigValue = 9999999999999;
//下面代码是正确的,在巨大的整数常量后使用L后缀,强制使用long类型
long bigValue2 = 9223372036854775807L;
//以0开头的整数常量是8进制的整数
int octalValue = 013;
System.out.println(octalValue);
//以0x或0X开头的整数常量是16进制的整数
int hexValue1 = 0x13;
int hexValue2 = 0XaF;
System.out.println(hexValue1);
System.out.println(hexValue2);
// 定义二个8位的二进制数
int binVal1 = 0b11010100;
byte binVal2 = 0b01101001;
// 定义一个32位的二进制数,最高位是符号位。
int binVal3 = 0B10000000000000000000000000000011;
System.out.println(binVal1); // 输出212
System.out.println(binVal2); // 输出105
System.out.println(binVal3); // 输出-2147483645
/*
定义一个8位的二进制,该数值默认占32位,因此它是一个正数。
只是强制类型转换成byte时产生了溢出,最终导致binVal4变成了-23
*/
byte binVal4 = (byte)0b11101001;
/*
定义一个32位的二进制数,最好位是符号位。
但由于数值后添加了L后缀,因此该整数的实际占64位,第32位的1不是符号位。
因此binVal5的值等于2的31次方 + 2 + 1
*/
long binVal5 = 0B10000000000000000000000000000011L;
System.out.println(binVal4); // 输出-23
System.out.println(binVal5); // 输出2147483651
}
}
如果把一个整数(0~65535之间)常量赋给字符类型变量,系统会把整数当作char处理。
示例:
public class CharTest {
public static void main(String[] args) {
//直接指定单个字符作为字符常量
char aChar = 'a';
//使用转义字符来作为字符常量
char enterChar = '\r';
//使用Unicode编码值来指定字符常量
char ch = '\u9999';
//将输出一个'香'字符
System.out.println(ch);
// 定义一个'疯'字符常量
char zhong = '疯';
// 直接将一个char变量当成int类型变量使用
int zhongValue = zhong;
System.out.println(zhongValue);
//直接把一个0~65535范围内的int整数赋给一个char变量
char c = 97;
System.out.println(c);
}
}
③浮点型
public class FloatTest {
public static void main(String[] args) {
float af = 5.2345556f;
//下面将看到af的值已经发生了改变
System.out.println(af);
double a = 0.0;
double c = Double.NEGATIVE_INFINITY;
float d = Float.NEGATIVE_INFINITY;
//看到float和double的负无穷大是相等的。
System.out.println(c == d);
//0.0除以0.0将出现非数
System.out.println(a / a);
//两个非数之间是不相等的
System.out.println(a / a == Float.NaN);
//所有正无穷大都是相等的
System.out.println(6.0 / 0 == 555.0/0);
//负数除以0.0得到负无穷大
System.out.println(-8 / a);
//下面代码将抛出除以0的异常
//System.out.println(0 / 0);
}
}
public class BooleanTest {
public static void main(String[] args) {
boolean b1 = true;
boolean b2 = false;
//下面代码将出现错误:字符串不能直接变成boolean型的值
//boolean b3 = "true";
//使用boolean和字符串进行连接运算,boolean会自动转换成字符串
String str = true + "";
//下面将输出true
System.out.println(str);
}
}
public class AutoPromote {
public static void main(String[] args) {
//定义一个short类型变量
short sValue = 5;
//下面代码将出错:表达式中的sValue将自动提升到int类型,
//则右边的表达式类型为int,将一个int类型赋给short类型的变量将发生错误。
//sValue = sValue - 2;
byte b = 40;
char c = 'a';
int i = 23;
double d = .314;
//右边表达式中在最高等级操作数为d(double型)
//则右边表达式的类型为double型,故赋给一个double型变量
double result = b + c + i * d;
//将输出144.222
System.out.println(result);
int val = 3;
//右边表达式中2个操作数都是int,故右边表达式的类型为int
//因此,虽然23/3不能除尽,依然得到一个int整数
int intResult = 23 / val;
//将输出7
System.out.println(intResult);
//输出字符串Hello!a7
System.out.println("Hello!" + 'a' + 7);
//输出字符串104Hello!
System.out.println('a' + 7 + "Hello!");
}
}
public class NarrowConversion {
public static void main(String[] args) {
int iValue = 233;
//强制把一个int类型的值转换为byte类型的值
byte bValue = (byte)iValue;
//将输出-23
System.out.println(bValue);
double dValue = 3.98;
//强制把一个double类型的值转换为int
int tol = (int)dValue;
// 将输出3
System.out.println(tol);
}
}
public class AutoPromote {
public static void main(String[] args) {
//定义一个short类型变量
short sValue = 5;
//下面代码将出错:表达式中的sValue将自动提升到int类型,
//则右边的表达式类型为int,将一个int类型赋给short类型的变量将发生错误。
//sValue = sValue - 2;
byte b = 40;
char c = 'a';
int i = 23;
double d = .314;
//右边表达式中在最高等级操作数为d(double型)
//则右边表达式的类型为double型,故赋给一个double型变量
double result = b + c + i * d;
//将输出144.222
System.out.println(result);
int val = 3;
//右边表达式中2个操作数都是int,故右边表达式的类型为int
//因此,虽然23/3不能除尽,依然得到一个int整数
int intResult = 23 / val;
//将输出7
System.out.println(intResult);
//输出字符串Hello!a7
System.out.println("Hello!" + 'a' + 7);
//输出字符串104Hello!
System.out.println('a' + 7 + "Hello!");
}
}
静态初始化的语法如下:
arrayName = new type[]{element1, element2, element3...}//定义一个int数组类型的变量,变量名为intArr.
int[] intArr;
//使用静态初始化,初始化数组时只指定数组元素的初始值,不指定数组长度。
intArr = new int[]{5, 6, 8, 20};
//定义一个Object数组类型的变量,变量名为objArr.
Object[] objArr;
//使用静态初始化,初始化数组时数组元素的类型是
//定义数组时数组元素类型的子类
objArr = new String[]{"Java" , "张三"};
Object[] objArr2;
//使用静态初始化
objArr2 = new Object[] {"Java" , "张三"};
除此之外,静态初始化还有如图下的语法格式:
//数组的定义和初始化同时完成,使用简化的静态初始化写法
int[] a = {5, 6 , 7, 9};
//数组的定义和初始化同时完成,使用动态初始化语法
int[] prices = new int[5];
//数组的定义和初始化同时完成,初始化数组时元素的类型是定义数组时元素类型的子类
Object[] books = new String[4];
public class ForEachErrorTest {
public static void main(String[] args) {
String[] books = {"高等数学" ,
"大学英语",
"大学物理"};
//使用foreach循环来遍历数组元素,其中book将会自动迭代每个数组元素
for (String book : books)
{
book = "高等数学";
System.out.println(book);
}
System.out.println(books[0]);
}
}
注意:使用foreach遍历数组时,不能改变数组元素的值,所以不要对foreach的循环变量进行赋值。
public class ArrayInRam {
public static void main(String[] args) {
//定义并初始化数组,使用静态初始化
int[] a = {5, 7 , 20};
//定义并初始化数组,使用动态初始化
int[] b = new int[4];
//输出b数组的长度
System.out.println("b数组的长度为:" + b.length);
//循环输出a数组的元素
for (int i = 0 ,len = a.length; i < len ; i++ ) {
System.out.println(a[i]);
}
//循环输出b数组的元素
for (int i = 0 , len = b.length; i < len ; i++ ) {
System.out.println(b[i]);
}
//因为a是int[]类型,b也是int[]类型,所以可以将a的值赋给b。
//也就是让b引用指向a引用指向的数组
b = a;
//再次输出b数组的长度
System.out.println("b数组的长度为:" + b.length);
}
}
1)private私有;
2)public 公有;(set设置、get查看)
3)static修饰符
static可以修饰成员变量和成员函数
①static成员变量:
2)static 成员函数
static成员函数应用:
3)static(静态)初始化代码块
1.当我们面向对象设计时,会发现一些已抽取的类中,有一些相同的属性或方法。这时我们可以对这些具有重复属性或方法的类进行进一步抽取。
2.将抽取后的类,作为基类,可以被其他类“继承”,达到一个“重用” 的目的
3.一个类“继承”其他类,使用关键字extends
继承的特点:
类与类之间的关系:(UML)
1.继承关系(is a)(一般关系):子类继承父类
2.关联关系(has a有一个,多个):例如:学员类和科目类(学员要有一个科目)
3.组合关系:一个类,有多个其他类组成的。
4.依赖关系:一般在类中不持有另外一个类的引用,但是某些方法需要另外类型的引用 这时、这个类依赖于参数类
Super关键字/函数的重写
1.子类定义了跟父类同名的成员变量,这时、这个变量将覆盖(隐藏)了父的同名变量
2.在子类中,可以使用super关键字显示的调用父类被隐藏的成员变量
访问修饰符:private(私有的)-> 默认 ->protected(受保护的)->public(公共的)
函数的重写(Override)(覆盖、重写)
1.子类中可以出现跟父类一样的方法,这时就是:函数的重写
1).返回值类型 方法名参数列表:完全相同
2).访问修饰符:子类重写父类的方法时,访问修饰符必须同重写的方法一致,或更宽的访问修饰符(不包括private)
2.1).编译时,检查如果方法名、参数列表相同,返回值不同将出现编译错误
2.2).如果返回值类型、方法名相同,参数列表不同,可以编译运行, 这个是子类特有的方法,和父类show()方法没有关系
2.private方法不能被重写:
1).子类可以定义一个和父类相同的private的方法,但这不是“重写”, 各自独立的。(即两边都是私有的)
多态的特点
1.成员变量:父类访问的变量始终是父类自己的(对于父类自己的变量及被覆 盖的变量)
2.成员方法:编译的时候看父类中是否有方法,如果没有,编译错误,运行的时候是子类的方法
3.静态方法:被覆盖的静态成员,访问的是父类的。一般情况下,多态性访问的都是父类的,父类有,则编译通过,否则编译失 败 有一个特殊,对于被覆盖的成员方法,运行时是子类的,父类引用,不能访问子类特有的成员