1.整型
byte:一个byte类型整数在内存里占8位
short:一个short类型整数在内存里占16位
int:一个int类型整数在内存里占32位
long:一个long类型整数在内存里占64位
java中整数常量有4种表示方式:二进制,十进制,八进制和十六进制,其中八进制的整数常量是以0开头,十六进制的整数常量是以0x或者0X开头,其中10~15分别以a-f来表示 java7新增了对二进制整数的支持,二进制的整数以0b或者0B开头
java语言中常用的转义字符
\b 退格符 \u0008
\n 换行符 \u000a
\r 回车符 \u000d
\t 制表符 \u0009
\" 双引号 \u0022
\' 单引号 \u0027
\\ 反斜线 \u005c
只有浮点数除以0才可以得到正无穷大或者负无穷大,因为java语言会自动把和浮点数运算的0(整数)当成0.0(浮点数)处理,如果一个整数值除以0,则会抛出一个异常:ArithmeticException:/by zero(除以0异常)
三目运算符语法格式
(expression) ? if-true-statement : if-false-statement;
String str = 5>3 ? "5大于3" : "5不大于3";
//输出 "5大于3"
System.out.println(str);
使用switch语句时,有两个值得注意的地方:第一个地方是switch语句后的expression表达式的数据类型只能是byte,short,char,int四个整数类型和枚举类型;第二个地方是如果省略了case后的代码块的break;将引人一个陷阱
do while循环语句与while循环不同的是,do while 循环的循环条件后必须有一个分号,这个分号表明循环结束。
for循环和while,do while 循环不一样,由于while,do while 循环的循环迭代语句紧跟着循环体,因此如果循环体不能完全执行,如使用continue语句来结束本次循环,则循环迭代语句不会被执行,但for循环的迭代语句并没有与循环体放在一起,因此不管是否使用continue语句来结束本次循环,循环迭代语句一样会获得执行。选择循环变量时,习惯选择i,j,k来作为循环变量。通常紧跟break之后的标签,必须在break所在循环的外层循环之前定义才有意义。
定义数组时不能指定数组的长度,不要同时使用静态初始化和动态初始化,也就是说,不要在进行数组初始化时,既指定数组的长度,也为每个数组元素分配初始值。java语言的数组索引是从0开始的,如果访问数组元素指定的索引小于0,或者大于等于数组的长度,编译程序不会出现任何错误,但运行时出现异常:java.lang.ArrayIndexOutOfBoundsException:N(数组索引越界)
foreach循环
String[] books = {"","",""};
for(String book : books){
System.out.println(book);
}
实际的数组对象被存储在堆(heap)内存中,如果引用该数组对象的数组引用变量是一个局部变量,那么他被存储在栈(stack)内存中.当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁,因此,所有在方法内定义的局部变量都是放在栈内存中的;当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法借宿后,这个对象还可能被另一个引用变量所引用(在方法的参数传递时很常见),则这个对象依然不会被销毁。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收器才会在合适的时候回收它。
Arrays类处于java.util包下,为了在程序中使用Arrays类,必须在程序中导入java.util.Arrays类
类的构造器是有返回值的,当我们用new关键字来调用构造器时,构造器返回该类的实例,可以把这个类的实例当成构造器的返回值,因此构造器的返回值类型总是当前类,无需定义返回值类型,但必须注意:不能在构造器里显式使用return来返回当前类的对象,因为构造器的返回值是隐式的
省略this前缀只是一种假象,虽然程序员省略了调用jump()方法之前的this,但实际上这个this依然是存在的,对于java语言来说,调用属性,方法时,主调是必不可少的,即使代码中省略了主调,但实际的主调依然存在,一般来说,如果调用static修饰的成员(包括方法,field)时省略了前面的主调,那么默认使用该类作为主调,如果调用没有static修饰的成员时省略了前面的主调,那么默认使用this作为主调
长度可变的形参只能处于形参列表的最后,一个方法中最多只能包含一个长度的形参,调用包含一个长度可变形参的方法时,这个长度可变的形参既可以传入多个参数,也可以传入一个数组。
对于int f(){}和void f(){}两个方法,如果这样调用int result = f();,系统可以识别是调用返回值类型为int的方法;但java调用方法时可以忽略方法返回值,如果采用如下方法来调用f();你能判断是调用哪个方法吗?如果你尚且不能判断,那么java系统也会糊涂,在编程过程中有一条重要规则,不要让系统糊涂,系统一糊涂,肯定就是你错了,因此,java里不能使用方法返回值类型作为区分方法重载的依据。
java的常用包
java.lang: 这个包下包含了java语句的核心类,如String,Math,System和Thread类等,使用这个包下的类无需使用import语句导入,系统会自动导入这个包下的所有类。
java.util: 这个包下包含了java的大量工具类/接口和集合框架类/接口,例如Arrays和List,set等
java.net: 这个包下包含了一些java网络编程相关的类/接口
java.io:这个包下包含了一些java输入/输出编程相关的类/接口
java.text:这个包下包含了一些java格式化相关的类
java.sql:这个包下包含了java进行JDBC数据库相关的编程的相关类/接口
java.awt:这个包下包含了抽象窗口工具集,这些类主要用于构建用户图形界面
java.swing:这个包下包含了swing图形用户界面编程的相关类/接口
通常建议为java类保留无参数的默认构造器,因此,如果为一个i类编写了有参数的构造器,则通常建议为该类额外提供一个无参数的构造器
为什么要用this来调用另一个重载的构造器?如果仅仅从软件功能实现上来看,这样复制,粘贴确实可以实现这个效果,但从软件工程的角度来看,这样做是相当糟糕的。在软件开发里有一个规则:不要把相同的代码段书写两次以上,因为软件是一个需要不断更新的产品,因此尽量避免相同的代码重复出现,充分复用每一段代码,既可以让程序代码更加简洁,也可以降低软件的 维护成本。
为了在子类方法中访问父类中定义的,被隐藏的实例变量,或为了在子类方法中调用父类中定义的,被覆盖(Override)的方法,可以通过super.作为限定来调用这些实例变量和实例方法
引用变量在编译阶段只能调用其编译时类型所具有的方法,但运行时则执行它运行时类型所具有的方法。因此,编写java代码时,引用变量只能调用声明该变量时所用类里包含的方法。例如,通过Object p = new Person()代码定义一个变量p,则这个p只能调用Object类的方法,而不能调用Person类里定义的方法。
当把子类对象赋给父类引用变量时,被称为向上转型(upcasting),这种转型总是可以成功的,这也从另一个侧面证实了子类是一种特殊的父类。这种转型只是表明这个引用变量的编译时类型是父类,但实际执行它的方法时,依然表现出子类对象的行为方式,但把一个父类对象赋给子类引用变量时,就需要进行强制类型转换,而且还可能在运行时产生ClassCastException异常,使用instanceof运算符可以让强制类型转换更安全
String str = "123"
int it1 = Integer.parseInt(str);
int it2 = new Integer(str);
String floatStr = "4.56";
float it1 = Float.parseFloat(floatStr);
float it2 = new Float(floatStr);
String ftstr = String.valueOf(2.345f);
把基本类型变量和“”进行连接运算,系统会自动把基本类型变量转换成字符串
//intStr的值为"5"
String intStr = 5 + "";
java对数据进行缓存,缓存是一种非常优秀的设计模式,在java,java EE 平台的很多地方都会通过缓存来提高系统的运行性能,简单地说,如果你需要一台电脑,那么你就去买了一台电脑。但你不可能一直使用这台电脑,你总会离开这台电脑-在你离开电脑的这段时间内,你如何做?你会不会立即把电脑扔掉?当然不会,你会把电脑放在房间里,等下次又需要电脑时直接开机使用,而不是再次去购买一台。假设电脑是内存中的对象,而你的房间是内存,如果房间足够大,则可以把所有曾经用过各种东西都缓存起来,但这不可能,房间的空间是有限制的,因此有些东西你用过一次就扔掉了。你只会把一些购买成本大,需要频繁使用的东西保存下来。类似地,java也把一些创建成本大,需要频繁使用的对象缓存起来,从而提高程序的运行性能。
|