(一) 基本程序设计结构
数据类型:
整形分为int long short byte
java中不含有任何无符号类型(unsigned)
java中不区分变量的声明和定义
常量使用final修饰,习惯上常量名使用大写字母
数学函数与常量:
主要借助 Math 类
Math类中常用方法包含 Math.sqrt() Math.pow() Math.PI Math.E
字符串:
String类型是不可变字符串 可以通过substring()方法进行字符串拼接
equals 方法可以检测两个字符串是否相等
equalsIgnoreCase() 方法可以不区分大小写进行字符串相等比较
注意:java中没有重载"=="进行相等比较的操作
空串和Null串
可以调用length()方法,或者将字符串和空字符串进行比较的equals(" ")方法进行判断
null串则是直接进行"=="对比判断
码点和代码单元
charAt()方法可以直接返回该码点的代码单元
StringBuilder 类提供更方便的增添功能 (字符串构建器)
toString()方法返回字符串 append()方法实现增添
输入输出:
Scanner类实现标准输入
Scanner sc = new Scanner(System.in);该类包含在java.util包中,当一个类不包含在java.lang包中的时候需要将其包含进来为了避免内存的浪费输入完了以后可以及时关闭输入,使用Scanner.close()方法进行关闭。
为了克服Scanner的可见性缺点Java有引入Console类专门用来读取密码
基本类型转换符:
d,x,o,f,e,g,a,s,c,b,h java中有System.out.printf()方法
文件的输入与输出
使用file对象构造一个Scanner对象
循环:
java中提供了带有标签的break & continue:
break flag;continue flag;java中的通用型for循环(for each循环)
for(variable : collection) statement
例如:
for(int element : a) System.out,println(element);
大数值:
如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个很有 用的类:BigInteger和BigDecimal,分别实现任意精度的整数运算和浮点数运算。
数组:
要想获得数组中元素的个数可以调用array.length方法
数组处理:
可以使用Arrays类中的sort方法 java.util.Arrays
Arrays类中包含有二分搜索算法 static int binarySearch(type[] a,type v);
equals方法比较数组是否相等同样包含在Arrays类中
打印数组Arrays.toString()方法
多维数组:
若要使用foeach循环遍历二维数组则需:
for(double[] row : a) for(double value : row) { do something with value; }
java中的多维数组不同于c/c++ 它是一种不规则数组,更可以被称作为“数组的数组”
同一维数组,若想快速的打印出数组的数据元素列表,可以调用Arrays.deepToString()方法;
(二)对象与类
引用:
java中的引用不同于c++,且所有的Java对象储存在堆中
例如:
Date birthday;//Java
实际上等同于
Date *birthday;//C++
Date birthday 仅声明了对象变量,一个对象变量并没有实际上包含一个对象,要进行引用对象,对其进行存储地址的分配。
也就是:Date birthday = new Date();
Java类库中的LocalDate类,可进行查阅学习
main方法:
每一个类可以包含一个main方法,这是一个常用于对类进行单元测试的技巧
例如:
class Employee
{
public Employee(String n,double s,int year,int month,int days)
{
name = n;
salary = s;
LocalDate hireDay = LocalDate.now(year,month,day);
}
...
public static void main(String[] args)//unit Test
{
Employee e = new Employee("Romeo",50000,2003,3,31);
e.raiseSalary(10);
System.....
}
//如果想要独立的测试Employee类只需要执行 java Emloyee
方法参数:
一个方法可以修改传递引用所对应的变量值,但不能修改传递至调用所对应的变量值。
java程序对对象采用的不是引用调用,实际上对象引用是值传递的。
包(package):
Java中使用包将类组织起来,更方便于使用者组织自己的代码,并将自己的代码和别人提供的分开管理。
(三)继承
基础语法:
继承符号:extends ; 超类 extends 子类
方法覆盖:
方法重载:Overload
作用:解决了同一个类中,相同的功能方法名不同的问题,相同的功能,相同的方法名。
规则:(两同一不同)
同类中,方法名相同,方法参数列表不同(参数类型、参数个数、参数顺序)
方法覆盖:Override
作用:当子类拓展了父类,可以获得父类的部分方法和成员变量。可是当父类的某个方法不适合子类本身的特征时,此时子类需要重新定义父类的方法,并重写方法体,这就叫方法覆盖。
原则:
覆盖方法必须和父类中被覆盖方法具有相同的方法名称、输入参数和返回值类型。
覆盖方法不能使用比父类中被覆盖方法更严格的访问权限。
覆盖方法不能比父类中被覆盖方法抛出更多的异常若想调用父类方法则可使用 super 关键字
子类构造器:
public Manger(String name,double salary,int year,int day) { super(name,salary,year,day) bonus = 0 }
这里的super() 便是调用父类构造器的简略形式;this()类似而言也可以调用本类的构造器。
由于父类属性一般是私有域,所以一般需要使用父类的构造器对其属性进行初始化,可以使用super 实现对父类构造器的调用,使用super调用的语句必须是子类构造器的第一条语句。
如果子类的构造器没有显式的调用父类的构造器,则将自动的调用超类默认构造,若超类没有不带参数的构造器,编译器将会报错。
继承层次:
继承并不限于一个层次。由一个类派生出来的所有的类的集合被称为继承层次。由某个特定的类到其祖先的路径被称为继承链。
注:Java中不支持多继承。
方法调用:
弄清楚如何在对象上应用方法调用非常重要。比如下面假设要调用x.f(args),隐式参数x声明为类C的一个对象。下面是调用过程的相信信息。
编译器查看对象的声明类型和方法名。假设调用x.f(args),且隐式参数x声明为C类的对象。要注意的是,可能有多个名字为f的方法,但是它们的参数类型和返回名称不同。比如:f(int)和f(String)。编译器将会一一列举所有C类中名为f的方法和其超类中访问属性为public且名为f的方法(超类私有方法不可以访问)。
接下来,编译器查看调用方法时提供的参数类型。如果有方法f完全匹配,就是用该方法,这个过程被称为重载解析,不过允许参数类型转换,比如int可以转换为double等等。如果编译器没有找到与参数类型匹配的方法,或者发现经过类型转换后有多个方法与之匹配,就报错。
如果是private、static或final方法,编译器可以准确地知道调用哪个方法,我们将这种方法调用称为静态绑定(static banding)。与之相对应的是,调用的方法依赖于隐式参数的实际类型,并且在运行时实现动态绑定。
当程序运行时,并且采用动态绑定调用方法时,虚拟机一定调用与x引用对象实际类型最合适的那个类的方法,如果当前类中没有,还会在其父类中进行寻找。
因为每次调用方法都需要进行搜索,时间开销比较大。因此虚拟机预先为每个类创建了一个方法表,其中列出了所有方法的签名和实际调用的方法。虚拟机当在调用方法的时候仅查找这个表就够了。
阻止继承:final 类和方法
当你希望阻止人们利用某个类定义子类时就可以定义为final类(不允许扩展类),例如Executive类为final类
public final class Executive extends Manger { ... }
类中的方法也可以声明为final,这样子类就不能覆盖这个方法;
强制类型转换:
type x = (type b) nx;
有时候也需要将某个类的对象引用转换成另外一个类的对象引用。
但需要注意:
1)只能在继承层次内进行类型转换
2)在将超类转换成子类之前,应该使用instanceof进行检查
3)将一个超类的引用赋值给子类变量,必须进行类型转换
//试图从继承链上进行向下的类型转换,并且假报有关对象包含的内容则会报错; //staff[1]是超类的引用Employee Manger boss = (Manger) staff[1];//Error if(staff[1] instanceof Manger) { boss = (Manger) staff[1]; ... }//先进行判断防止程序异常终止
instanceof : 判断一个对象是否为指定类的实例左值为引用类型,右值为class