首页 > 编程语言 >Java继承机制深度解析:细探private与protected权限控制

Java继承机制深度解析:细探private与protected权限控制

时间:2024-10-20 11:47:47浏览次数:9  
标签:Java String 子类 void Dog private 细探 Animal public

privateprotected 是 Java 中的两种访问修饰符,用于控制类成员(字段和方法)的访问权限。它们在设计类和实现封装、继承多态性方面具有重要作用。下面详细说明它们的区别和含义。

1. private 修饰符
  • 含义

    • private 修饰的成员(字段或方法)只能在定义它们的类内部访问。
    • 其他类,包括继承该类的子类,无法直接访问这些成员。
  • 使用场景

    • 用于封装类的内部实现细节,确保类的状态和行为不会被外部类或子类随意访问或修改。
    • 常用于保护敏感数据和防止类的内部结构被外部代码破坏。
  • 示例

    class Example {
        private int secretNumber;  // 私有字段
    
        public Example(int number) {
            this.secretNumber = number;
        }
    
        private void displaySecret() {  // 私有方法
            System.out.println("Secret number is: " + secretNumber);
        }
    
        public void reveal() {
            displaySecret();  // 在本类内调用私有方法
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Example example = new Example(42);
            example.reveal();  // 正常调用
            // example.secretNumber;  // 编译错误:无法访问私有字段
            // example.displaySecret();  // 编译错误:无法访问私有方法
        }
    }
    
2. protected 修饰符
  • 含义

    • protected 修饰的成员可以在以下情况下访问:
      • 定义它们的类内部访问。
      • 同一包中的其他类访问。
      • 任何子类(无论它们是否在同一包中)访问。
  • 使用场景

    • 当你希望某些类成员在继承体系中可见,但又不希望它们公之于众时,可以使用 protected
    • 常用于基类与子类之间的共享数据或方法。
  • 示例

    class Animal {
        protected String species;  // 受保护字段
    
        protected void displaySpecies() {  // 受保护方法
            System.out.println("Species is: " + species);
        }
    }
    
    class Dog extends Animal {
        public Dog(String species) {
            this.species = species;  // 子类可以访问受保护字段
        }
        
        public void bark() {
            System.out.println("Dog barks");
        }
    
        public void show() {
            displaySpecies();  // 子类可以调用受保护方法
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Dog dog = new Dog("Canine");
            dog.show();  // 输出: Species is: Canine
            // dog.species;  // 编译错误:无法访问受保护字段(如果在不同包下)
        }
    }
    
3. privateprotected 的主要区别
特性privateprotected
访问范围仅在定义它的类内部在定义它的类、同一包中的类和所有子类中访问
子类访问不可访问可以访问
包外类访问不可访问不可访问(除非是子类)
目的数据封装和保护类继承与共享
4. 总结
  • private 修饰符用于保护类的实现细节,防止外部类或甚至子类访问,强调信息隐藏和封装。
  • protected 修饰符允许在继承层次中共享,提供了比 private 更宽松的可见性,便于子类与父类之间的交互。

在实际编程中,根据自己的需求选择合适的访问修饰符,可以有效地管理类的接口和内部实现,增强代码的可读性和可维护性。

5. 快速掌握继承

下面提供一份简洁的JAVA代码,全面地介绍类的继承,看完理解基本能掌握继承:

public class demo06 {
  public static void main(String[] args) {
      // 创建 Dog 对象
      Dog dog = new Dog("Buddy", 3, "Canine", "Golden Retriever");
      dog.speak();  // 输出: Dog barks
      dog.eat();    // 输出: Animal eats
      dog.fetch();  // 输出: Dog fetches
      dog.showInfo();  // 输出: Name: Buddy, Age: 3, Species: Canine, Breed: Golden Retriever

      // 创建 Cat 对象
      Cat cat = new Cat("Whiskers", 2, "Feline", "Black");
      cat.speak();  // 输出: Cat meows
      cat.eat();    // 输出: Animal eats
      cat.scratch();  // 输出: Cat scratches
      cat.showInfo();  // 输出: Name: Whiskers, Age: 2, Species: Feline, Color: Black

      // 多态性:使用父类引用指向子类对象
      Animal animal1 = new Dog("Max", 4, "Canine", "German Shepherd");
      Animal animal2 = new Cat("Mittens", 1, "Feline", "White");

      animal1.speak();  // 输出: Dog barks
      animal2.speak();  // 输出: Cat meows

      // 不能直接访问父类的私有字段,但可以通过 Getter 方法访问
      System.out.println("Dog's name: " + animal1.getName());  // 输出: Dog's name: Max
      System.out.println("Cat's age: " + animal2.getAge());  // 输出: Cat's age: 1
  }
}

// 定义父类 Animal
class Animal {
  // 父类的私有字段
  private String name;
  private int age;

