一、内容的概述(主要内容)
*类的私有成员和公共成员
*方法的重载
*构造方法
*类的静态方法
*对象的应用
二、类的私有成员和公有成员
私有成员:加private访问控制修饰符
公有成员:加public访问控制修饰符
如果没有一个机制来限制对类中成员的访问,则很有可能会造成错误的输入。为了防止这样的情况发生,Java语言提供了私有成员访问控制修饰符private。。也就是说,如果在类的成员声明前加上修饰符private,则就无法从该类的外部访问到该类内部的成员,而只能通过该类自身访问和修改,而不能被任何其他类,包括该类的子类来获取或引用,因此达到了对最高级的保护目的。
本人曾经在一个小例子上出现过上述的情况,就是在声明类成员属性一个数为int类型的整数并且规定的它的范围为(1-100)的时候,没有加上private访问控制修饰符,在测试main的时候,录入的数值超出的该值的访问,程序没有报错,但是不符合业务逻辑。因为它是在类的外部就可以直接调用而类又不能在声明变量的时候,给一些条件的限制。所以很容易造成错误的操作。所以后来在声明变量的时候加上private访问控制修饰符,并且提供成员变量的getter和setter使用public修饰的公有方法。在类的外部就可以通过类的对象来调用相应的方法来取值设置值,而不是直接的对值进行操作,那么就可以在方法这种对值进行处理。这个也可以说是类的封装性,安全性问题。
**缺省访问控制符:就是不写任何的访问控制符,它是表示该成员可以被同一个包中的类所访问和调用,如何一个子类和它的父类位于不同的包中,子类不能访问父类中的缺省访问控制成员,也就是说其他包中的任何类都不能访问缺省控制成员。同理对于类的这样的情况也是一样的。
三、方法的重载
方法的重载是实现“多态”的一种方法。在面向对象的程序设计语言中,有一些方法的含义相同,但带有不同的参数,这些方法使用相同的名字,这就叫方法的重载(overloading)。也就是说重载是指在同一个类内具有相同名称的方法,这多个同名方法如果参数个数不同,或者说参数个数相同,但是类型不同,则这些同名的方法就具有不同的功能。程序运行时就会根据相应符合的参数来选择相应的方法执行。
***就是同名就行,其他的参数的类型,个数,参数顺序不相同就是方法的重载。
***Java语言中不允许参数个数或参数类型完全相同,而只有返回值类型不同的重载。
public double setCylinder(double r,int h);
public void setCylinder(String str);
四、构造方法
因为如果成员变量都是在创建对象后在通过相应的方法来赋值,就会显得代码不够简洁,所以Java语言在类中提供了一种特殊的成员方法——构造方法。它是在创建对象时就完成初始化的所有工作,简洁了代码量。
构造方法的名称必须与类的名称相一致,构造方法没有返回值,但是也不能用void这无返回值类型的修饰符来修饰,是因为一个类的构造方法的返回值就是该类本身,如果加上void那就不是构造方法了,而是普通的方法,系统就不会自动调用了。构造方法定义后,创建对象时就会自动调用它,因此构造方法不需要在程序中直接调用,而是在对象产生时自动执行。这一点不同于其他的方法,一般的方法都是在需要用到时使用对象进行调用。
**说了一大堆,实际上就是,在创建一个对象时,在对象的括号里添加上成员属性,他就会自动调用相应的构造方法对对象进行赋值,就不需要通过setter或者.xxx属性这样进行赋值,但是你前提是必须设计好相应的构造方法。
**构造方法的特殊点:
(1)、构造方法的方法名与类名相同。
(2)、构造方法没有返回值,但不能使用void。
(3)、构造方法的主要作用是完成对类对象的初始化工作。
(4)、构造方法一般不能由编程人员显式地调用,而是new来调用。
(5)、在创建一个类的对象时同时,系统会自动调用该类的构造方法为新对象初始化。
**注意的问题
(1)、假如您创建了一个类对象不添加参数,他就会默认地调用默认的构造方法,它是没有参数,方法体也是没有任何代码的。
(2)、构造方法也是可以重载的,跟其他的方法的原理是一样的,根据参数的个数不同,或者类型不同来在多个构造方法中匹配合适的构造方法。
(3)、从一个构造方法调用另个一个构造方法:为了某些特定的运算,Java语言允许在类内从某一构造方法内调用另一个构造方法。这样会缩短程序代码,减少开发的时间。而这一过程必须使用this这一关键字来实现。例如
public Student(){
this("luhan",25,"男");
System.out.println("调用了默认构造函数")
}
public Student(String name,int age,String gender){
System.out.println("调用了有参构造函数");
this.name = name;
this.age = age;
this.gender = gender;
}
然后在测试的main函数中创建对象就直接new就行了,不需要在括号里写一大堆的参数了;Student student = new Student();
**还有两个注意点:
1、在某一构造方法里调用另一个构造方法时,必须使用this关键来调用。否则编译时将出现错误。
2、this关键字必须写在构造方法的第一行。
(4)、公共构造方法与私有构造方法:如果将构造方法设计成私有的方法,并在公有的构造方法中调用,是可以通过this关键字来调用的,那么就可以在类的外部来调用了,因为私有的犯法不可以在类的外部进行调用的,但在外部是可以调用的,所以在公有的方法中this私有的方法,而在类的外部再调用公有的方法就能实现实现私有构造方法的调用了。
五、静态成员与实例成员
static称为静态修饰符,它可以修饰类中的成员。被static修饰的成员称为静态成员,也称为类成员,而不用static修饰的成员称为实例成员。
1、实例成员(不用static修饰的):实例成员是属于个别对象所有,彼此不能共享。创建的对象均有各自的储存空间来保存自己的值,而不与其他对想共享。因此若修改某个对象的值,是不影响其他的对象的值。,因为这些成员变量各自独立的,且存在不同的内存之中,具有特性的成员变量Java中称之为实例变量。
也就是说,必须先创建独享,在利用对象来调用方法。而无法不通过对象而直接去调用方法。具有此特性的方法,Java称之为实例方法。由此可见,实例成员是属个别对象所有,彼此之间不能共享。
2、静态变量:用static修饰的成员变量称之为“静态变量”,静态变量也称之为类变量。静态变量是属于类的变量。而不是属于任何一个类的具体对象。也就是说对于该类的任何一对象而言,静态变量是一个公共的储存单位,不保存在某个对象实例的内存空间中,而是保存在类的内存空间的公共储存单元中。或者说,对于类的任何一个具体对象而言,静态变量是一个公共的储存单元,任何一个对象访问它取到的都是一个相同的数值。同样任何一个类的对象访问去修改它是都是在同一个内存单元做操作。静态变量在定义是用static修饰。静态变量在某种程度上与其他语言的全局变量相似,如果该变量不是私有的,就可以在类的外部进行访问,而且不需要创建类的实例对象,只需要类的名称就可以引用。换句话说,静态变量不需要实例化就可以使用。当然也可以通过实例化对象来访问静态变量。使用的格式:
类名.静态变量名;
对象名.静态变量;
若有静态变量,则静态变量必须独立在方法之外,就像其他高级语言声明全局变量时一样,必须在函数之外声明。
例子:像计算圆柱的体积是,有不同的低与高,但是PI=3.14是相同的就是可以定义成静态变量,进行共享,还有若要计算一共创建了多少个对象的话也可以把一个统计数num设置静态的变量来共享,在调用的构造方法中设计num++;每new一个对象就num加1,它是共享的,每次都是改变的,若没有加上static就是实例变量,对于每个对象是私有的,每次创建的都是默认值。
3、静态方法
与静态变量一样,有static修饰符修饰的方法是类的静态方法,又称为类方法。静态方法实质是属于整个类的方法,而不加static的方法是属于某个对象的具体方法,将一个方法声明为static有以下几重含义:
(1)、非static的方法是属于某个对象的方法,在这个对象创建时,对象的方法在内存中拥有属于自己专用的代码段。 而static的方法是属于整个类的,它在内存中的代码段将被所有的对象所共有,而不被任何一个对象所专用。
(2)、由于static方法是属于整个类的。所以他不能操纵和处理属于某个对象的成员。而只能处理属于整个类的成员,即static方法成员变量或调用static成员方法。或者说静态方法中不能访问实例变量与实例方法。 (3)、在静态方法中不能使用this和super关键字。因为this是代表调用该方法的对象,但是现在“静态方法”,既然不需要对象来调用,this也自然不适应存在于“静态方法”内部。 (4)、调用静态方法时,可以使用名来调用,也可以用某一个具体的对象来调用。其格式如下:类名.静态方法名(); 对象名.静态方法名(); 4、静态初始化器 静态初始化器是由关键字static修饰的一堆花括号“{}”括起来的语句组。它的作用与类的构造方法有些相似,都是用来初始化工作的,但静态初始化器与类构造方法有几点根本的区别: (1)、构造方法是对每个创建的对象初始化,而静态初始化器是对类自身进行初始化。 (2)、构造方法是在new运算符创建对象是由系统自动调用执行的,而静态初始化器一般不能有程序来调用,它是在所属的类被加载如内存由系统调用执行的。 (3)、用new运算符创建多少个新对象,构造方法就调用多少次,但静态初始化器则在类被加载入内存时只执行一次,与创建多少个对象无关。 (4)、不同于构造方法,静态初始化器不是方法,因而没有方法名,返回值和参数。 static { num++; System.out.println("静态初始化器被调用了,num的初始值为"+num); }***类是在第一次被调用的时候才被装载,而不是在程序启动时就装载程序中的所有可能要用到的类。
***如果有多个静态初始化器,则它们在类的初始化是会依次执行。
***总之,静态初始化器的作用是对整个类完成初始化操作,包括给static成员变量赋值初值,它在系统向内存加载时自动完成。
5、对象的应用
(1)、实际上对象是一种引用型的变量,而引用型变量实际上保存的是对象在内存中的地址(也成称为对象的句柄),所以就想对象的功能而言,对象是“指向对象的变量”;但就其类型而言,它是属于“类类型的变量”。因此在某些场合,可以向使用基本类型变量一样的使用对象。
(2)、对象的赋值与比较:在使用对象时,一般是先用new运算创建对象,然后再对其进行操作处理,但有时候没有使用new运算符创建新对象,仍然可以对其进行赋值。
例子: Cylinder volu1,volu2;//声明两个引用变量
volu1 = new Cylinder(1.0,2);//创建了一个类对象,并将引用变量volu1指向它。
volu2 = volu1;//意思是两个不同名的引用变量同时同时指向一个对象;
所以volu2后来调用方法改变对象的数据内容,对于volu1也是生效的。
例子:Cylinder volu1 = new Cylinder(1.0,2);
Cylinder volu2 = new Cylinder(1.0,2);
volu1.compare(volu2);//这里的比较的结果是不相等的,因为他们是两个相互独立的对象,分别占有不同的空间,所以内存中的首地址也是不一样的,即volu1和volu2两个引用变量的值是不一样。
volu3 = volu2;
volu3.compare(volu3);//这里的比较值是相等的,因为它们指向的是同一个变量,首地址是相同的,值便是相同的。
6、本章小结
(1)、用修饰符private来修饰的类成员称为私有成员。私有成员无法从外部访问到该类内部成员,而只能被自身访问和修改,而不能被任何其他类,包括该类的子类来获取或引用,如果在类的成员声明的前面加上修饰符public,则该成员为公共成员,表示该成员可以被所有其他的类方法。
(2)、所谓的“重载”是指在同一个类定义相同名称的多个方法,这些同名的方法或者参数个数不同、或者参数的个数相同,但类型不同,则这些同名的方法便是可具有不同的功能。
(3)、构造方法可视为一种特殊的方法,它的主要功能是帮助创建的对象赋初值。
(4)、构造方法的名称必须与其所属的类名称相同,且不能有返回值。
(5)、从某一构造方法内调用用另一个构造方法,必须通过this()关键字来调用。
(6)、构造方法有public 和 private 之分,public构造方法可以在程序的任何地方被调用,所以新创建的对象均可自动调用它,而private构造方法则无法在该构造方法所在的类以外的地方被调用。
(7)、如果一个类没有定义构造方法,Java编译系统会自动为其生成默认的构造方法,默认的构造方法是没有任何参数,方法体内也没有任何语句的构造方法。
(8)、实例变量与实例方法、静态变量和静态方法是不同的成员变量与成员方法。