java基础入门随记(一)

java中关于整型基础变量类型需要关注的地方

  1. byte: 1字节
  2. short: 2字节
  3. int: 4字节
  4. long: 8字节
    十六进制用0x开头,八进制用0开头,java7开始,前缀加0B或0b就可以写成二进制数。为区分位数,不管是多少进制,还可以加下划线,如:1_000_000、0b1000_0100_0000_1011等,java编译器在编译时会将下划线忽略。
    java中,整型的范围与运行java代码的机器无关,无论是在多少位的处理器上运行,定义的整型类型是多少便是多少。Java没有任何无符号数(unsigned).

java中关于浮点数基础变量类型需要关注的地方

  1. float: 4字节 后缀名以F或f结尾,不标注后缀的认为是double型
  2. double: 8字节 后缀可以忽略,也可以显式表示,用D或d

可以使用十六进制表示浮点数,0.125=2(-3) 可以表示为0x1.0p-3;注意,尾数采用十六进制,指数采用十进制,指数的基数是2,而不是10。
浮点数值不适用于无法接受舍入误差的金融计算中,如2.0-1.1,打印输出为0.8999999999而不是0.9。原因:浮点数值采用二进制系统表示,而在二进制系统中无法精确表示分数1/10,这就好像十进制无法精确表示1/3一样。这时候可以使用BigDecimal类。

java中关于字符基础变量类型需要关注的地方

  1. char:

转义字符尤其需要注意:转义序列\u可以出现在字符、字符串中,还可以出现在其他地方,包括变量定义上、注释中等。原因是在于:Unicode转义序列会在解析代码之前得到处理,因此使用时需要格外注意。

java中关于变量注意的地方

变量名必须是一个以字母开头并由字母或数字构成的序列,其长度基本上没有限制。
java中的字母包括:‘A’~‘Z’、‘a’ ~ ‘z’、’_’、’$'或某种语言中表示字符的任何Unicode字符。但是不要使用 $,因为其只用在java编译器或其他工具生成的名字中。
常量者使用final关键字来指定,如 final int MP = 3;

java中关于移位注意的地方

>> 右移:用符号位填充高位
<< 左移:
>>> 右移:用0填充高位
不存在<<<
关于移位操作,右操作数要完成模32的运算,除非左操作数是long类型的,那么就要使用模64的运算。如1<<35 等价于 1<<3

java中关于字符串注意的地方

String类对象称为不可变字符串,因为不能修改Java字符串中的字符。其优点:编译器可以让字符串共享。
可以将字符串变量理解为指针,变量只是指向对应的字符串,多个字符串变量可以同时指向同一个字符串常量。正因为如此,在比较字符串相等问题上,不能想当然的使用"==",而应该使用equals方法。"==“只能确定两个字符串是否放置在同一个位置上,即是否指向同一个字符串;而不同的位置上也可能存放着相同的字符串。
实际上,只有字符串常量是共享的。 而+和substring()等操作产生的结果并不共享。
空串”":是一个字符串对象,有它自己的长度0
null:不是字符串对象,表示没有指向任何字符串对象,操作时就会出错,常常对字符串变量先检测是否为null

  • 码点与代码单元:待补充

java中关于读取输入

必须使用Scanner类,同时关联标准输入流。
Scanner in = new Scanner(system.in) 对应的包为 java.util,当使用的类不是定义在基本的java.lang包中时,就需要import将包导入程序中。
读取输入则使用in.nextLine(); in.nextInt(); in.nextDouble();

  • 当遇到读取输入语句时,程序会等待用户输入,直到用户输入回车为止,然后程序继续运行,当再次遇到输入读取时,如果输入缓存区还有未读完的数据或者读不到,则会再次等待;如果输入缓存区内还有数据,则会直接读取继续执行。

