关于命名
class SuperClass {
public static void main(String[] args) {
System.out.println("SuperClass");
}
}
class SubClass extends SuperClass {
public static void main(String[] args) {
System.out.println("SubClass");
}
}
没有public类,这段源程序随意命名(扩展名必须是java),我把它命名为Test.java,编译后的字节码文件为SubClass.class和SuperClass.class,如果其中一个类为public的,则源文件名也必须是类名。当然,一段源程序也不可以存在多个public的类。
变量包括域(field)、局部变量和形参。
类中未初始化的域将自动设置为缺省值,缺省值取决于该域的类型。
public class Test {
public int i;
public static void main(String[] args) {
Test t=new Test();
System.out.println(t.i);//输出: 0
}
}
变量在初试化之前没有定义,不能使用未赋值的变量。
public class Test {
public static void main(String[] args) {
int i;
int j=i+1;
}
}
初始化器
当说明一个域时,可指定一个相应类型的值对该域进行初始化,等号后面是一个表达式,称为初始化器。
初始化器不一定是常量,也可以是另一个已声明过的域、方法调用(方法可以后面定义)、或由它们构成的表达式。
class X {
int x=y;//不能使用未声明的域
int y=method();//可以使用后面定义的方法
int z=y;
int method() { return 3;}
public static void main(String[] args) {
X r=new X();
System.out.println(r.x+", "+r.y+", "+r.z);
}
}
访问控制
一个类的所有域和方法都可被类本身代码访问。
一个类及其域和方法在其他类中能否被访问,由访问控制(修饰)符决定。
类的访问控制修饰符:public, package(缺省)
public类可以被所有其他类访问;
package类可以被同一包中所有其他类访问;
“访问”指的是这个类作为整体是可见和可使用的,即用来创建对象、派生子类、访问这个类(对象)可见的成员; 类的可见性只是其成员可见性的必要条件。
类成员的访问控制修饰符:public, protected, package(缺省), private
private成员只能在本类中被访问;
package成员可在同一包内所有类中被访问;
protected成员可在三种类中被访问:类自身、同一包内的其他类、其他包中该类的子类;
public成员可以在能访问该类的类中被访问。
注意:private成员在子类中被继承,但不能直接访问
class MyClass {
private int x=1;
int getX() {return x;}
void setX(int y) {x=y;}
}
class MySubClass extends MyClass {
int z=2;
public static void main(String[] args) {
MySubClass o=new MySubClass();
//System.out.println(o.x);//报错
System.out.println(o.getX()); //1
o.setX(4);
System.out.println(o.getX());//4
}
}
构造器
给新创建对象的域赋初值,由构造器完成。 构造器与类同名,可以有多个参数,也可以没有。 不是方法,没有返回类型。
利用new创建对象的过程包含了调用构造器的过程,顺序是,一个新创建对象的实例变量先被指定为它们的缺省值,然后执行显式的初始化,最后调用构造器。
构造器可具有任何类成员同样的访问修饰符,但它不是类的成员。构造器不能被继承。
一个构造器可调用同类中的另一个构造器:使用this()作为第一条可执行语句,这称为显式构造器调用,也可以有参数。
显式构造器调用的实参不能包含当前对象的任何成员,这是因为当前对象尚处于构造阶段。
如果在一个类中未提供任何形式的构造器,Java语言将提供一个不做任何事的缺省的无参构造器。 缺省构造器与其相应的类具有相同的访问控制。
拷贝构造器—当前对象类型作为形参, 与C++不同,Java并不自动提供缺省的拷贝构造器!!!
Body(Body other){
idNum = other.idNum;
name = other.name;
orbits = other.orbits;
}