组合

只需在新的类中产生现有类的对象.

toString()

每一个非基本类型的对象都有一个toString()方法,当编译器需要一个String对象而却只有一个对象时,该方法便会被调用.

初始化的方式

1.在定义对象的地方.这意味着它们总是能够在构造器被调用之前被初始化.

2.在类的构造器中.

3.就在正要使用这些对象之前,这种方式称为惰性初始化.在生成对象不值得及不必每次都生成对象的情况下,这种方式可以减少额外的负担.

4.使用实例初始化.

  1. class Soap{
  2. private String s;
  3. Soap(){
  4. System.out.println("Soap()");
  5. s="Constructed";
  6. }
  7. public String toString(){
  8. return s;
  9. }
  10. }
  11. public class Bath {
  12. private String s1="Happy",s2="Happy",s3,s4; //定义对象处
  13. private Soap castille;
  14. private int i;
  15. private float toy;
  16. public Bath(){
  17. System.out.println("Inside Bath()");
  18. s3="Joy"; //构造器中 构造器是初始化的最后一道屏障
  19. toy=3.14f;
  20. castille=new Soap();
  21. }
  22. {i=47;} //实例初始化,伴随着new 对象在堆中开辟内存 进行.
  23. @Override
  24. public String toString() {
  25. if(s4==null){ //惰性初始化
  26. s4="Joy";
  27. }
  28. return "Bath{" +
  29. "s1='" + s1 + '\'' +
  30. ", s2='" + s2 + '\'' +
  31. ", s3='" + s3 + '\'' +
  32. ", s4='" + s4 + '\'' +
  33. ", castille=" + castille +
  34. ", i=" + i +
  35. ", toy=" + toy +
  36. '}';
  37. }
  38. public static void main(String[] args) {
  39. Bath b = new Bath();
  40. System.out.println(b);
  41. }
  42. }

继承

构造器的访问权限会导致子类所在包的位置影响能否继承.

按照现有类的类型来创建类;

当创建一个类时,总是在继承(除非已明确指出要从其他类中继承,否则就是在隐式地从java的标准根类Object进行继承)

为了继承,一般的规则是将所有的数据成员都指定为private,将所有的方法指定为public.

java使用 extends 和 implements 这两个关键字来实现继承.

  1. class Animal {
  2. String name;
  3. public Animal(String name) {
  4. this.name = name;
  5. }
  6. Animal() {
  7. System.out.println("Animal no name");
  8. }
  9. public void eat() {
  10. System.out.println("animal eat");
  11. }
  12. }
  1. public class Dog extends Animal {
  2. Dog(){
  3. //super(); 这行代码即便不写,也会默认执行
  4. // 只要调用了子类的构造器,在第一行就会执行supper(),调用父类的构造器
  5. //如果父类构造器中都有参数,那么必须在第一行写super(),详情看下面图片
  6. System.out.println("Dog no name");
  7. }
  8. public Dog(String name){
  9. this.name=name;
  10. super.eat();
  11. this.eat();
  12. }
  13. @Override
  14. public void eat(){
  15. System.out.println("dog eat");
  16. }
  17. public static void main(String[] args) {
  18. Dog dog1 = new Dog("jack");
  19. System.out.println(dog1.name);
  20. System.out.println();
  21. Dog dog2 = new Dog();
  22. System.out.println(dog2.name);
  23. }
  24. }
  25. /*out
  26. Animal no name
  27. animal eat
  28. dog eat
  29. jack
  30. Animal no name
  31. Dog no name
  32. null
  33. */

Animal(父类)中的构造器都有参数,所以在Dog(子类)构造器第一行需要写supper();否则会报错
image.pngimage.png

代理

代理者须保持和被代理者相同的接口,该接口的理解为方法

不直接使用,加一层中间关系 由中间类完成对方法的使用.

需要将相同的接口给暴露出去 让原本调用者调用代理类的接口

可以手动选择要暴露出去的接口(public方法的子集)

  1. class Tea{
  2. public void sell(){
  3. System.out.println("sell tea");
  4. }
  5. }
  6. class TeaSeller{
  7. private Tea tea = new Tea();
  8. public void sell(){
  9. System.out.println("其他操作1");
  10. tea.sell();
  11. System.out.println("其他操作2");
  12. }
  13. }
  14. public class Proxy {
  15. }