java中关于控制流程

  • 在语句块中,java不允许在嵌套两个块中声明同名的变量,在编译时会出错。
  • 在for循环中,判断语句中要特别小心浮点数的比较,尤其是判断相等时。如:for (int i = 1;i!=10;i+=0.1){} 因为在java中无法精确表示0.1,因此该循环可能永远不会结束。
  • java可以使用带标签的break和continue语句,代替了goto语句。break是跳出带标签的语句块,continue是跳到带标签的语句块的首行。注意:带标签的break只能跳出语句块而不能跳入语句块。
  • for each语句:for (variable: collection) statement,collection必须是一个数组或实现了Iterable接口的类对象(如:ArrayList)。

java中关于大数值

java中,当基本的整数和浮点数精度不能满足需求时,可使用java.math包中的BigInteger类(整数)和BigDecimal类(浮点),他们可以处理任意长度的数字序列的数值,可以实现任意精度的运算。
关于大数值得运算,必须使用他们对应的类方法,而不能使用算术运算符。

java中关于数组

定义数组时,数组长度不要求是常量,如 int[] a = new int[n]; 其中,int[] a;int a[];一样都可以声明数组。
创建数组时的默认初始化:数字数组:初始化为0;boolean数组:初始化为false;对象数组:初始化为null,表示还未存放任何对象。注意:一旦创建了数组,就不能再改变它的大小了。

java中关于类和继承

java中的所有类都源自于一个超类:Object类
并不是所有的类都具有面向对象的特征,有些只提供了静态方法,如Math类。
对象的三个主要特性:

  • 对象的行为(behavior):(类的方法)
  • 对象的状态(state):(类的实例域)
  • 对象标识(identity):(变量名)。
    类之间的关系:
  • 依赖(uses-a):一个类的方法操纵另一个类的对象
  • 聚合(has-a):类A的对象包含类B的对象
  • 继承(is-a):

对象与对象变量的区别:
对象变量不是对象,但是它可以引用到对应的对象上,引用可以用指针的概念来理解,指向一个对象。一个对象变量并没有实际包含一个对象,而仅仅只是引用了一个对象。哪怕是new操作符的返回值也只是一个引用。
局部面两不会自动初始化为null,而必须通过调用new或将它们设置为null进行初始化。

  • 一个源文件的文件名必须与public类的名字一样,一个源文件中,只能由一个public类,而可以由任意个非公有类。因为公有类可以被其他类访问。当一个源文件中涉及多个类时,在编译的时候,由几个类便会生成几个.class文件。
  • 良好的习惯是,一个类一个源文件,此时这要编译含main函数的类,编译器便可以根据调用的情况去自动搜索进行编译。

关键字:
public:意味着任何类的任何方法都可以调用;
private:确保只有自身类的方法能够访问或调用,而其他类的方法无法读写或调用;

  • 构造器与类同名;
  • 在构造类对象是自动调用,其重视伴随着new操作符的执行被调用,而不能对一个已存在的对象调用构造器来达到重新设置实例域的目的。
  • 每个类可以有一个以上的构造器;
  • 构造器没有返回值;
  • 构造器可以有0个及以上的参数。

java对象都是在 堆 中构造的。

方法中参数有隐式参数和显示参数,隐式参数:出现在调用方法名前的类对象,关键字this表示隐式参数,往往把隐式参数称为方法调用的目标或接收者。使用this也方便区分类的全局变量和局部变量。

注意: 在类的方法中,不要编写返回引用可变对象的访问器方法。否则就会是的类中的变量可以通过方法的返回值进行直接操作,便破坏了封装性。
如:

class Employee{
	private Date hireDay;
	public Date getHireDay(){
		return hireDay;
	}
}

此时虽然不能直接访问Employee的私有变量,但是通过方法的返回值,将可以对对象hireDay所指向的区域进行直接操作Date方法。

类的方法可以访问同类的任何一个对象的私有域, 此行为合法。
类的私有方法还有一个好处:对于开发者,对于私有方法只是面向类内部的,如果后期改动或者是删除,只要保证类的功能不变,而可以确保不会改变用户对类的使用等情况。

