类和对象的简单培训
类与对象:(class & object)类是对某一类事物的描述,是抽象的、概念上的定义;(抽象)对象是实际存在的该类事物的每个个体,因而也称实例(instance)。(具体)一 类:1.格式:类的修饰符 class 类名extends 父类名 变量声明;构造方法定义;其他方法定义;public class Personint age;void shout()System.out.println(“oh,my god! I am “ + age);1.age 是类的属性 ,也叫类成员变量 。2.shout 是方法也叫类的成员函数。3.shout 方法可以直接访问同一个类中的 age 变量 ,如果一个方法中有与成员变量同名的局部变量,该方法中对这个变量名的访问是局部变量,而不再是成员变量。 2.类的修饰符:(1).类访问权限修饰符:public (参考:test2.Hello.java,和 test3. C01.javapublic 公共的,对所有包可见!default(什么都没有,不写访问控制) ,对自身包可见!(2). abstract:(抽象的)该类中没有方法体的抽象方法,这些抽象方法必须在子类中实现。抽象类没有具体的实例的。(参考 TestWeapon.java)(3).final 最终类,不能被继承,不能有子类的。(参考 Testfinal.java )2.成员修饰符:(成员变量,方法,内部类)(参考:Test03.java , TestAccess.java )成员访问控制:二对象:1.对象也称实例,一个类可以对应多个对象对象成员类的非静态成员,对象拥有类中定义的所有非静态成员实例变量对象的状态(数据)对象拥有类中定义的实例变量的数据在内存中为对象分配空间,保存对象的状态不同对象的状态(数据)可能不同对象可以用来表示数据对象的引用:类似于C语言中的指针(地址),指向内存中存储的对象类与对象的关系:类是对对象的抽象,是创建对象的蓝图或模版,对象是某种类的特定个体或实例static 静态变量 :(参考例子:Test08.java )当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过 new 关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。static 静态方法:(参考例子:Test06.java)1.在静态方法里只能直接调用同类中其它的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。2. 静态方法不能以任何方式引用 this 和 super 关键字。与上面的道理一样,因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时,this 所引用的对象根本就没有产生。3.main() 方法是静态的,因此 JVM 在执行 main 方法时不创建main 方法所在的类的实例对象,因而在 main()方法中,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员,这种情况,我们在以后的例子中会多次碰到。4.如果一个方法总是以相同的方式运行,它的运行与类的任何实例没有关系,其行为与对象的状态(实例变量的值)无关,这个时候就可以用静态方法,静态方法的运行不依赖于对象,可以不创建对象来运行静态方法。三.对象的生成:1创建对象的过程(1).为新对象分配内存空间,并隐式初始化实例变量(2).显示初始化实例变量(3).执行构造函数2.什么是构造函数?构造函数:1定义在对象创建完成了所有的初始工作特殊的成员函数,叫做构造函数2特点(1)构造方法的方法名必须与类名相同。(2)构造方法没有返回类型,也不能定义为 void,在方法名前面不声明方法类型,否则会被认为成与构造函数同名的一个类方法(3)构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。 (4)构造方法不能由编程人员调用,而要系统调用。 (5)一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码。 (6)构造方法可以重载,以参数的个数,类型,或排列顺序区分。(7)构造函数中使用 super,this 调用父类和当前类的其他构造函数时,必须放在第一行,否则编译通不过 。子类中的构造函数,必须指明调用父类的哪一个构造函数,若不指明,此时默认父类中的无参构造函数,若无参构造函数未被调用,则编译前会报:需要确定父类隐藏构造函数的错误构造函数的说明:1.构造函数的名称必须与类名一致2.修饰符只有访问控制修饰符3. 构造函数不能定义返回值4.类可以定义多个构造函数,至少有一个构造函数5.如果类中未编写任何构造函数:默认构造函数6.没有构造函数:可以用new Xxx()创建对象7.添加任何构造函数都会失去默认构造函数Person p1 = new Person();执行完后的内存状态3.对象的产生:当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外的都是变量类型都是引用类型,如上面的 Person 及前面讲过的数组。方法内的变量必须在编写类的时候进行初始化,否则报编译阶段就报错!4.对象的使用:创建新的对象之后,我们就可以使用“对象名.对象成员”的格式,来访问对象的成员(包括属性和方法) public class TestPersonpublic static void main(String args)Person p1 = new Person();Person p2 =new Person();p1.age = -30;p1.shout();p2.shout();上面程序运行的内存布局如下图 5.对象的生命周期 :(如下图)参考例子: TestPerson01.java, TestPerson02.java, TestPerson03.java1.2.3.6.对象的比较“=”运算符与 equals()方法的区别(参考例子:Test1.java )1.“=”运算符,引用类型比较引用,基本类型比较值2.equals()方法只能比较引用类型,"="运算符可以比较引用类型和基本类型3.当用equals()方法进行比较时,对类File,String,Date及封装类来说,是比较类型及内容是否相等。4.用"="运算符进行比较时,符号两边的数据类型必须一致(可相互转换的脊背类型除外),否则编译错误,这个运算符可以判定两个变量是否指向同一个对象。7.this :(1) 对象创建后 , java 虚拟机( JVM)给对象分配一个引用自身的指针,这个指针的名字就是 this(2) this 只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this。(3) this 只和特定的对象关联,而不和类关联,同一个类的不同对象有不同的 this(4) this 主要应用在一下两种情况:a 通过 this 调用类另一个构造方法:this.(param1,param2) b 方法中引用成员变量,尤其是方法中成员变量被覆盖的情况。用法:this.成员变量名this 引用句柄的应用1.一个类中的成员方法可以直接调用同类中的其他成员,其实我们在一个方法内部使用“this. 其他成员”的引用方式和直接使用“其他成员” 的效果是一样的,那 this 还有多大的作用呢?在有些情况下,我们还是非得用 this 关键字不可的 :2.让类的成员变量名和对其进行赋值的成员方法的形参变量同名是必要的,这样的代码谁看了都能明白这两个变量是彼此相关的,老手看到函数的定义,就能揣摩出函数中的代码,大大节省了别人和自己日后阅读程序的时间。 3.假设我们有一个容器类和一个部件类,在容器类的某个方法中要创建部件类的实例对象,而部件类的构造方法要接收一个代表其所在容器的参数。4.构造方法是在产生对象时被 java 系统自动调用的,我们不能在程序中象调用其他方法一样去调用构造方法。但我们可以在一个构造方法里调用其他重载的构造方法,不是用构造方法名,而是用 this(参数列表)的形式,根据其中的参数列表,选择相应的构造方法。