  // 父类的受保护字段
  protected String species;

  // 构造函数
  public Animal(String name, int age, String species) {
      this.name = name;
      this.age = age;
      this.species = species;
  }

  // 父类的方法
  public void speak() {
      System.out.println("Animal speaks");
  }

  public void eat() {
      System.out.println("Animal eats");
  }

  public void sleep() {
      System.out.println("Animal sleeps");
  }

  // Getter 方法用于访问私有字段
  public String getName() {
      return name;
  }

  public int getAge() {
      return age;
  }

  // 受保护的方法
  protected void displayInfo() {
      System.out.println("Name: " + name + ", Age: " + age + ", Species: " + species);
  }
}

// 子类 Dog,继承自 Animal
class Dog extends Animal {
  // 子类的额外字段
  private String breed;

  // 子类的构造函数
  public Dog(String name, int age, String species, String breed) {
      super(name, age, species);  // 调用父类构造函数
      this.breed = breed;
  }

  // 子类覆盖父类的方法
  @Override
  public void speak() {
      System.out.println("Dog barks");
  }

  // 子类的新方法
  public void fetch() {
      System.out.println("Dog fetches");
  }

  // 子类使用受保护的方法
  public void showInfo() {
      displayInfo();  // 调用父类的受保护方法
      System.out.println("Breed: " + breed);
  }
}

// 子类 Cat,继承自 Animal
class Cat extends Animal {
  // 子类的额外字段
  private String color;

  // 子类的构造函数
  public Cat(String name, int age, String species, String color) {
      super(name, age, species);  // 调用父类构造函数
      this.color = color;
  }

  // 子类覆盖父类的方法
  @Override
  public void speak() {
      System.out.println("Cat meows");
  }

  // 子类的新方法
  public void scratch() {
      System.out.println("Cat scratches");
  }

  // 子类使用受保护的方法
  public void showInfo() {
      displayInfo();  // 调用父类的受保护方法
      System.out.println("Color: " + color);
  }
}

标签:Java,String,子类,void,Dog,private,细探,Animal,public
From: https://blog.csdn.net/Kg2813026978/article/details/143090599

相关文章

  • 码城|挑战中,Java面试题复习第3天,坚持就是胜利【悟空非空也】
     ......
  • java计算机毕业设计在线学习系统设计与实现(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着信息技术的迅猛发展,互联网已经深入到社会的各个角落。在教育领域,传统的教学模式受到了前所未有的挑战与机遇。传统教学往往受限于时间和空间......
  • java计算机毕业设计基于JavaEE的空竹传统文化交流平台(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着现代社会的快速发展,传统文化的传承面临着诸多挑战。在全球化和现代化的进程中,传统文化逐渐被边缘化,部分传统文化甚至面临失传的危险。空竹作......
  • Java之集合介绍
    一、Java集合概述Java集合框架(JavaCollectionsFramework)是Java提供的一套用于存储和操作数据的接口、实现类和算法的统一架构。它大大简化了数据处理的复杂性,提高了代码的可重用性和效率。集合框架主要由几个核心接口组成,每个接口定义了一组操作和行为,具体实现类则提供了......
  • [Java基础] 集合框架
    往期回顾[Java基础]基本数据类型[Java基础]运算符[Java基础]流程控制[Java基础]面向对象编程[Java基础]集合框架[Java基础]输入输出流[Java基础]异常处理机制[Java基础]Lambda表达式目录List接口数据结构最佳实践实战代码Set接口数据结构最佳实践......
  • Java中的锁 -- 开篇
    Java中的锁1.顶级接口LockJavaSE5之后并发包中新增了Lock接口,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式地获取和释放锁。虽然它缺少了隐式获取释放锁的便捷性,但是却拥有了锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种synchronized关......
  • springboot基于java的OA管理系统(源码+文档+调试+vue+前后端分离)
    收藏关注不迷路!!......
  • javascript输出金字塔
    <script>//首先创造一个空的变量letstr=''letlevel=prompt("输入金字塔的层数")//获取输入的纯数字,其余情况都转化为NaNlevel=parseInt(level)&&Number(level)//判断用户的输入是否合法if(isNaN(level)){alert("金字塔的数......
  • 详解Java之lambda
    目录lambda引入语法函数式接口lambda表达式的使用语法精简:代码示例:变量捕获局部变量捕获成员变量捕获lambda在集合中的使用lambda的优缺点lambda引入Lambda表达式是JavaSE8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。lambda表达......
  • 测开必备-java基础-for循环语句的用法
    什么是for循环?for循环的基本结构什么是for循环?for循环是一种编程中的控制结构,它允许你重复执行一段代码固定的次数。当你需要执行一系列重复的任务时,for循环就非常有用。for循环的基本结构在Java中,for循环的基本结构如下:for (初始化表达式; 循环条件; 步进表达式) {  ......