Java:面向对象编程【继承】

Java继承与组合 我们举例写的类是现实事物的抽象. 而我们真正开发所遇到的项目往往业务比较复杂, 可能会涉及到一系列复杂的概念, 都需要我们使用代码来表示, 所以真实项目中所写的类也会有很多. 类之间的关系也会更加复杂.即使如此, 我们并不希望类之间的继承层次太复杂. 一般我们不希望出现超过三层的继承关系. 如果继承层次太多, 就需要考虑对代码进行重构了.继承(inheritance)机制:面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类的特性的基础上进行扩展,增加新功能,这样产生新的类,称派生类。 阅读详情

1. 继承

1.1 为什么需要继承

ava中使⽤类对现实世界中实体来进⾏描述,类经过实例化之后的产物对象,则可以⽤来表⽰现实中的 实体,但是现实世界错综复杂,事物之间可能会存在⼀些关联,那在设计程序时就需要考虑。 ⽐如:狗和猫,它们都是⼀个动物。

使⽤Java语⾔来进⾏描述,就会设计出这样的代码:

// Dog.java
public class Dog {
    String name;
    int age;
    float weight;

    public void eat() {
        System.out.println(name + "正在吃饭");
    }

    public void sleep() {
        System.out.println(name + "正在睡觉");
    }

    void Bark() {
        System.out.println(name + "汪汪汪~~~");
    }
}

// Cat.java
public class Cat {
    String name;
    int age;
    float weight;

    public void eat() {
        System.out.println(name + "正在吃饭");
    }

    public void sleep() {
        System.out.println(name + "正在睡觉");
    }

    void mew() {
        System.out.println(name + "喵喵喵~~~");
    }
}

通过观察上述代码会发现,猫和狗的类中存在⼤量重复,如下所⽰:

那能否将这些共性抽取呢?⾯向对象思想中提出了继承的概念,专⻔⽤来进⾏共性抽取,实现代码复 ⽤。

1.2 继承概念

继承(inheritance)机制:是⾯向对象程序设计使代码可以复⽤的最重要的⼿段,它允许程序员在保持 原有类特性的基础上进⾏扩展,增加新功能,这样产⽣新的类,称派⽣类。继承呈现了⾯向对象程序 设计的层次结构,体现了由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码 复⽤。

例如:狗和猫都是动物,那么我们就可以将共性的内容进⾏抽取,然后采⽤继承的思想来达到共⽤。

上述图⽰中,Dog和Cat都继承了Animal类,其中:Animal类称为⽗类/基类或超类,Dog和Cat可以称 为Animal的⼦类/派⽣类,继承之后,⼦类可以复⽤⽗类中成员,⼦类在实现时只需关⼼⾃⼰新增加的 成员即可。

从继承概念中可以看出继承最⼤的作⽤就是:实现代码复⽤,还有就是来实现多态(后序讲)。

1.3 继承的语法

在Java中如果要表⽰类之间的继承关系,需要借助extends关键字,具体如下:

修饰符 class ⼦类 extends ⽗类 {
 // ... 
}

对1.2中场景使⽤继承⽅式重新设计:

// Animal.java
public class Animal {
    String name;
    int age;

    public void eat() {
        System.out.println(name + "正在吃饭");
    }

    public void sleep() {
        System.out.println(name + "正在睡觉");
    }
}

// Dog.java
public class Dog extends Animal {
    void bark() {
        System.out.println(name + "汪汪汪~~~");
    }
}

// Cat.Java
public class Cat extends Animal {
    void mew() {
        System.out.println(name + "喵喵喵~~~");
    }
}

// TestExtend.java
public class TestExtend {
    public static void main(String[] args) {
        Dog dog = new Dog();
        // dog类中并没有定义任何成员变量,name和age属性肯定是从⽗类Animal中继承下来的
        System.out.println(dog.name);
        System.out.println(dog.age);

        // dog访问的eat()和sleep()⽅法也是从Animal中继承下来的
        dog.eat();
        dog.sleep();
        dog.bark();
    }
}

从上述代码我们可以看到Dog类和Cat类的部分代码重复使⽤了Animal中的代码。

注意: 1. ⼦类会将⽗类中的成员变量或者成员⽅法继承到⼦类中

            2. ⼦类继承⽗类之后,必须要新添加⾃⼰特有的成员,体现出与基类的不同,否则就没有必要继承了

1.4 ⽗类成员访问

在继承体系中,⼦类将⽗类中的⽅法和字段继承下来了,那在⼦类中能否直接访问⽗类中继承下来的 成员呢?

