程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)

Java基础 -- 复用类(组合和继承)

复用类有两种实现方式。

  • 在新的类中产生现有类的对象,由于新的类是由现有类的对象所组成,所以这种方法称之为组合。
  • 采用继承实现。

一  组合语法

下面创建两个类WaterSource和SprinklerSystem。其中SprinklerSystem中包含WaterSource的对象引用。

复制代码
class WaterSource {
    //如果定义时没有初始化,则基本类型会被自动初始化为0,对象引用初始化为Null
    private String s;
    WaterSource(){
        System.out.println("WaterSource()");
        s = "Constructed";
    }    
}

public class SprinklerSystem {
    private String value1,value2,value3,value4;
    //定义时初始化
    private WaterSource source = new WaterSource();
    private int i;
    private float f;
    public String toString() {
        return 
                "value1 = " + value1 + " " + 
                "value2 = " + value2 + " " +
                "value3 = " + value3 + " " +
                "value4 = " + value4 + "\n" +
                "i = " + i + "  " + "f = " + f + " " + 
                "source = " + source;
    }
    
    public static void main(String[] args) {
        SprinklerSystem sprinklers = new SprinklerSystem();
        System.out.println(sprinklers);
    }
}
复制代码

运行结果如下:

1
2
3
WaterSource()
value1 = null value2 = null value3 = null value4 = null
i = 0  f = 0.0 source = WaterSource@15db9742

 注意:如果把一个对象以String类型输出,则默认调用的是该对象的toString()方法。

类中成员变量如果是基本基本类型则默认被初始化为零,如果是对象引用则会被初始化为null。

我们也可以自己去初始化他们:

  • 在定义成员变量的时候初始化,比如private String s1 = "happy";这意味着他们能够在构造函数被调用之前初始化。
  • 在类的构造函数中初始化;
  • 在使用这些成员变量之前初始化,这种方式称之为惰性初始化;
  • 使用实例初始化{s1 = "happy";}。

二 继承语法

Java创建一个类时,默认都是继承于Object,除非自己指定从哪个类继承。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class Cleanser{
    private String s = "Cleanser";
    public void append(String a) { s += a; }
    public void dilute(){append("  dilute()");}
    public void apply() {append("  apply()");}
    public void scrub() {append("  scrub()");}
    public String toString() {return s;}
     
    public static void main(String[] args) {
        Cleanser x = new Cleanser();
        x.dilute();
        x.apply();
        x.scrub();     
         
        System.out.println(x);
    }
     
}
 
public class Detergent extends Cleanser {
    public void scrub() {
        append(" Detergent.scrub()");
        super.scrub();
    }
     
    public void foam() {append(" foam()");}
     
    public static void main(String[] args) {
        Detergent x = new Detergent();
        x.dilute();
        x.apply();
        x.scrub();
        x.foam();
        System.out.println(x);
        System.out.println("Testing base class:");
         
        Cleanser.main(args);
    }
 
}

 运行结果如下:

1
2
3
Cleanser  dilute()  apply() Detergent.scrub()  scrub() foam()
Testing base class:
Cleanser  dilute()  apply()  scrub()

 看以看到继承使用的是关键字extends,如果在子类中想调用父类方法,可以使用super.*。

1、初始化父类

在创建一个子类对象时,父类构造器总会在子类构造器之前被调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Art{
    Art(){
        System.out.println("Art constructor");
    }
}
 
class Drawing extends Art{
    Drawing(){
        System.out.println("Drawing constructor");
    }
}
 
public class Cartoon extends Drawing{
    Cartoon(){
        System.out.println("Cartoon constructor");
    }
     
    public static void main(String[] args) {
        Cartoon x = new Cartoon();
    }
}

 运行输出如下:

1
2
3
Art constructor
Drawing constructor
Cartoon constructor

 所以很容易发现,子类对象的构建过程是从父类"向外"扩散的,所以父类在子类构造器可以访问它之前,就已经完成了初始化。

上面的父类构造函数是没有参数的,如果父类只有一个带有参数的构造器,就必须在子类构造器中用关键字super显式的编写调用父类构造器的语句,否则编译器将无法找到符合'类名()'形式的构造器。

2、重载

亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。

日期姓名金额
2023-09-06*源19
2023-09-11*朝科88
2023-09-21*号5
2023-09-16*真60
2023-10-26*通9.9
2023-11-04*慎0.66
2023-11-24*恩0.01
2023-12-30I*B1
2024-01-28*兴20
2024-02-01QYing20
2024-02-11*督6
2024-02-18一*x1
2024-02-20c*l18.88
2024-01-01*I5
2024-04-08*程150
2024-04-18*超20
2024-04-26.*V30
2024-05-08D*W5
2024-05-29*辉20
2024-05-30*雄10
2024-06-08*:10
2024-06-23小狮子666
2024-06-28*s6.66
2024-06-29*炼1
2024-06-30*!1
2024-07-08*方20
2024-07-18A*16.66
2024-07-31*北12
2024-08-13*基1
2024-08-23n*s2
2024-09-02*源50
2024-09-04*J2
2024-09-06*强8.8
2024-09-09*波1
2024-09-10*口1
2024-09-10*波1
2024-09-12*波10
2024-09-18*明1.68
2024-09-26B*h10
2024-09-3010
2024-10-02M*i1
2024-10-14*朋10
2024-10-22*海10
2024-10-23*南10
2024-10-26*节6.66
2024-10-27*o5
2024-10-28W*F6.66
2024-10-29R*n6.66
2024-11-02*球6
2024-11-021*鑫6.66
2024-11-25*沙5
2024-11-29C*n2.88
posted @   大奥特曼打小怪兽  阅读(766)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
如果有任何技术小问题,欢迎大家交流沟通,共同进步

公告 & 打赏

>>

欢迎打赏支持我 ^_^

最新公告

程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)。

了解更多

点击右上角即可分享
微信分享提示