黑马程序员--第一阶段3.面向对象--第7天
函数的参数传递
—基本数据类型的参数传递:
____________________________________________________________________________________________________
—引用数据类型的参数传递:
____________________________________________________________________________________________________
—引用参数传递的一个问题分析
static静态变量
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。
-
在静态方法里只能直接调用同类中其它的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。
-
静态方法不能以任何方式引用this和super关键字(super关键字在下一章讲解)。与上面的道理一样,因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时,this所引用的对象根本就没有产生。
-
main() 方法是静态的,因此JVM在执行main方法时不创建main方法所在的类的实例对象,因而在main()方法中,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员,这种情况,我们在以后的例子中会多次碰到。
-
静态成员变量在某种程度上,与其它语言的全局变量相类似
-
静态成员变量在内部类中可以直接使用成员名访问,在外部类中使用“类名.成员名”访问
在一个类中,只能出现成员变量或成员方法的语句,不能出现其他语句,其他语句需写到成员方法中,如:
public class Person
{
static int age;
}
class aa
{
Person.age=51;//这是错误的
}
private型的静态成员变量只能在内部类被访问,外部类不能访问
System.out.println()//这里的System是一个类,println()就是一个静态方法
静态代码块
-
一个类中可以使用不包含在任何方法体中的静态代码块(static block ),当类被载入时,静态代码块被执行,且只被执行一次,静态块经常用来进行类属性的初始化。
-
类中的静态代码块被自动执行,尽管我们产生了类的多个实例对象,但其中的静态代码块只被执行了一次。当一个程序中用到了其他的类,类是在第一次被使用的时候才被装载,而不是在程序启动时就装载程序中所有可能要用到的类。
-
静态代码块:
static
{
代码;
}
-
非静态方法中不能直接访问静态成员与静态成员方法
-
当静态代码所在类被加载时是先执行静态代码块,再执行构造函数,再执行成员方法,如下:
class a
{
static
{
System.out.println(“静态代码块”);
}
void fun( )
{
System.out.println(“成员方法”);
}
public a( )
{
System.out.println(“构造方法”);
}
}
class b
{
public static void main(String args[ ])
{
System.out.println(“开始”);
new a( ).fun(); //当使用到类a时才加载类a
System.out.println(“结束”);
}
单态设计模式
-
设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就想是经典的棋谱,不同的棋局,我们用不同的棋谱,免得我们自己再去思考和摸索。失败为成功之母,但是要以大量的时间和精力为代价,如果有成功经验可借鉴,没有人再愿意去甘冒失败的风险,我们没有理由不去了解和掌握设计模式,这也是Java开发者提高自身素质的一个很好选择。使用设计模式也许会制约你去创新,不过真正有意义的创新只能出自少数天才,即使你就是那个天才,虽不必因循守旧,但也不可能完全不去了解和借鉴前人的成功经验。
-
所谓类的单态设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。
-
设计一个只能创建一个实例对象的类:
1、 把构造方法设置为private类型
2、 在内部类创建一个静态实例对象
代码如下:
class Chinese
{
static Chinese objRef=new Chinese( );
private Chinese( )
{
System.out.println(“构造函数”);
}
static
{
System.out.println(“静态代码块”);
}
}
class TestChinese
{
public static void main(String args[ ])
{
Chinese obj1=Chinese( ).objRef;
Chinese obj2=Chinese( ).objRef;
Chinese obj3=Chinese( ).objRef;
}
}
输出结果为: 构造函数
静态代码
虽然main方法中有3个赋值语句,但是静态代码与构造函数只执行了一次,说明静态代码块只会被执行一次
当一个静态方法被直接使用时,首先会执行静态成员变量,再执行静态代码块,然后执行静态成员方法
当新建一个对象并调用成员方法(不论是否静态),会先执行静态成员变量,再执行静态代码块,再执行构造方法,再执行成员方法。
理解main方法的语法
由于java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public,又因为java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static的,该方法接收一个String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数。给main方法传递参数是在运行类时输入的,如 java test a1 a2 a3//这里给类test传递了3个参数,各参数间用空格隔开
内部类(也叫嵌套类)—在类中直接定义的内部类
-
嵌套类可以直接访问嵌套它的类的成员,包括private成员,但是嵌套类的成员却不能被嵌套它的类直接访问。
-
在内部类对象保存了一个对外部类对象的引用,当内部类的成员方法中访问某一变量时,如果在该方法和内部类中都没有定义过这个变量,内部类中对this的引用会被传递给那个外部类对象的引用。
-
如果用static修饰一个内部类,这个类就相当于是一个外部定义的类,所以static的内部类中可声明static成员,但是,非static的内部类中的成员是不能声明为static的。static的内部类不能再使用外层封装类的非static的成员变量,这个道理不难想象!所以static嵌套类很少使用。
如果函数的局部变量(函数的形参也是局部变量),内部类的成员变量,外部类的成员变量重名,我们应该按下面的程序代码所使用的方式来明确指定我们真正要访问的变量。
public class Outer
{
private int size;
public class Inner
{
private int size;
public void doStuff( int size)
{
size++; // 引用的是doStuff函数的形参
this.size++; //引用的是Inner类中的成员变量
Outer.this.size++; //引用的Outer类中的成员变量
}
}
}
内部类如何被外部引用
class Outer
{
private int size=10;
public class Inner
{
public void doStuff()
{
System.out.println(++size);
}
}
}
public class TestInner
{
public static void main( String[] args)
{
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.doStuff();
}
}
内部类 —在方法中定义的内部类
-
嵌套类并非只能在类里定义,也可以在几个程序块的范围之内定义内部类。例如,在方法中,或甚至在for循环体内部,都可以定义嵌套类。
-
在方法中定义的内部类只能访问方法中的final类型的局部变量,用final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期。
使用Java的文档注释
import java.io.*;
/**
* Title: engineer类<br>
* Description: 通过engineer类来说明java中的文档注释<br>
* Copyright: (c) 2003 www.it315.com<br>
* Company: 锐智科技咨询中心<br>
* @author 张孝祥
* @version 1.00
*/
public class engineer
{
public String Engineer_name;
/**
* 这是engineer对象的构造函数
* @param name engineer的名字
*/
public engineer(String name)
{
}
/**
* 这是repairing方法的说明
* @param sum 需要修理的机器总数
* @param alltime 需要修理的总时间
* @return Repairing的数量
*/
public int repairing(int sum,int alltime)
{
}
}
-
文档注释以“/**”开始,以“*/”标志结束,相应的信息和批注所对应的位置很重要!类的说明应在类定义之前,方法的说明应在方法的定义之前。
-
批注参数来标记一些特殊的属性及其相应的说明。在注释里要换行用<br>标签,而批注会自动换行,所以不用加<br>
-
@author<作者姓名>
-
@version<版本信息>
-
@param<参数名称><参数说明>
-
@return<返回值说明>