类中静态域的注意点:
如果将域定义为static,则类只有一个这样的域;类可以创建多个实例对象,每个实例对象都有属于自己的域(或者说有对应的内存块),而静态域则永远只有一个,它属于类而不属于实例对象,哪怕没有实例对象,静态域也存在,但是所有实例都共享这个静态域。

类中静态方法的注意点:
静态方法是一种不能向对象实施操作的方法,只能通过类直接调用,因此静态方法没有隐式的参数,故静态方法便不能实例域,但是可以访问静态域,因为前面讲过,静态域属于类而不属于实例对象。

类中关于方法参数的注意点:
请首先记住java程序设计语言总是采用按值调用的,也就是说,方法得到的是所有参数的拷贝,特别是方法不能修改传递给他的任何参数变量的内容。此处容易引起的误解是当参数为实例对象的引用时,依旧还是按值传递吗?答案是肯定的,依旧是按值传递,可以理解为新创建了一个实例变量,指向了原来实例对象的引用,方法中可以改变引用处的值,但是方法并没有改变原来的实例对象所应用的地址块。所以,依旧是按值传递的。这里比较绕,应该加点图的。

关于类的构造器:
一个类可以有多个构造器,这种特性便称为是重载 ,而程序匹配构造器的过程被称为重载解析 。同时Java允许重载任何方法,不单单是构造器。为区分同样方法名的重载方法,每个方法都有一个签名,方法的 签名函数名参数类型 两部分组成,不包含返回值的类型。
类也不编写构造器,当类没有构造器时,系统会提供一个无参数构造器,在创建实例对象时,就会对类中实例域进行自动的默认初始化(数值为0,boolean为false,对象为null)。但是 ,如果定义了一个由参数的构造器,而创建实例对象时没有提供参数,则视为不合法。故要么不要写构造器,由系统自己提供一个;如果编写的构造器,就必须严格按照编写的构造器进行。
特别注意: 类的域在没有构造器时会自动默认初始化,但是必须明确初始化方法中的局部变量,否则程序编译会出错。

类的构造函数不能被调用,但是可以在类中的构造器中的第一个语句使用this(…)调用另一个构造器。注意,必须是第一条语句。

除了在声明实例域时初始化和构造函数对实例域进行初始化外,还可以通过初始化块进行初始化数据,在一个类的声明中,可以包含多个代码块,代码块用{}包起来,只要构造类的对象,这些块就会被执行。先运行这些代码块,然后才运行构造器的主体部分。

构造器的具体处理步骤:

  1. 所有数据被初始化为默认值;
  2. 按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块;
  3. 如果构造器第一行调用了第二个构造器,则执行第二个构造器主体;
  4. 执行这个构造器的主体。

由于java有自动的垃圾回收器,不需要人工回收,因此java不支持析构器;
析构器最常见的操作便是回收分配给对象的存储空间。
但是,某些对象使用了内存之外的其他资源,例如,文件或使用了系统资源的另一个对象的句柄。在这种情况下,当资源不再需要时,将其回收和再利用将显得十分重要。
可以为任何一个类添加finalize方法。其将在垃圾回收器清楚对象之前调用。好的开发人员,应尽量避免依赖于finalize。

java中包

java允许使用包将类组织起来。使用包的主要原因:确保类名的唯一性。

一个类可以使用所属包中的所有类以及其他包中的公共类;
import语句可以导入类、也可以导入静态方法和静态域。
如何将类放入包中:
想要将一个类放入包中,必须将包的名字放在源文件的开头。
如果没有在源文件中放置package语句,这个源文件中的类就被放置在一个默认包(default package)。

package com.horstmann.corejava;

public class ...{
	...
}

包的作用域:
标记为private的部分只能被定义它们的类使用;
如果没有指定public或private,这个部分(类、方法、变量)可以被同一个包中的所有方法访问,但不能被包外的方法访问。

你可能感兴趣的:(java基础入门随记(一))