一、工具箱
1、JDK: Java Development Kit Java 程序员开发使用
2、JRE: Java Runtime Environment Java程序运行使用
二、变量 等 balabala
1、方法调用 object.method(parameters)
2、int 4字节(+-)、short 2字节(+-)、long 8 字节(+-)、byte 1字节(+-)、float 4字节(+-)、double 8字节(+-)、char16字节(无符号)
3、2.0 - 1.1 =0.89999999:浮点数通过二进制表示,而二进制无法精确表示分数1/10 无法通过1/(2^n)表示, (就像十进制无法表示1/3),可通过BigDecimal类解决
4、char 通过Unicode编码表 表示
5、boolean:false、true 无法与整型之间相互转换
6、final 修饰后为常量、static final 修饰后为类常量
7、Math.sqrt() 平方根、Math.pow(x,a) x的a次幂、Math.PI、Math.E
8、类型转换(实线无信息丢失、虚线有信息丢失)
9、子串:String greeting = "abcdef"; String s = greeting.substring(0,3); (abc);
可通过 + 拼接字符串。
10、字符串的比较:“Hello”.equals("hello")、equalsIgnoreCase不区分大小写
== 无法判断字符串是否相等,只能判断是否存储在同一位置
还有其他API等,例如 length() 返回字符串长度 、trim() 去掉字符串首尾空格
11、StringBuilder() 字符串构造器 ,builder.append(str) 即可使用、可避免重复new新的String对象问题。
12、输入 Scanner in = new Scanner(System.in); String name = in.nextLine(); 输入行中可以有空格、next() 以空白作为分隔、nextInt 读取下一个整数(import java.util.*)
13、输出 System.out.print("%8.2f",x) 用8个字符的宽度和小数点后两位的精度打印x
14、{} java中的块
15、判断if、循环while/do while/for、多重选择switch case break;
16、break 退出循环、continue 进入下一次循环
17、大数值 BigInteger a = BigInteger.valueOf(100)、c= a+b 需要写BigInteger c= a.add(b)
其他:add/subsract/multiply/divide/mod
BigDecimal 实现精度的浮点数运算
18、数组:int[] a = new int[100]; 增强for : for(varialbe:collection)statement
初始化:int [] smallPrimes = {1,2,3}; 匿名 new int[] {17,19, 23}
长度为0 : new elementType[0] 不等于null 、作为返回值比 null更好用
拷贝:int[] a = Arrays.copyOf(b,b.length);
快速排序方法:Arrays.sort(a);
随机与数组随机:(仅核心代码,下标思想)
int r = (int) Math.random()*n 0~n-1;
result[i] = numbers[r];
numbers[r] = number[n-1];
n- -;
多维:int[][] a = { {1,2},{3,4} };
不规则:先定义行,列根据程序写
三、对象与类
1、面向对象(OOP):取代“结构化”程序、数据第一位再考虑操作数据的算法。
2、类:构造对象的模板,类构造对象的过程叫做创建类的实例
方法:操纵数据的工具
变量:在实例的域中,存储数据的媒介
封装:让方法和变量进行分割,变得黑盒
超类:Object
3、对象
三特性:行为(可以对对象施加哪些操作?)、状态(施加方法后,对象如何响应)、标识(如何辨别相同行为和状态的不同对象?)
解释:同一类的不同对象具有家族式的相似性,对象的行为来自其可以调用的方法、状态的改变来自于方法的调用、对象存在唯一的身份,并能够相互区别
4、程序的设计
识别类:分析问题寻找共性(名词)
识别方法:共性中寻找动作(动词)
类之间的关系:依赖(A类需要用到B类的方法或数据)、聚合(包含的关系)、继承(复用的关系)
UML 绘图的基本方式:
5、类与对象的使用
构造器:用于构造新的实例,是一个特殊的方法
对象的创建:new Date();
方法的引用:new Date().toString();
对象存储于变量当中: Date birthday =new Date();
对象的初始化:新的构造:new Date()、引用已经存在的对象 Date birthday2 = birthday ;
对象变量:注意对象变量实际是对对象的引用,并非包含一个对象。
时间与日历分开表示:Date类主要用于表示时间点、GregorianCalendar主要用于表示日历。
更改器方法:对实例域做出修改的方法、set方法
访问器方法:仅访问实例域而不进行修改的方法、get方法
6、类的自定义
calss ClassName
{
field1
field2
...
constructor1
constructor2
...
method1
method2
...
}
7、构造器(构造方法)
特点:与类同名、在构造类的对象时运行(伴随new 操作进行)、将实例域初始化为所希望的状态、类可以有一个以上的构造器、构造器可以有 0 1 或多个参数、构造器没有返回值
注意:已经创新的对象无法再次调用、不可以在构造器内定义与实例域重名的变量(否则其只能在构造器内部访问?)
8、方法
类中的方法在调用时:对象为隐式参数(this.属性,其实this可以省略)、传入的值为显示参数 function(int value)。
9、属性(实例域)
数据域是私有的(private int a)、域访问器是公共的(get)、域更改器是公共的(set)
当属性为可变对象时(例如 Date对象),get方法需要clone后返回!否则会破坏类的封装性。
属性虽然私有,但可以通过类的对象来调用访问
私有方法:用于某些特定的场景、使用private修饰
final:修饰的内容用法为,在设置值后不可修改
10、静态域与静态方法
静态域:private static int nextId = 1; nextId 属于类,不属于任何独立的对象;即使在1000个对象中,也只有一个nextId
静态常量:public static final double PI = 3.14159265358979323846; 如果没有 static 则每一个对象都有自己拷贝的独特一份 PI, 并且PI需要通过Math类的对象来进行访问、静态常量可以用public来修饰,因为他是final的,无法被更改
静态方法:无法向对象实施操作的方法,不使用任何的对象(不可创建对象进行调用,容易混淆)、其没有隐式的参数(无this参数),故其不能访问方法中的实例域(属性值)、静态方法可以访问实例中的静态域、最后他直接使用类名进行调用(例如 Math.pow(x,a));
静态方法的应用场景:一个方法不需要访问对象状态、其所有参数都是通过显示参数进行提供、一个方法只需要访问类的静态域(get静态变量的方法)
工厂方法:利用静态方法进行实现(后续学习)
main方法:是一个不需要实例域(对象属性值)的静态方法,不需要对象调用
方法参数:方法的基本数据类型参数总数按值调用(本质是一个拷贝的数值,不同于C中变量的引用调用)、方法的对象参数也是值调用但是可以修改方法内的状态(实例域或属性值)
11、对象构造
构造器可以对定义的对象进行初始化,且java提供了多种编写构造器的方式。
重载:当类具有多个不同参数(参数个数不同、参数类型不同等等)的构造方法时,编译器可以对所有的构造方法进行挑选匹配并最终使用对应参数的构造方法,这个过程叫做重载解析
重载的进一步解释:Java允许重载任何的方法,不只是构造器方法,方法名称和参数类型构成了方法的签名(返回值类型不属于方法的签名)
默认域的初始化:数值为0、布尔型为false、对象引用为null;不推荐使用默认域的初始化,因为这会严重影响程序的可读性
无参数的构造器:实现了默认域的初始化,当编写类时没有编写任何的构造器时,系统会提供无参的构造器把所有的实例域设置为默认值;注意当创建了构造器后,必须要写无参的构造器(可以public classname(){ }),否则程序会编译错误!
重载的作用:保证类在不同情况下,能被设置一个有意义的初值
可以在类定义时赋予初值:private String name = "abc"、初始值不一定是常量,可以由static的方法来界定(比如方法内设置为自增长,判定对象是数目?)
参数名:增加程序的可读性:this.name = name or name = aName;
调用另一个构造器:可以通过this() 语句调用另一个构造器,使构造器的建立变得简单。
初始化块:(其他两种初始化数据域的方法:通过构造器设置值、在声明中进行赋值)不同于之前两种的第三种初始化数据域的方法,初始化块也会在创建对象时执行(构造方法之前)
例如以下代码:将雇员ID的起始值赋予一个小于10000的随机整数
static
{
Random generator = new Random();
nextId = generator.nextINt(10000);
}
对象析构与finalize方法
析构器:回收分配给对象的存储空间,由于java有自动的垃圾回收器,所以不需要人工回收内存,java不支持析构器
finalize:可以为任何类添加该方法,其在JAVA垃圾回收器回收对象之前调用,实际不会对这个进行调用。。。当某些资源需要使用后立刻关闭,可以通过close(),方法来进行清理操作。
12、包
java利用包将类组织起来、包可以进行层次的嵌套、包名建议为逆序的因特网域名(com.jelly)、
在编译器的角度上嵌套的包之间没有任何的关系。
类的导入有两种方法:java.util.Date today = new java.util.Date() ,这种明显是不常用(包中类名重复冲突时可能使用的到)、另一种:import java.util.* or import java.util.Date;Date today = new Date();
静态导入:
import static java.lang.System.*;
out.println("Goodbye, World!"); (这里省去了System)
exit(0);
or
import static java.lang.System.out;
sqrt(pow(x,2) + pow(y,2)) (这里省去了Math.sqrt)
不过这种方法好像是真的不常用!
把类放入包中进行引用:包名放在类源文件的开头(如果没有放在包中,实际在默认包 defaulf package 中)
包的编译:编译器在编译源文件的时候不会检查目录结构,而是根据源文件头部的语句进行执行
包的作用域:
13、类路径
类的路径必须与包名进行匹配,类文件最终可以归档存储在Jar包中
类路径的设置:Windows shell 中 set CLASSPATH = c:\a\b\c\d.jar
14、文档注释
注释的插入:javadoc从以下几个特性中抽取信息,包、公有类与接口、公有和受保护的构造器及方法、公有的受保护的域
多行注释:/** ........ */
方法注释:@param 变量描述、@return 返回值描述、@throws 异常描述
通用注释:@author 作者姓名、@version 版本、@since 引入版本的特性描述、@deprecated 不再使用、@see 添加路径后javadoc 可以生成超链
15、类设计技巧
一定要保证数据私有(实例域的私有性)
一定要对数据进行初始化(善于利用不同的构造方法)
不要在类中使用过多的基本类型(比如员工类中的地址可以通过新的地址对象类~)
不是所有的域都需要独立的域访问器合域更改器(比如入职日期不可随意更改等等啦)
将职责过多的类进行分解
类名和方法名要能体现他们的职责