1.4.1 ⼦类中访问⽗类的成员变量

• ⼦类和⽗类不存在同名成员变量

public class Base {
 int a;
 int b;
}
public class Derived extends Base{
 int c;
 public void method(){
 a = 10; // 访问从⽗类中继承下来的a 
 b = 20; // 访问从⽗类中继承下来的b 
 c = 30; // 访问⼦类⾃⼰的c 
 }
}

• ⼦类和⽗类成员变量同名

public class Base {
 int a;
 int b;
 int c;
}
public class Derived extends Base{
 int a; // 与⽗类中成员a同名,且类型相同 
 char b; // 与⽗类中成员b同名,但类型不同 
 public void method(){
 a = 100; // 访问⽗类继承的a,还是⼦类⾃⼰新增的a? 
 b = 101; // 访问⽗类继承的b,还是⼦类⾃⼰新增的b? 
 c = 102; // ⼦类没有c,访问的肯定是从⽗类继承下来的c 
 // d = 103; // 编译失败,因为⽗类和⼦类都没有定义成员变量b 
 }
}

在 Derived 类重点 method ⽅法中访问a和b访问的都是优先访问⼦类⾃⼰的!

在⼦类⽅法中 或者 通过⼦类对象访问成员时:
• 如果访问的成员变量⼦类中有,优先访问⾃⼰的成员变量。
• 如果访问的成员变量⼦类中⽆,则访问⽗类继承下来的,如果⽗类也没有定义,则编译报错。
• 如果访问的成员变量与⽗类中成员变量同名,则优先访问⾃⼰的。
成员变量访问遵循就近原则,⾃⼰有优先⾃⼰的,如果没有则向⽗类中找。

1.4.2 ⼦类中访问⽗类的成员⽅法

• 成员⽅法名字不同

public class Base {
    public void methodA() {
        System.out.println("Base中的methodA()");
    }
}

public class Derived extends Base {
    public void methodB() {
        System.out.println("Derived中的methodB()⽅法");
    }

    public void methodC() {
        methodB(); // 访问⼦类⾃⼰的methodB()
        methodA(); // 访问⽗类继承的methodA()
        // methodD(); // 编译失败,在整个继承体系中没有发现⽅法methodD()
    }
}

总结:成员⽅法没有同名时,在⼦类⽅法中或者通过⼦类对象访问⽅法时,则优先访问⾃⼰的,⾃⼰ 没有时再到⽗类中找,如果⽗类中也没有则报错。

• 成员⽅法名字相同

public class Base {
    public void methodA() {
        System.out.println("Base中的methodA()");
    }

    public void methodB() {
        System.out.println("Base中的methodB()");
    }
}

public class Derived extends Base {
    public void methodA() {
        System.out.println("Derived中的method()⽅法");
    }

    public void methodB() {
        System.out.println("Derived中的methodB()⽅法");
    }

    public void methodC() {
        methodA(); // 优先访问⼦类中的methodA()
        methodB(); // 直接访问,则永远访问到的都是⼦类中的methodB(),基类的⽆法访问到
    }
}

【说明】
• 通过⼦类对象访问⽗类与⼦类中不同名⽅法时,优先在⼦类中找,找到则访问,否则在⽗类中找,
找到则访问,否则编译报错。
• 通过派⽣类对象访问⽗类与⼦类同名⽅法时,如果⽗类和⼦类同名⽅法的参数列表不同(重载),根
据调⽤⽅法适传递的参数选择合适的⽅法访问,如果没有则报错;
问题:如果⼦类中存在与⽗类中相同的成员时,那如何在⼦类中访问⽗类相同名称的成员呢?

1.5 super关键字

由于设计不好,或者因场景需要,⼦类和⽗类中可能会存在相同名称的成员,如果要在⼦类⽅法中访 问⽗类同名成员时,该如何操作?直接访问是⽆法做到的,Java提供了super关键字,该关键字主要 作⽤:在⼦类⽅法中访问⽗类的成员。

public class Base {
    int a;
    int b;

    public void methodA() {
        System.out.println("Base中的methodA()");
    }

    public void methodB() {
        System.out.println("Base中的methodB()");
    }
}

public class Derived extends Base {
    int a; // 与⽗类中成员变量同名且类型相同

    // 与⽗类中methodA()构成重载
    public void methodA(int a) {
        System.out.println("Derived中的method()⽅法");
    }

    // 与基类中methodB()构成重写(即原型⼀致,重写后序详细介绍)
    public void methodB() {
        System.out.println("Derived中的methodB()⽅法");
    }

