Java基础
第二章一切都是对象
1.引用和对象相关联 通过new关键字创建对象,就可以将引用于对象关联
2.Java可以自行创建类型,引用类型。
3.存储:寄存器、堆栈、堆、常量存储、非RAM存储。
寄存器位于处理器内部,所以存储速度快,但是数量有限。寄存器根据需求进行分配,不能直接控制,在程序中也不能感觉到寄存器存在的迹象。
堆栈位于通用RAM(随机访问存储器),通过堆栈指针上下移动来分配内存和释放内存。是快速有效的内存分配方式,仅次于寄存器。Java程序的对象引用存储在其中。
堆位于通用内存池(RAM区),存储Java对象。编译器不需要知道对象在堆中的存活时间。但是用堆进行存储分配和清理比用堆栈进行存储分配需要更多的时间。
常量存储常量值直接存放在代码内部,不会被改变。
非RAM存储不受程序任何控制。
Example:
流对象:对象转化成字节流,被发送另外一台机器。
持久化对象:对象存储在磁盘上。Java提供轻量级持久化的支持。存储在磁盘上的数据可以恢复成常规的、基于RAM的堆中的对象。
4.Java的特例:基本类型
对象是用new创建,存储在堆中。对于简单的、小的变量,这种方式创建变量效率很低。Java不用new创建变量,而是创建一个不是引用的“自动”变量,这个变量直接存储值位于堆栈中,更加高效。
Java可移植性的原因之一:Java为每种基本类型所占的存储空间的大小是确定的,不同于其他语言会根据机器硬件架构的变化而改变所占存储空间的大小。
boolean、char(16-bit)、byte(8bits)、short、int、long、float(32bits)、double、void 所有的数值类型都有正负号,所以不要去寻找无符号的数值类型。
5.高精度数字 BigInteger、BigDecimal 属于包装器类,但是没有对应的基本类型。
两个包装器类包含的方法,提供的操作与对基本类型所能执行的操作相似。能作用于int、float的操作,也同样能作用于BigInteger、BigDecimal。
区别在于是方法的调用取代了运算符的操作,更加复杂,速度慢,但是精度提高了。(速度换精度)
BigInteger:支持任意精度的整数。在运算中可以表示任意大小的整数值而不丢失任何信息。
BigDecimal:支持任何精度的定点数。例如进行精确的货币计算。
6.Java中的数组是安全的,因为创建数组对象时,实际是创建一个引用数组,引用数组的每个引用会初始化为null,即表示该引用是没有指向任何对象的。引用在使用前必须指定一个对象,否则在运行时会报错空指针。
创建存放基本数据类型的数组,编译器会确保数组初始化,在内存中全部置0。
7.作用域 编译器报告变量x已经定义过了。
Java对象不具备和基本类型一样的生命周期。创建的对象可以存活于作用域之外,在引用的作用域之外对象仍然存在。
Java的垃圾回收器监视用new创建的所有对象,没有引用指向的对象将会被回收,所占用的内存会被自动释放。
8.方法签名:方法名+参数列表(唯一标识出某个方法)
9.static关键字两种情况:
为某一特定域分配单一存储空间。
某个方法不与包含它的类的任何对象实例关联。
不创建对象也能调用static方法或访问static域。(类数据和类方法,代表这些数据和方法只是作为整个类而不是类的某个特定对象而存在)
static作用于字段,改变数据创建的方式,一个static字段对每个类只有一个存储空间,而非static字段对于每个对象只有一个存储空间。
static作用于方法不创建任何对象可以直接调用。
第三章操作符
1.Java中的数据,在最底层是通过操作符来操作的。
2.操作符接受一个或多个参数,并生成一个新值。
操作符作用于操作数,生成一个新值。
操作符的副作用:有些操作符会改变操作数的值。
绝大多数操作符只能作用于基本类型,除了=,==,!=可以操作对象以外。
String类型还可以使用+、+=操作符。
操作符的优先级决定了各部分的计算顺序。先乘除后加减,添加括号
String类型的+:连接字符串和将非String类型进行类型转换。
2.别名现象:一个类A的产生两个实例对象A a1 = new A(1),A a2 = new A(2);将a1赋值给a2,(a2 = a1; ),会覆盖掉a2的引用,使a1,a2都指向同一一个对象。
避免别名问题:进行属性赋值,a2.xxx = a1.xxx;
3.自动递增递减 除赋值操作符以外,唯一具有副作用的操作符,会改变操作数。
4.比较运算符boolean 对象内容的比较和对象的引用的比较
== != equals()
5.短路 && ||
6.移位操作符 三元操作符
7.类型转换操作符cast 模型铸造
窄化转换narrowing conversion 面临信息丢失的危险
截尾和舍入
扩展转换widening conversion 不会丢失任何信息
8.Java中没有sizeof
第四章控制执行流程
1.if-else、true、false
2.迭代 iteration statement
3.逗号分隔符、逗号操作符
4.吸血鬼数字
public class XiXueGui { public static void main(String[] args) { int chengji; int count = 0; int sum = 0; String[] num1,num2; for(int i=10;i<100;i++) { for(int j=i+1;j<100;j++) { chengji = i*j; if(chengji<1000||chengji>9999) { continue; } count++; num1 = String.valueOf(chengji).split(""); num2 = (String.valueOf(i)+String.valueOf(j)).split(""); java.util.Arrays.sort(num1); java.util.Arrays.sort(num2); if(java.util.Arrays.equals(num1, num2)) { sum++; System.out.println("第"+sum+"个"+i+"*"+j+"="+chengji); } } } System.out.println("循环次数:"+count); } }
5.斐波那契数列
第五章初始化与清理
1.为什么会有构造器?
构造器用来创建对象的同时进行初始化,因此不能够在其他方法中调用构造器,默认是无参构造器,可以省略,基本数据类型的初始值为0、0.0或false,引用类型的初始值为null。
2.编译器如何调用构造器?
编译器知道构造器的名称与类名完全一样,直接调用构造器,每个类都会有一个默认无参构造器,可以由编译器直接调用而不需要写出来,当自定义有参构造器时,无参构造器就会无效,如果需要调用无参构造器就必须将无参构造器写出来,这样编译器才会去调用无参构造器。
编译器能够根据参数的个数和顺序来区分调用不同的构造器。重载方法的使用有时是为了副作用而作用,即不考虑返回值,因此不能够根据返回值来区分重载方法。
3.this为什么只能在方法中调用?何时在哪里使用?
this代表当前类的对象,与类的其他对象一样,可以调用类的方法和字段。this的使用应该是在调用构造器、参数变量名和字段名相同时赋值使用、其他类的方法中调用本类的方法或字段。this不应该滥用,应该在需要使用的地方使用。
原文地址: https://www.cnblogs.com/liuwenpeng/p/11386382.html
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
相关文章