Java手记---类

#一个类的实现:
(1)当装载这个类的时候,实际上是调用的类的 static 方法或者访问类的 static 字段的时候,java 解释器会搜寻 classpath 来找到这个类
(2)装载类后,会对 static 数据进行初始化。
(3)当用 new 创建一个新对象时,会在堆中为对象分配足够的内存
(4)内存先被清零 ,自动把对象的数据成员赋上缺省值。变量为 0 或对应的 true 或’/u0000’,引用赋为 null
(5)执行定义成员数据的初始化
(6)执行构造函数

#方法一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
////////////////////////////对象就是数据+方法。

/////////////这样构造类
class person1                               /////////////但不能这样声明  public class person1
{   ///////////////这样写会出错 。
String name;
int age;
}
public class person
{
public static void main(String[]
args)/////////main函数的参数必须这样写不能省略args,当然可以使用其他的变量
person1 test = new person1();
}
}

#方法二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
///////////////////这样也可以
public class person
{ String name;
int age;
public static void main(String[] args)

person test = new person();
}
}

class person //////////////class 前的public 可以不写。
{
public static void main(String[] args)
{
..........................................
}
}

class person1
{
String name;
int age;
void test()
{
in t = new in(); /////////////////////每一次都必须实例化。
t.test1();   ////////否则编译失败。
System.out.println("person1");
}
class in ///////////////内部类
{
void test1()
{
System.out.println("in");
}
}
}

在构造函数中如果要调用其他构造函数,就要把其他的构造函数放在最前面.
如果调用自身的构造函数可以这样写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

Flower(String s)
{
System.out.println("String create");

}
Flower(int i)
{
System.out.println("int create");
}
Flower(String s,int i)
{
this(i);////放在最前面
System.out.println("String and int create");

}

但继承的时候

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class SupClass
{
public SupClass(int id)
{
System.out.println(id+"SupClass is construct!");
}
}
public class Init extends SupClass
{
static int i;////////这样写在super(i)处就不会出错。
public Init()
{
super(i);
i=0;
}
}
/////变化一下:
public class Init extends SupClass
{
int i;
public Init()
{
super(i);//这里就会报错。这是因为先初始化static变量,后进行自身类的构造函数调用,后调用基类构造函数,再进行
i=0;  //自身类中成员变量的初始化。
}
}
//////////再写一个类
public class ObjOrPri {
SupClass a= new SupClass(i);//这里会报错,这就意味着成员对象是顺序进行的初始化。
int i;

ObjOrPri()
{
System.out.println(a);
}
}

如果改为这样

1
2
3
4
5
6
7
8
public class ObjOrPri {
int i;
SupClass a= new SupClass(i);/////这里就不会报错。
ObjOrPri()
{
System.out.println(a);
}
}

根基类的static先被初始化。然后到子类的构造函数,在到基类的构造函数。

每一个类都有自己的方法。超类的和子类的方法名必须相同。但是超类可以不实现那个方法。
最后在某一个类中用一个函数来用超类的引用当作参数。调用和子类同名的函数叫做多态。
这样做的好处是如果超类和子类都存放在同一个数组里,这样就可以节省代码。

抽象类中不需要每一个方法都是抽象的。但至少有一个。
static和abstract关键字好像不能同时使用。

清除类的时候先从派生类开始,然后才是超类。

如果在构造函数中调用多态,那么将会调用被覆盖的函数。

ClassCastException运行时类型检查异常。

不是后绑定就不是多态。