    public void methodC() {
        // 对于同名的成员变量,直接访问时,访问的都是⼦类的
        a = 100; // 等价于: this.a = 100;
        b = 101; // 等价于: this.b = 101;
        // 注意:this是当前对象的引⽤

        // 访问⽗类的成员变量时,需要借助super关键字
        // super是获取到⼦类对象中从基类继承下来的部分
        super.a = 200;
        super.b = 201;

        // ⽗类和⼦类中构成重载的⽅法,直接可以通过参数列表区分访问⽗类还是⼦类⽅法
        methodA(); // 没有传参,访问⽗类中的methodA()
        methodA(20); // 传递int参数,访问⼦类中的methodA(int)

        // 如果在⼦类中要访问重写的基类⽅法,则需要借助super关键字
        methodB(); // 直接访问,则永远访问到的都是⼦类中的methodA(),基类的⽆法访问到
        super.methodB(); // 访问基类的methodB()
    }
}

在⼦类⽅法中,如果想要明确访问⽗类中成员时,借助super关键字即可。
总结:
• super可以访问⽗类的成员变量
• super可以访问⽗类的成员⽅法
• super还可以调⽤⽗类当中指定的构造⽅法,接下来我们看⼀下

注意事项
1. 只能在⾮静态⽅法中使⽤
2. 在⼦类⽅法中,访问⽗类的成员变量和⽅法。

1.6 ⼦类构造⽅法

我们先来看⼀段代码:

public class Base {
    public Base(int a) {
        System.out.println("Base():" + a);
    }
}

public class Derived extends Base {
    public Derived() {
        System.out.println("Derived()");
    }
}

public class Test {
    public static void main(String[] args) {
        Derived d = new Derived();
    }
}

问题:该代码为什么会编译错误呢?
事实上,当我们在构造⼦类对象的时候,需要先调⽤基类构造⽅法,然后执⾏⼦类的构造⽅法。所
以,我们需要在⼦类对象构造完成之前,先帮助⽗类对其中的成员进⾏初始化。具体⽅式如下:

public class Base {
    public Base(int a) {
        System.out.println("Base():" + a);
    }
}

public class Derived extends Base {
    public Derived() {
        super(10); // 此时通过super(参数)的形式
        System.out.println("Derived()");
    }
}

public class Test {
    public static void main(String[] args) {
        Derived d = new Derived();
    }
}

// 打印结果:
// Base():10
// Derived()

【注意事项】
• 通过super(参数)的形式可以调⽤⽗类指定的构造⽅法
• super()的形式只能出现在⼦类的构造⽅法当中且必须在第⼀⾏
问题:如下代码为什么没有报错呢?

public class Base {
    public Base() {
        System.out.println("Base()");
    }
}

public class Derived extends Base {
    public Derived() {
        // super(); // 注意子类构造方法中默认会调用基类的无参构造方法:super(),
        // 用户没有写时,默认会添加一个super(),而且super()必须是子类构造方法中第一条语句,
        // 并且只能出现一次
        System.out.println("Derived()");
    }
}

public class Test {
    public static void main(String[] args) {
        Derived d = new Derived();
    }
}
结果打印:
Base()
Derived()

【注意事项】
• 正如注释处所说,当⽗类的构造⽅法是不带参数的构造⽅法且只有这⼀个的情况下,默认会添加⼀个super()。
【总结】
• 在⼦类构造⽅法中,并没有写任何关于基类构造的代码,但是在构造⼦类对象时,先执⾏基类的构造⽅法,然后执⾏⼦类的构造⽅法,因为:⼦类对象中成员是有两部分组成的,基类继承下来的以及⼦类新增加的部分。⽗⼦⽗⼦肯定是先有⽗再有⼦,所以在构造⼦类对象时候,先要调⽤基类
的构造⽅法,将从基类继承下来的成员构造完整,然后再调⽤⼦类⾃⼰的构造⽅法,将⼦类⾃⼰新
增加的成员初始化完整。
• 若⽗类显式定义⽆参或者默认的构造⽅法,在⼦类构造⽅法第⼀⾏默认有隐含的super()调⽤,即调⽤基类构造⽅法
• 如果⽗类构造⽅法是带有参数的,此时需要⽤⼾为⼦类显式定义构造⽅法,并在⼦类构造⽅法选
择合适的⽗类构造⽅法调⽤,否则编译失败
• 在⼦类构造⽅法中,super(...)调⽤⽗类构造时,必须是⼦类构造函数中第⼀条语句
• super(...)只能在⼦类构造⽅法中出现⼀次,并且不能和this同时出现

