Java-继承和组合(下)

简介: Java-继承和组合(下)

9. protected关键字



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

a6b59b6e62d144f0bf07e48a20adf9b2.png


那父类中不同访问权限的成员,在子类中的可见性又是什么样子的呢?


 //包1中
public class B {
    private int a;
    protected int b;
    public int c;
    int d;
}
        //包1中的子类
public class D extends B{
    public void method(){
        //super.a=10; //编译报错,父类B中private成员在相同包子类中不可见
        super.b=20;  //父类B中protected成员在相同包子类中可以访问
        super.c=10;  //父类B中public成员在相同包子类中可以访问
        super.d=2;  //父类B中defult成员在相同包子类中可以访问
    }
}
        //包2中的子类
public class C extends B {
    public void  method(){
        //super.a;      //编译报错,父类B中private修饰的成员在不同包子类中不可见
        super.b=10;     //父类protected修饰的成员在不同包中可见
        super.c=50;     //父类public修饰的成员在不同包中可见
        //super.d=100;  //编译报错,父类defult修饰的成员在不同包中不可见
    }
}
        //包2中的其他类
public class TextC {
   public static void main(String[] args) {
       C c=new C();
       c.method();
    //System.out.println(c.a);//编译报错父类中private修饰的成员在不同包其他类中不可见
   //System.out.println(c.b);//编译报错父类中protected修饰的成员在不同包其他类中不可见
      System.out.println(c.c);//父类中public修饰的成员在不同包其他类中可以访问
    //System.out.println(c.d);// 编译报错,父类中defult修饰的成员在不同包其他类中不可见
    }
}


注意:父类中private修饰的成员变量虽然在子类中不能直接访问,但是也继承到子类中。

       什么时候下用哪一种呢?


我们希望类要尽量做到 "封装", 即隐藏内部实现细节, 只暴露出 必要 的信息给类的调用者,因此我们在使用的时候应该尽可能的使用 比较严格 的访问权限. 例如如果一个方法能用 private, 就尽量不要用 public


10. 继承方式



       在现实生活中,事物之间的关系是非常复杂,灵活多样,比如:

9f5b4e821eb545299661ee91ba004586.png


但在Java中支支持以下几种继承方式:

image.png



 我们并不希望类之间的继承层次太复杂. 一般我们不希望出现超过三层的继承关系. 如果继承层次太多, 就需要考虑对代码进行重构了。如果想从语法上进行限制继承, 就可以使用 final 关键字。


11. final关键字



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

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


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


(2)修饰类:表示此类不能被继承


    final public class Animal {
                        ...
                }
                public class Bird extends Animal {
                        ...
                } // 编译报错,A不能再被继承


(3)修饰方法:表示该方法不能被重写(后序介绍)

 

12.继承和组合



 和继承类似, 组合也是一种表达类之间关系的方式, 也是能够达到代码重用的效果。组合并没有涉及到特殊的语法(诸如 extends 这样的关键字), 仅仅是将一个类的实例作为另外一个类的字段。继承表示对象之间是is-a的关系,比如:狗是动物,猫是动物,组合表示对象之间是has-a的关系,比如:汽车。


21932ec191e844b79fb92cffdb85368f.pngR-C.gif


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


// 轮胎类
class Tire{
        // ...
}
// 发动机类
class Engine{
        // ...
}
// 车载系统类
class VehicleSystem{
        // ...
}
class Car{
        private Tire tire;         // 可以复用轮胎中的属性和方法
        private Engine engine;         // 可以复用发动机中的属性和方法
        private VehicleSystem vs;         // 可以复用车载系统中的属性和方法
        //...
}
//奔驰是汽车
class Benz extend Car{
        // 将汽车中包含的:轮胎、发送机、车载系统全部继承下来
}


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

目录
相关文章
|
2月前
|
Java 程序员
Java中的继承和多态:理解面向对象编程的核心概念
【8月更文挑战第22天】在Java的世界中,继承和多态不仅仅是编程技巧,它们是构建可维护、可扩展软件架构的基石。通过本文,我们将深入探讨这两个概念,并揭示它们如何共同作用于面向对象编程(OOP)的实践之中。你将了解继承如何简化代码重用,以及多态如何为程序提供灵活性和扩展性。让我们启程,探索Java语言中这些强大特性的秘密。
|
8天前
|
Java 测试技术 编译器
Java零基础-继承详解!
【10月更文挑战第4天】Java零基础教学篇,手把手实践教学!
16 2
|
29天前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
13天前
|
Java 编译器
在Java中,关于final、static关键字与方法的重写和继承【易错点】
在Java中,关于final、static关键字与方法的重写和继承【易错点】
19 5
|
13天前
|
Java
java继承和多态详解
java继承和多态详解
33 5
|
13天前
|
Java 编译器
【一步一步了解Java系列】:子类继承以及代码块的初始化
【一步一步了解Java系列】:子类继承以及代码块的初始化
18 3
|
1月前
|
Java 编译器
Java——类与对象(继承和多态)
本文介绍了面向对象编程中的继承概念,包括如何避免重复代码、构造方法的调用规则、成员变量的访问以及权限修饰符的使用。文中详细解释了继承与组合的区别,并探讨了多态的概念,包括向上转型、向下转型和方法的重写。此外,还讨论了静态绑定和动态绑定的区别,以及多态带来的优势和弊端。
44 9
Java——类与对象(继承和多态)
|
18天前
|
Java
为什么Java不支持多继承
本文讨论了Java不支持多继承的原因,包括避免菱形继承问题、简化编程语言和防止层次膨胀,同时提供了实现多继承效果的替代方案,如实现多接口、使用组合和继承加接口的方式。
12 0
为什么Java不支持多继承
|
5天前
|
Java 测试技术 编译器
Java零基础-继承详解!
【10月更文挑战第6天】Java零基础教学篇,手把手实践教学!
12 0
|
1月前
|
Java
Java 的继承
在一个森林中,各种动物共存,如狗和猫。为了管理和组织这些动物,我们采用面向对象的方法设计模型。首先创建 `Animal` 超类,包含 `name` 和 `age` 属性及 `makeSound()` 和 `displayInfo()` 方法。接着,通过继承 `Animal` 创建子类 `Dog` 和 `Cat`,重写 `makeSound()` 方法以发出不同的声音。实例化这些子类并使用它们,展示了继承带来的代码重用、扩展性和多态性等优点。这种方式不仅简化了代码,还体现了现实世界的层次结构。