-
如果一个对象a组合了对象b,那么对象a就可以委托对象b调用其方法,即对象a以组 合的方式复用对象b的方法。
-
通过组合对象来复用方法有以下特点:
-
通过组合对象来复用方法也称“黑盒”复用,因为当前对象只能委托所包含的对象调用其方法,这样当前对象对所包含对象的方法的细节(算法的细节)是一无所知的。
-
当前对象随时可以更换所包含的对象,即对象与所包含的对象属于弱耦合关系。
-
对于同一个类的两个对象,如果二者具有同样的引用,就会用同样的实体,因此改变其中某个对象的实体就会导致另一个对象的实体发生同样的变化。
-
类体中包括成员变量的声明和方法的定义,而成员变量又可细分为实例变量和类变量。在声明成员变量时,用关键字static修饰的称作类变量,否则称作实例变量(类变量也称为static变量、静态变量)。
-
不能用static修饰局部变量
-
不同对象的实例变量互不相同,一个类通过使用ew运算符可以创建多个不同的对象,这些对象将被分配不同的(成员)变量,分配给不同对象的实例变量占有不同的内存空间,改变其中一个对象的实例变量不会影响其他对象的实例变量。程序如果没有创建对象,实 例变量不会被分配内存空间。
-
所有对象共享类变量,如果类中有类变量,当使用new运算符创建多个不同的对象时,分配给这些对象的这个类变量占有相同的一处内存,改变其中一个对象的这个类变量会影响其他对象的这个类变量, 也就是说对象共享类变量。
-
通过类名直接访问类变量。
-
当Java程序执行时,类的字节码文件被加载到内存,如果该类没有创建对象,类中的实例变量不会被分配内存。
-
类中的类变量,在该类被加载到内存时就分配了相应的内存空间。
-
如果该类创建对象,那么不同对象的实例变量互不相同,即分配不同的内存空间,而类变量不 再重新分配内存,所有的对象共享类变量,即所有的对象的类变量是相同的一处内存空间,类 变量的内存空间直到程序退出运行才释放所占有的内存。 类变量是与类相关联的变量。
-
类变量是和该类创建的所有对象相关联的变量, 改变其中一个对象的这个类变量就同时改变了其他对象的这个类变量。因此,类变量不仅可以通过某个对象访问,也可以直接通过类名访问。
-
实例变量仅是和相应的对象关联的变量。也就是说,不同对象的实例变量互不相同,即分配不同的内存空间,改变其中一个对象的实例变量不会影响其他对象的这个实例变量。对象的实例变量可以通过该对象访问,但不能使用类名访问。
-
类变量似乎破坏了封装性,其实不然,当对象调用实例方法时,该方法中出现的类变 量也是该对象的变量,只不过这个变量和所有的其他对象共享而已。
-
类中的方法也可分为实例方法和类方法。声明方法时,在方法类型前面不加关键字static 修饰的是实例方法,加static关键字修饰的是类方法(也称static方法或静态方法)。
-
当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址,只有当该类创建对象后,类中的实例方法才分配人口地址,从而实例方法可以被类创建的任何对象调用、执行。当创建第一个对象时,类中的实例方法就分配了人口地址,当再创建对象时,不再为实例方法分配人口地址。也就是说,方法的入口地址被所有的对象共享,当所有的对象都不存在时,方法的入口地址才被取消。
-
在实例方法中不仅可以操作实例变量,也可以操作类变量,实例方法可以调用类中的实例方法和类方法(不包括构造方法)。当对象调用实例方法时,该方法中出现的实例变量就是分配给该对象的实例变量,该方法中出现的类变量也是分配给该对象的变量,只不过这个变量和 所有的其他对象共享而已。
-
对于类中的类方法,在该类被加载到内存时就分配了相应的入口地址,从而类方法不仅可 以被类创建的任何对象调用、执行,也可以直接通过类名调用。类方法的入口地址直到程序退出才被取消。
-
实例方法不能通过类名调用,只能由对象来调用。
-
类方法可以由类名调用也可以由对象调用。
-
和实例方法不同的是,类方法不可以操作实例变量,这是因为在类创建对象之前实例成员 变量还没有分配内存。
-
类方法不可以调用类中的实例方法,只可以调用类中的类方法
-
对于static方法,不必创建对象就可以用类名直接调用(创建对象会导致类中的实例变量 被分配内存空间)。如果一个方法不需要操作类中的任何实例变量或调用类中的实例方法就 可以满足程序的需要,则可以将这样的方法设计为一个static方法。