1.7 super和this

super和this都可以在成员⽅法中⽤来访问:成员变量和调⽤其他的成员函数,都可以作为构造⽅法的 第⼀条语句,那他们之间有什么区别呢?

【相同点】
1. 都是Java中的关键字
2. 只能在类的⾮静态⽅法中使⽤,⽤来访问⾮静态成员⽅法和字段
3. 在构造⽅法中调⽤时,必须是构造⽅法中的第⼀条语句,并且不能同时存在
【不同点】
1. this是当前对象的引⽤,当前对象即调⽤实例⽅法的对象,super相当于是⼦类对象中从⽗类继承下来部分成员的引⽤

2. 在⾮静态成员⽅法中,this⽤来访问本类的⽅法和属性,super⽤来访问⽗类继承下来的⽅法和属性
3. 在构造⽅法中:this(...)⽤于调⽤本类构造⽅法,super(...)⽤于调⽤⽗类构造⽅法,两种调⽤不能同时在构造⽅法中出现
4. 构造⽅法中⼀定会存在super(...)的调⽤,⽤⼾没有写编译器也会增加,但是this(...)⽤⼾不写则没有

1.8 继承关系上代码块等的初始化顺序

1.8.1 回顾之前的初始化顺序

我们还记得之前讲过的代码块吗?我们简单回顾⼀下⼏个重要的代码块:实例代码块和静态代码块。 在没有继承关系时的执⾏顺序。

class Person {
    public String name;
    public int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("构造⽅法执⾏");
    }

    {
        System.out.println("实例代码块执⾏");
    }

    static {
        System.out.println("静态代码块执⾏");
    }
}

public class TestDemo {
    public static void main(String[] args) {
        Person person1 = new Person("bit", 10);
        System.out.println("============================");
        Person person2 = new Person("gaobo", 20);
    }
}
静态代码块执⾏
实例代码块执⾏
构造⽅法执⾏
============================
实例代码块执⾏
构造⽅法执⾏

1. 静态代码块先执⾏,并且只执⾏⼀次,在类加载阶段执⾏

2. 当有对象创建时,才会执⾏实例代码块,实例代码块执⾏完成后,最后构造⽅法执行

1.8.2 继承关系上的执⾏顺序

class Person {
    public String name;
    public int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("Person:构造⽅法执⾏");
    }

    {
        System.out.println("Person:实例代码块执⾏");
    }

    static {
        System.out.println("Person:静态代码块执⾏");
    }
}

class Student extends Person {
    public Student(String name, int age) {
        super(name, age);
        System.out.println("Student:构造⽅法执⾏");
    }

    {
        System.out.println("Student:实例代码块执⾏");
    }

    static {
        System.out.println("Student:静态代码块执⾏");
    }
}

public class TestDemo4 {
    public static void main(String[] args) {
        Student student1 = new Student("张三", 19);
        System.out.println("===========================");
        Student student2 = new Student("gaobo", 20);
    }
}

执⾏结果:

Person:静态代码块执⾏
Student:静态代码块执⾏
Person:实例代码块执⾏
Person:构造⽅法执⾏
Student:实例代码块执⾏
Student:构造⽅法执⾏
===========================
Person:实例代码块执⾏
Person:构造⽅法执⾏
Student:实例代码块执⾏
Student:构造⽅法执⾏

通过分析执⾏结果,得出以下结论:
1. ⽗类静态代码块优先于⼦类静态代码块执⾏,且是最早执⾏
2. ⽗类实例代码块和⽗类构造⽅法紧接着执⾏
3. ⼦类的实例代码块和⼦类构造⽅法紧接着再执⾏

4. 第⼆次实例化⼦类对象时,⽗类和⼦类的静态代码块都将不会再执⾏

1.9 访问修饰限定符-protected 关键字 

在类和对象章节中,为了实现封装特性,Java中引⼊了访问限定符,主要限定:类或者类中成员能否 在类外或者其他包中被访问。

那⽗类中不同访问权限的成员,在⼦类中的可⻅性⼜是什么样⼦的呢?

1.9.1 private关键字

如果被 private 关键字修饰该类当中成员变量,成员⽅法等只能在当前类当中使⽤

1.9.2 不加任何的关键字

如果不加任何的关键字修饰该类当中成员变量,成员⽅法等表⽰默认权限,默认权限代表的也是包访 问权限,意味着只能在当前包当中使⽤

