当我们拿到一个有超类、有子类、包括有主程序的入口类的程序去分析它运行步骤时:
1.程序应当从入口类类(含有public的类,即就是1个.java文件中只能包含一个public类,它就是入口类)开始;
2.你一定要明确的是在入口类中含有的这个静态主函数public static void main(String args){}仅仅是一个普通的静态函数(类函数);
3.在入口类中比静态主函数public static void main(String args){}的运行优先级高的有:
3.1 入口类的静态变量(第一)static
3.2 入口类的静态代码块(第二)static {}
4.在入口类中可以定义的内容如下:
4.1 入口类实例变量 修饰符 数据类型 变量名;
4.2 入口类静态变量 修饰符 static 数据类型 变量名;
4.3 入口类静态方法 static 返回值 方法名() {}
4.4 入口类静态代码块 static {}
4.5 入口类初始化代码块 {}
4.6 入口类构造函数 修饰符 类名(){}
4.7 入口类实例方法 修饰符 返回值 方法名(){}
4.8 public static void main(String args)
{ 1. 入口类的对象创建 入口类类名 引用名 = new 入口类类名;
2.并列的超类
3.并列的超类引用子类的对象创建 并列超类类名 引用名 = new 并列子类类名;
并列超类类名 引用名
解释: 可以被当作超类的引用变量(类的变量可以分为:基本数据类型变量和引用类型的变量)
new 并列子类类名
解释: 创建1个子类对象
并列超类类名 引用名 = new 并列子类类名;
解释: 该语句的执行步骤是:
1.开辟子类对象的数据空间;
2.将超类的引用变量分配一个保存引用的空间;
3.将开辟子类对象的数据空间的首地址赋给引用变量;
注意:引用类型变量在声明后必须通过实例化开辟数据空间,才能对变量所指向的对象进行访问,即必须初始化这个对象之后才能将引用指向它
该语句的过程类似于基本数据类型的转换:这些类型由"小"到"大"分别为 (byte,short,char)--int--long--float—double(这里我们所说 的"大"与"小",并不是指占用字节的多少,而是指表示值的范围的大小)。
将"小"数据转换为"大"数据时 :
byte b;int i=b; long l=b; float f=b; double d=b;
将"大"数据转换为"小"数据时:
你可以使用强制类型转换。即你必须采用下面这种语句格式: int n=(int)3.14159/2;可以想象,这种转换 肯定可能会导致溢出或精度的 下降。
.......;
.......;
}
public static void main(String args)
{
使用new关键字实例化对象时。
调用某个类的静态方法时。
读取或设置类的静态字段时(被final修饰、已在编译期把结果放入常量池的除外)。
使用java.lang.reflect包的方法对类进行反射调用。
初始化某个类的子类时。
虚拟机启动时被标明为启动类(包含main方法的类)。
}