当前位置:天才代写 > tutorial > JAVA 教程 > JAVA技能专题综述之结构要领篇

JAVA技能专题综述之结构要领篇

2017-11-11 08:00 星期六 所属: JAVA 教程 浏览:296

副标题#e#

类的担任机制使得子类可以利用父类的成果(即代码),而且子类也具有父类的范例。下面先容类在担任干系上的初始化的顺序问题。

示例1:

class SuperClass
{
SuperClass()
{
System.out.println("SuperClass constructor");
}
}
public class SubClass extends SuperClass
{
SubClass()
{
System.out.println("SubClass constructor");
}
public static void main(String[] args)
{
SubClass sub = new SubClass();
}
}
输出功效: SuperClass
constructor
SubClass constructor

在子类中只实例化了一个子类工具。从输出功效上看,措施并不是一开始就运行本身的结构要领,而是先运行其父类的默认结构要领。留意:措施自动挪用其父类的默认结构要领。

示例2:

class SuperClass
{
SuperClass(String str)
{
System.out.println("Super with a string.");
}
}
public class SubClass extends SuperClass
{
SubClass(String str)
{
System.out.println("Sub with a string.");
}
public static void main(String[] args)
{
SubClass sub = new SubClass("sub");
}
}

在JDK下编译此措施不能乐成。正如上例中说的:措施在初始化子类时先要寻找其父类的默认结构要领,功效没找到,那么编译自然不能通过。

办理这个问题有两个步伐:

1.在父类中增加一个默认结构要领。

2.在子类的结构要领中增加一条语句:super(str); 且必需在第一句。

这两种要领都能使此措施通过编译,但就本措施来说运行功效却不沟通。

第1种要领的运行功效是:

Sub with a string.

第2种要领的运行功效是:

Super with a string.
Sub with a string.

第2种办理要领实际上是指定编译器不要寻找父类的默认结构要领,而是去寻找带一个字符串为参数的结构要领。


#p#副标题#e#

下面先容工具的初始化顺序问题。

示例3:

class One
{
One(String str)
{
System.out.println(str);
}
}
class Two
{
One one_1 = new One("one-1");
One one_2 = new One("one-2");
One one_3 = new One("one-3");
Two(String str)
{
System.out.println(str);
}
}
public class Test
{
public static void main(String[] args)
{
System.out.println("Test main() start...");
Two two = new Two("two");
}
}
输出功效:
Test main() start...
one-1
one-2
one-3
two

在main()要领中实例化了一个Two类的工具。但措施在初始化Two类的工具时,并非先挪用Two类的结构要领,而是先初始化Two类的成员变量。这里Two类有3个成员变量,它们都是One类的工具,所以要先挪用3次One类的相应的结构要领。最后在初始化Two类的工具。

示例4:

class One
{
One(String str)
{
System.out.println(str);
}
}
class Two
{
One one_1 = new One("one-1");
One one_2 = new One("one-2");
static One one_3 = new One("one-3");
Two(String str)
{
System.out.println(str);
}
}
public class Test
{
public static void main(String[] args)
{
System.out.println("Test main() start...");
Two two_1 = new Two("two-1");
System.out.println("------------");
Two two_2 = new Two("two-2");
}
}
输出功效:
Test main() start...
one-3
one-1
one-2
two-1
------------
one-1
one-2
two-2

#p#副标题#e#

假如一个类中有静态工具,那么它会在非静态工具前初始化,但只初始化一次。非静态工具每次挪用时都要初始化。

示例5:

class One
{
One(String str)
{
System.out.println(str);
}
}
class Two
{
One one_1 = new One("one-1");
One one_2 = new One("one-2");
static One one_3 = new One("one-3");
Two(String str)
{
System.out.println(str);
}
3
}
public class Test
{
static Two two_3 = new Two("two-3");
public static void main(String[] args)
{
System.out.println("Test main() start...");
Two two_1 = new Two("two-1");
System.out.println("------------");
Two two_2 = new Two("two-2");
}
}
输出功效:
one-3
one-1
one-2
two-3
Test main() start...
one-1
one-2
two-1
------------
one-1
one-2
two-2

#p#分页标题#e#

措施中主类的静态变量会在main()要领执行前初始化。功效中只输出了一次one-3,这也说明:假如一个类中有静态工具,那么它会在非静态工具前初始化,但只初始化一次。非静态工具每次挪用时都要初始化。

示例6:

class One
{
One(String str)
{
System.out.println(str);
}
}
class Two
{
static int i = 0;
One one_1 = new One("one-1");
static One one_2 = new One("one-2");
static One one_3 = new One("one-3");
Two(String str)
{
System.out.println(str);
}
}
public class Test
{
public static void main(String[] args)
{
System.out.println("Test main() start...");
System.out.println("Two.i = " + Two.i);
}
}
4
输出功效:
Test main() start...
one-2
one-3
Two.i = 0

不只第1次建设工具时,类中所有的静态变量要初始化,第1次会见类中的静态变量(没有建设工具)时,该类中所有的静态变量也要凭据它们在类中分列的顺序初始化。

综上所述:

在建设工具时,工具地址类的所有数据成员会首先举办初始化,假如个中的成员变量有工具,那么它们也会凭据顺序执行初始化事情。在所有类成员初始化完成后,才挪用工具地址类的结构要领建设工具。结构要领浸染就是初始化。

静态工具(变量)在非静态工具前初始化。静态工具(变量)只初始化一次,再次挪用就不初始化了,但非静态工具在每次挪用时都要初始化。

措施中的主类的静态变量会在main()要领执行前举办初始化事情。

不只第1次建设工具时,类中所有的静态变量要初始化,第1次会见类中的静态变量(没有建设工具)时,该类中所有的静态变量也要凭据它们在类中分列的顺序初始化。

初始化的顺序包罗结构要领挪用的顺序如下:

1.主类的静态成员首先初始化。

2.主类的超类的结构要领凭据从最高到最低的顺序被挪用。

3.主类的非静态工具(变量)初始化。

4.挪用主类的结构要领。

在一个结构要领中只能挪用一次其它的结构要领,而且挪用结构要领的语句必需是第一条语句。

 

    关键字:

天才代写-代写联系方式