1.9.3 protected关键字

如果被 protected 关键字修饰该类当中成员变量,成员⽅法等表⽰要么只能在同⼀个包中的类中进 ⾏访问,要么在不同包中只能通过在继承关系上的⼦类对象来访问。

⽰例代码如下:

// Base.java
package com.bit.demo1;

public class Base {
    protected int b = 100;
}
// Derived.java
package com.bit.demo2;

import com.bit.demo1.Base;

public class Derived extends Base {
    public static void main(String[] args) {
        Derived derived = new Derived();
        System.out.println(derived.b);
    }
}

反例:

package com.bit.demo2;

import com.bit.demo1.Base;

class C extends Base {
    public static void main(String[] args) {
        C c = new C();
        System.out.println(c.b);
    }
}

public class Derived extends Base {
    public static void main(String[] args) {
        Derived derived = new Derived();
        System.out.println(derived.b);

        C c = new C();
        System.out.println(c.b); // 该处出现错误
    }
}

虽然Derived 类继承⾃Base 类,但它不能访问其他Base 类⼦类(这⾥是C 类)实例的 protected 成员。

1.9.4 public关键字

如果被public 关键字修饰该类当中成员变量,成员⽅法等表⽰该成员变量和成员⽅法是公开的。什么时候下⽤哪⼀种呢?
我们希望类要尽量做到"封装",即隐藏内部实现细节,只暴露出必要的信息给类的调⽤者.因此我们在使⽤的时候应该尽可能的使⽤⽐较严格的访问权限.例如如果⼀个⽅法能⽤private,就尽量不要⽤public
另外,还有⼀种简单粗暴的做法:将所有的字段设为private,将所有的⽅法设为public.不过这种⽅
式属于是对访问权限的滥⽤,还是更希望同学们能写代码的时候认真思考,该类提供的字段⽅法到底
给"谁"使⽤(是类内部⾃⼰⽤,还是类的调⽤者使⽤,还是⼦类使⽤).

1.10 继承⽅式

在现实⽣活中,事物之间的关系是⾮常复杂,灵活多样,⽐如:

但在Java中只⽀持以下⼏种继承⽅式:

注意:Java中不⽀持多继承。

时刻牢记,我们写的类是现实事物的抽象.⽽我们真正在公司中所遇到的项⽬往往业务⽐较复杂,可能
会涉及到⼀系列复杂的概念,都需要我们使⽤代码来表⽰,所以我们真实项⽬中所写的类也会有很多.
类之间的关系也会更加复杂.
但是即使如此,我们并不希望类之间的继承层次太复杂.⼀般我们不希望出现超过三层的继承关系.如
果继承层次太多,就需要考虑对代码进⾏重构了.
如果想从语法上进⾏限制继承,就可以使⽤final关键字

1.10.1 final关键字

final关键可以⽤来修饰变量、成员⽅法以及类。

• 修饰变量或字段,表⽰常量(即不能修改)

final int a = 10;
a = 20; // 编译出错 

• 修饰类:表⽰此类不能被继承

final public class Animal {
 ...
}
public class Bird extends Animal {
 ...
}

我们平时是⽤的String字符串类,就是⽤final修饰的,不能被继承.

• 修饰⽅法:表⽰该⽅法不能被重写(后序介绍)

1.11 继承与组合

和继承类似,组合也是⼀种表达类之间关系的⽅式,也是能够达到代码重⽤的效果。组合并没有涉及到 特殊的语法(诸如extends这样的关键字),仅仅是将⼀个类的实例作为另外⼀个类的字段。

继承表⽰对象之间是is-a的关系,⽐如:狗是动物,猫是动物
组合表⽰对象之间是has-a的关系,⽐如:汽⻋

汽⻋和其轮胎、发动机、⽅向盘、⻋载系统等的关系就应该是组合,因为汽⻋是有这些部件组成的。

// 轮胎类
class Tire {
    // ...
}

// 发动机类
class Engine {
    // ...
}

// ⻋载系统类
class VehicleSystem {
    // ...
}

class Car {
    private Tire tire; // 可以复⽤轮胎中的属性和⽅法
    private Engine engine; // 可以复⽤发动机中的属性和⽅法
    private VehicleSystem vs; // 可以复⽤⻋载系统中的属性和⽅法

    // ...
}

// 奔驰是汽⻋
class Benz extends Car {
    // 将汽⻋中包含的:轮胎、发送机、⻋载系统全部继承下来
}

