java学习笔记1
1.java类中的静态域与静态方法:
静态域与静态方法需要使用static关键字,
静态域:将域定于为static,每个类中都有这样一个域,而每个对象对该域有一个自己的拷贝,
public class Employee {
private static int nextID=1;
private int id;
public int getId() {
return id;
}
public void setId(int id) {
nextID++;
this.id = nextID;
}
}
Employee 的所有实例共享一个nextID,各拥有一个id.
静态常量:
class Math
{
public static final double PI=3.1415926;
}
Math类中,PI为一个静态常量,不容再修改,且可以通过Math.PI直接访问。
静态方法:一种不能想对象实施操作的方法。例如Math类中的pow方法。
class MyMath
{
public static final double PI=3.1415926;
public static double getPI()
{
return PI;
}
};
静态方法不能操作对象中的非静态成员,但可以操作对象中的静态域(如过域是非final的,还可以进行修改操作。)
class MyMath
{
public static double PI=3.1415926;
public static double getPI()
{
return PI;
}
public static void setPI()
{
PI++;
}
};
可以通过类名访问静态域。(访问指get与set)。
2.类构造器用法
初始化数据具有多种途径,以下是构造过程中的构造顺序。
1).所有数据域被初始化位默认值(0,false,或null)
2).按照在类中声明的次序,依次执行所有域初始化语句和初始化块。
3).如果构造器第一行调用了其他的构造函数,则执行第二个构造函数。
4).执行构造函数的主体。
class Employee {
private static int nextID=1;
private int id;
private String name;
private double salary;
public Employee () {
name="";
salary=0;
}
//初始化块
{
id=nextID;
nextID++;
}
static //静态初始化块
{
Random generator=new Random();
nextId=generator.nextInt(1000);
}
}
3.类设计技巧
1).一定要将数据设置为私有,不要破坏类的封装性。
2).一定要对数据进行初始化
3)不要在类中使用果断的基本类型(不要将多个字段表示成一个属性,例如,地址可以定义成一个类,包含country,province,city等,而不要单独定义country字段,city字段,province字段)
4)不是所有的域都需要独立的域访问器和域更改器。有些字段在使用的时候需要加以限制。
5)使用标准格式进行类的定义。
6)将职责过多的类进行分解。
7)类名和方法名要能够体现他们的职责。
关于继承中的几点要求:
1)只能在继承层次间使用类型转换
2)在将超类(父类)转换成子类之前,应该使用instanceof进行检查。
3)若不希望一个类被继承,可以将该类设置为final类,不希望类中某一方法被重写,可以将该方法设置为final
4)抽象类的对象变量只能应用非抽象的子类
Java用于控制可见性的四个访问修饰符
1)仅对本类可见-----private
2)对所有类可见-----public
3)对本包和所有子类可见----protected
4)对本包可见-----默认
相等测试与继承
Java要求equals方法具有下面的一些特征:
1)自反性:对于任何非空引用X,x.equals(x)应该返回true
2)对称性:对于任何引用x和引用y,当且仅当y.equals(x)返回true ,x.equals(y)也要返回true
3)传递性:对于任何引用x,y,z,如果x.equals(y),y.equals(z),x.equals(z)也要返回true
4)一致性:如果x和y的引用对象没有发生变化,反复调用x.equals(y)得到同样的结果。
Java 中的可变量参数
public static double Max(double...ds)
{
double largest=Double.MIN_VALUE;
for(double v:ds)
{
if(v>largest)
{
largest=v;
}
}
return largest;
}
ds的类型是double[]
Java 中的反射学习
Java 运行时系统为所有的对象维护一个被称为运行时的类型标示,这个信息保存着每个对象所属的类足迹,保存这些信息的类被称为Class.
1)Object的getClass()方法将会返回一个Class类型的实例.
Employee e ;
e.getClass().getName() //返回 "Employee"
2)通过Class.forName(String className)来获得Class 实例
Class a=Class.forName("Employee") //如果有包名,则需要加上包名
Class date=Class.forName("java.util.Date")
3)如果T是任意的Java类型,T.class将代表匹配的类对象
Class cl1=Date.class;
Class cl2=int.class;
通过class的newInstance()方法可以创建一个类的实例, 如e.getClass().newInstance()
利用反射写的一个扩展数组的方法
public static Object goodArrrayGrow(Object a)
{
Class cl=a.getClass();
if(cl.isArray())
{
return null;
}
Class componentType=cl.getComponentType();
int length=Array.getLength(a);
int newLength=length*11/10+10;
Object newArray=Array.newInstance(componentType, newLength);
System.arraycopy(a, 0, newArray, 0, length);
return newLength;
}
接口学习
为了让类实现一个接口,通常需要完成如下的操作
1)将类声明为实现给定接口
2)对接口中的所有方法经行实现
在接口中,所有的方法默认都是public的也只能是public的,可以使用abstract修饰词,因而在类中实现接口的时候必须制定接口的方法为public (实现接口的类的方法的的访问权限应该比接口中的权限高)
3)接口中的方法不能实现,只能在实现接口的类中实现