java核心技术笔记——对象与类

定义

类:类是构造对象的模板或者蓝图;又类构造对象的过程称为创建类的实例。

封装:将数据和行为组合在一个包中,并对使用者隐藏实现方式。封装的优点:1、确保实例域只能被方法修改,其余类不能随意修改。2、可以改变内部实现,除了该类的方法以外不影响其他代码。3、可以执行检查,比如在更改器方法里面加上校验程序。

实例域:对象中的数据,操纵数据的过程称为方法,一个特定对象的特定实例域值就这个对象的当前状态。实现封装的关键就是不能让类的方法访问其他类的实例域。

更改器方法:更改实例域的方法(setXXX);访问器方法:不更改实例域只做访问的方法(getXXX)。

依赖:一个类的方法操纵另一个类的对象。尽可能将依赖减至最小。

聚合:一个类包含另一个类的对象。

继承:一个类扩展另一个类,不但包含另一个类的方法,还有一些额外的功能。

对象:使用前需要初始化(new)。一个对象变量并没有实际包含一个对象,只是引用这个对象。

隐式参数、显式参数:a为隐式参数、5为显式参数

public addAge(int add){
age=age+add
}
student a=new Student(4);
a.addAge(5);

不可变类:类中的每个方法都不会改变其对象,比如String 类。

ps:一个类的方法可以访问这个类的所有对象的私有数据。一般将数据设置为私有的。

final:常用于基本类型域活不可变类域,final修饰意味着这个变量中的对象引用在对象构造之后不能改变,并不意味着这个对象是一个常量。

重载:相同的方法,不同的参数定义多次。方法名和参数类型(而不是返回类型)决定一个方法。

静态域、静态方法

static:如果将域定义为static,每个类中只有一个这样的域,而每个对象对于所有实例域都有自己的一份拷贝。例如:

class Student{

private static int id=111;

private String name;

现在每个学生对象都有自己的name域,但是共享一个id域,即使没有对象这个id域也存在,它属于类,不属于任何的独立对象。

静态常量:静态变量使用比较少,静态常量使用比较多。比如Math类里的public static final double PI=3.14....。可以通过Math.PI访问,如果去掉static,PI变成Math类的一个实例域,需要通过Math类的对象访问。并且每个对象都有自己的PI(也是3.14...)。还有一个常见的静态常量system.out。

静态方法:用Math.pow()调用(可以对象调用方法,只不过方法和对象没有关系,所以一般用类调用),属于这个类,不属于任何对象,也就是没有隐式参数,没有this参数的方法(在一个非静态方法中,this参数表示这个方法的隐式参数)。因为静态方法不能操作对象,所以静态方法中不能访问实例域,但是可以访问自身类的静态域。

使用静态方法的情况:1、方法不需要访问对象状态,所有参数都是通过显示参数提供,2、方法只需要访问类的静态域。

main方法也是一种静态方法,会在程序执行时自己创建程序执行所需要的对象,一般可以用main方法对类进行单元测试,如果a类包含在b类的main程序中,执行b的main,a中的main不会被执行。

方法参数

按值调用:接收调用者提供的值,得到的是参数值的一个拷贝。方法不能修改传递给他的变量的值。java采用按值调用。

按引用调用:接收的是调用者提供的变量地址。可以修改传递引用所对应的变量值。

void raiseSalary(double salary){
salary=salary+1.0;
}
double percent=10;
harry.raiseSalary(percnet);
//percent 的值不会改变,因为调用方法是salary只是对percent的值的一个拷贝,方法结束salary消失,percent不变。
public static void changeSalary(Student a){
a.raiseSalary(200);
}
Student tom=new Student(...);
Student.changeSalary(tom);
//tom的值会改变,a是对tom的值得一个拷贝,tom的值是一个引用,所以changeSalary方法应用于这个对象的引用,tom和a所引用的对象的薪资就会改变,方法结束tom消失,a引用的对象值改变。

但是注意这里虽然是对对象的引用改变对象的值,但是并不代表java采用的是按引用调用,java采用的还是按值调用,只不过值得拷贝是引用。

总结:1、一个方法不能改变基本类型参数的值比如int boolean,2、一个方法可以改变对象参数的状态即实例域的值,3、一个方法不能让一个对象参数引用新的对象。

构造器

类的无参数构造器会给域设置默认值,(0,false,null)但是这样不好。

可以通过显示域初始化解决这个问题,比如:private String name="";

构造器调用另一个构造器用this(...);

调用构造器的步骤:1、所有数据域初始化默认值;2、按照在类声明中出现的顺序,一次执行初始化语句和初始化块。3、如果构造器调用了第二个构造器,执行第二个构造器主体。4、执行这个构造器主体。

静态变量可以采用静态初始化块进行初始化,所有静态初始化语句以及静态初始化块都按照类的初始化顺序执行。静态初始化块也是类第一次加载就会执行。

包:

一个类可以使用所属包的所有类和其他包的公有类,用import导入以后就可以直接使用。

如果源文件上方没有package语句,则该类被放入默认包(default package),


猜你喜欢

转载自blog.csdn.net/cm1362946343/article/details/80422850