组合和继承都可以实现代码复⽤,应该使⽤继承还是组合,需要根据应⽤场景来选择,⼀般建议:能 ⽤组合尽量⽤组合。

2. ⼩试⽜⼑

1.关于Java中的继承,以下哪个陈述是正确的?
A.⼀个类可以同时继承多个类
B.⼦类可以直接访问⽗类的私有(private)成员
C.使⽤final关键字修饰的类可以被继承
D.⼦类可以重写(override)⽗类的⽅法
2.以下关于Java继承的说法,哪⼀个是错误的?
A.⼦类可以通过super关键字调⽤⽗类的构造⽅法
B.所有的Java类都直接或间接继承⾃java.lang.Object类
C.构造⽅法可以被⼦类继承
D.使⽤protected修饰的成员可以被⼦类访问
答案解析:
1.D
2.C

3.总之

  • 继承不仅是代码复用手段,也是多态的基础。

  • 使用继承应控制层次、保持关系清晰,避免过度继承。

  • 组合优于继承,设计时应根据关系本质选择复用方式。

Java面向对象编程进阶:封装、继承与多态详解 面向对象编程(OOP)是现代软件开发的核心范式,Java作为主流编程语言,其OOP实现尤为经典。封装通过访问控制保护数据完整性,继承实现代码复用和层次化设计,多态则提供了灵活的对象行为机制。这些特性共同构成了Java编程的基础架构,在工业级开发中应用广泛,特别是在框架设计和系统架构领域。理解Java的OOP特性对于掌握设计模式和SOLID原则至关重要,能够帮助开发者构建更健壮、可扩展的应用程序。本文深入解析封装、继承和多态的实现原理,并结合实际代码示例展示其在企业级开发中的典型应用场景。 阅读详情

相关推荐

Java的面向对象编程概念:封装、继承、多态和抽象

抽象是指将对象的复杂实现细节隐藏起来,只暴露出简单的接口。抽象类和接口是Java中实现抽象的两种主要方式。抽象类是不能被实例化的类,通常包含抽象方法(没有方法体的方法),具体子类必须实现这些抽象方法。接口是一种更高级的抽象,规定了一组方法,但不包含任何实现。// 抽象类// 抽象方法// 普通方法System.out.println("动物的名字是: " + name);// 具体子类@OverrideSystem.out.println("猫叫:喵喵");在上述代码中,

私聊前往站内信:https://i.youkuaiyun.com/#/msg/chat/weixin_44976692 1万+

Java- 继承 和 实现 、组合

Java- 继承 和 实现 、组合

人生在手 2386

48V电动车电池包拆解:硬核入门BMS硬件设计与故障排查

BMS(电池管理系统)是锂电应用的核心安全与性能保障模块,其本质是融合电化学、模拟电路、嵌入式控制与热管理的交叉系统。理解BMS不能止步于SOC算法或通信协议,而需回归硬件本体——从电压采样精度、MOSFET驱动时序、被动均衡散热设计到NTC热耦合布局,每一处物理实现都直接决定系统可靠性。48V平台因兼具安全性(<60V ELV)、复杂度(13–14串)与产业普及性,成为BMS工程实践的理想标本。本文聚焦真实电池包中的PCB级设计缺陷识别、关键参数现场验证(如±5mV采样误差、5mΩ导通内阻)、UART协议

weixin_29191081的博客 238

继承与组合(Java详解)

继承,super,组合,重写,转型

m0_61359105的博客 2094

Go语言集成Ollama本地大模型:gollama库实战指南

在当今的AI应用开发中,大型语言模型(LLM)的集成已成为关键技术。其核心原理是通过API调用,将自然语言处理能力嵌入到各类应用中。从技术价值看,本地化部署的LLM解决了数据隐私、网络延迟和持续成本三大痛点,尤其适合处理敏感数据或对实时性要求高的场景。在工程实践中,开发者常使用专门的客户端库来简化与模型服务的交互,例如通过封装REST API、提供类型安全接口和流式处理支持,从而提升开发效率和代码健壮性。具体到Go语言生态,结合Ollama这一流行的本地大模型运行工具,可以实现完全离线、低延迟的AI功能集成

weixin_28728443的博客 605

从零做出可发布的2D冒险游戏!Unity全流程实战指南:从资源搭建到打包发布,新手也能跟着做

