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{
        // 将汽车中包含的:轮胎、发送机、车载系统全部继承下来
}


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

目录
相关文章
|
3月前
|
Java 程序员
Java中的继承和多态:理解面向对象编程的核心概念
【8月更文挑战第22天】在Java的世界中,继承和多态不仅仅是编程技巧,它们是构建可维护、可扩展软件架构的基石。通过本文,我们将深入探讨这两个概念,并揭示它们如何共同作用于面向对象编程(OOP)的实践之中。你将了解继承如何简化代码重用,以及多态如何为程序提供灵活性和扩展性。让我们启程,探索Java语言中这些强大特性的秘密。
|
14天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
13 3
|
14天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
27 2
|
14天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
27 2
|
14天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
26 1
|
2月前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
25天前
|
Java 测试技术 编译器
Java零基础-继承详解!
【10月更文挑战第4天】Java零基础教学篇,手把手实践教学!
27 2
|
29天前
|
Java 编译器
在Java中,关于final、static关键字与方法的重写和继承【易错点】
在Java中,关于final、static关键字与方法的重写和继承【易错点】
20 5
|
29天前
|
Java
java继承和多态详解
java继承和多态详解
38 5
|
29天前
|
Java 编译器
【一步一步了解Java系列】:子类继承以及代码块的初始化
【一步一步了解Java系列】:子类继承以及代码块的初始化
20 3