项目配置→资源导入→核心模块开发→关卡设计→调试→打包发布;玩家控制→敌人AI→道具系统→UI系统→游戏管理器→音效系统;新手开发重点:先实现核心玩法(移动、跳跃、攻击),再补充UI、音效、存档等辅助功能;调试是关键:每实现一个功能就测试,避免最后一堆bug难以定位。从零做一款完整的2D冒险游戏,能快速提升你的Unity综合能力——不仅能掌握C#编程、2D物理、UI系统,还能理解游戏开发的完整流程。先做出基础版,再慢慢迭代优化,你会发现游戏开发并没有想象中那么难。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1182

从0到1,Java基础(9)——继承与组合

子类对父类进行扩展,从一般到特殊的关系,父类-共性,子类-特性继承表达的是一种“是(is-a)”的关系代表当前对象的父类对象。

学习小屋 338

HarmonyOS ArkTS开发实战:用Axios封装一个通用的网络请求工具类(附完整代码)

本文详细介绍了如何在HarmonyOS ArkTS开发中利用Axios封装一个通用的网络请求工具类,涵盖架构设计、核心模块实现、UI状态联动及高级功能扩展。通过单例控制器、拦截器链配置和Token自动刷新机制,提升网络请求的稳定性和可维护性,适用于各类HarmonyOS应用开发场景。

weixin_30772105的博客 491

Java中继承与组合的区别

组合和继承是Java中实现系统功能的重用和代码的复用的两种方式。两者在实现和使用上存在一些区别: 区别1、在类之间的关系上,继承强调的是is-a的关系,即子类是父类的一种,例如:人和动物,人是动物的一种,那么人和动物之间就存在继承的关系,人为子类,动物为父类。而组合强调的是have-a的关系,即类内部被使用的那个类是该类所拥有的东西,例如:人和心脏,心脏为人所拥有的东西,那么人和心脏之间就存在组合的关系,在人这一个类的内部可以定义一个心脏类型的变量。 区别2、子类继承父类后,父类的所有属性和方法都可以被子类

damon000的博客 2279

Deepseek Engram 论文全面解读

以下是对 DeepSeek 与北京大学于联合发布的论文《》(简称Engram 论文)的。

lpfasd123的博客 357

音乐生成 - 使用LSTM或Transformer模型进行音乐生成,如MIDI音乐生成。

在本篇博客中,我们将介绍如何使用LSTM和Transformer模型生成MIDI音乐。我们将首先概述音乐生成的一般流程,然后深入了解LSTM和Transformer模型的特点和实现。最后,我们将通过Python代码演示如何使用这两种模型生成MIDI音乐。

斌擎科技 1722

探究Java面向对象编程:继承、封装与多态

深入探究Java面向对象编程:继承、封装与多态!

努力上进!!加油加油!! 2185

手把手教你YOLOv8/YOLOv11分割训练自己数据集和推理,并教你使用Labelme工具标注数据(附分割网络结构图)

YOLOv8-seg 和 YOLOv11-seg 都是一种高效实例分割算法,实例分割模型的输出是一组勾勒出图像中每个物体的遮罩或轮廓,以及每个物体的类标签和置信度分数。当你不仅需要知道物体在图像中的位置,还需要知道它们的具体形状时,实例分割就非常有用了,功能非常强大,可以应对各种视觉任务。 YOLOv11-seg 则在 YOLOv8-seg 基础上进一步魔改了模型架构,相对分割速度可能更快,其他指标性能有待测试。实例分割可以用于自动驾驶、医疗图像处理、智能农业监控等领域。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 4477

Java面向对象编程:类、继承与接口实战

本文深入讲解了Java面向对象编程的核心概念,包括封装、继承和多态三大特性。通过实例详细阐释了类与对象的创建、继承规则、接口使用等关键内容,并提供了一个学生管理系统实战案例。文章还对比了抽象类与接口的区别,强调抽象类用于"is-a"关系实现代码复用,接口则用于"can-do"关系规范行为。掌握这些面向对象编程技术,能够帮助开发者构建结构清晰、可维护性强的Java程序。

2503_93373937的博客 590

AI 赋能 DBA:如何用 DeepSeek 等大模型简化数据库管理工作

数据库管理员(DBA)的工作涉及 SQL 优化、故障排查、性能监控等复杂任务。而 DeepSeek、ChatGPT 等大模型可以大幅减少重复劳动,提高 DBA 的工作效率。:某电商平台的订单查询 SQL 执行缓慢(平均 5s),DBA 需要优化。:DBA 需要监控 MySQL 的慢查询,但不想手动写脚本。:某金融系统频繁出现数据库死锁,DBA 需要快速定位原因。:大模型可分析 SQL 执行计划,推荐索引优化方案。:用日常语言查询数据库,无需写复杂 SQL。:一键生成监控、备份、数据迁移脚本。

专注于编程、AI、人工智能等多个领域内容研究和分析 565

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java面向编程封装继承多台_Java 面向对象编程三大特性: 封装 继承 多态

Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。今天的文章中合肥Java培训将为大家介绍一下Java 面向对象编程三大特性: 封装 继承 多态,希望对大家的学习有所帮助!封装封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们...

weixin_39914499的博客 341

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Java面向对象编程入门:接口、继承与多态】

本文章对java的接口,继承与多态进行了详细的讲解

2401_86718044的博客 990

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java 面向对象编程三大特性: 封装 继承 多态

封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加。新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发。出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变。量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中。子类可以拥有自己属性和方法,即子类可以对父类进行扩展。子类可以用自己的方式实现父类的方法。

qq_50846400的博客 487

JAVA学习笔记:JAVA中面向对象编程(面向对象编程三大特征:封装、继承和多态)

1、概述 java的编程语言是面向对象的,面向对象编程(Object-Oriented Programming)简称OOP java面向对象编程的三大特征:封装、继承、多态 1)封装 2)继承 3多态 ...

m0_45237843的博客 415

深入解析Java面向对象编程三大核心思想:封装、继承与多态

在云原生、函数式编程兴起的今天,Java的OOP特性正在与新技术范式融合。记录类(Record)、模式匹配、var类型等新特性,都在保持OOP核心思想的同时,提升开发效率。理解这些基础原理,将帮助开发者在微服务架构、领域驱动设计等现代架构中,构建出更健壮、更灵活的软件系统。面向对象不是银弹,但经过28年演进,它仍然是构建复杂业务系统最有效的工具之一。掌握其精髓,方能在代码的抽象与现实世界的模型之间,架起坚实的桥梁。

nmmwm的博客 1184

【JAVA-Day62】Java继承:面向对象编程中重要的基石

本技术博客将深入研究Java中继承的核心概念,探寻其在面向对象编程中的重要地位。通过对继承的本质、倡导原因、技巧、与封装、多态的融合,以及面试考点的深入理解,我们将为你呈现继承的全貌,揭示其在实际开发中的价值和实践总结。总结使用继承的最佳实践,给出一系列注意事项,并强调在实际开发中应用这些技巧的重要性。深入理解并掌握继承的技巧可以帮助你更加灵活地设计和构建面向对象的应用程序,并有效地避免继承可能带来的潜在问题。详细解释继承的概念,子类如何从父类继承属性和方法。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 2万+

Java继承与多态:面向对象编程的双翼

在 Java 中,继承(Inheritance) 和 多态(Polymorphism) 是面向对象编程的核心特性,二者紧密相关但作用不同。以下是它们的详细解析:

weixin_69555518的博客 1289

4、Java 中的封装、继承和多态:面向对象编程的三大支柱

嘿,Java 学习者们!在我们的 Java 学习之旅中,我们已经初步了解了面向对象编程的基础知识,今天我们将深入探讨面向对象编程的三大支柱:封装、继承和多态。这些概念是 Java 程序设计的核心,它们将帮助我们写出更加灵活、可维护和可扩展的代码。让我们一起揭开它们的神秘面纱吧!

翻晒时光的博客 568

java 封装继承多态 程序_Java面向对象编程:封装,继承,多态

Java面向对象的三大特征:封装:通过Java的类来实现数据和操作方法的封装,对外界可以将每一个Java类都视为一个黑箱,只需调用该黑箱提供的方法即可完成你想要的操作。继承:通过类的继承,将统一的功能集中放在父类中,实现代码的重用和可维护性。多态:通过重载、重写与覆盖,实现不同类的不同形态特征。一个被定义成private的类成员为此类私有,它不能被该类外的所有代码访问,包括子类。如果子类中不显式调...

weixin_39997194的博客 157

Java面向对象编程核心特性详解:封装、继承、多态

在Java面向对象编程中,封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)*是三个最核心的概念。封装是指将数据(属性)和行为(方法)绑定在一起,并对外隐藏内部实现细节,仅暴露必要的接口供外部访问。- 使用 `private`、`protected`、`public` 等访问修饰符控制可见性。继承允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的重用和层次结构的建立。| 继承 | 子类继承父类的属性和方法,实现代码复用 |

2302_80461269的博客 425
上一篇: Java:面向对象编程【多态】
下一篇: Java 包装类与泛型学习笔记:从装箱拆箱到类型擦除与通配符
groot520
博客等级 码龄2年 0粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值