public、protect、private在父类子类中使用

本文详细解析了PHP中私有属性的概念及使用方法,通过具体示例展示了子类如何间接修改父类私有属性的过程,并强调了正确使用公共方法的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先贴出一张,直观的、估计大家都见过的关于public、protect、private的范围图

作用域 当前类 同一package 子孙类 其他package
public     T          T     T      T
protect     T          T     T      F
private     T          F     F      F

                              T : true    F : false

 

现在我就挑一个测试和验证一下,其他的都是根据上表可以推出来

 

这三个中,我觉得private算是相对较为复杂的,所以就选private吧!

 

1、子类不能继承和(直接)访问父类的私有属性和方法,

 

            a,如果企图在子类中修改父类的私有属性 $this->variable = val ;
      
复制代码
 1   <?php
 2         class test {
 3              private $variable = 1;
 4              public function setVal($param) {
 5                   $this->variable = $param;
 6              }
 7              public function getVal() {
 8                   return $this->variable;
 9              }
10              private function output() {
11                   echo 1;
12              }
13         }
14     class test2 extends test {
15          public function __construct(){
16           $this->variable =2;
17          }
18     }
19     $obj = new test2();
20     print_r($obj);
21     echo '<br />';
22     echo $obj->variable;
23     //$obj->output();
24     echo '<br />';
25     echo $obj->getVal();
26     echo '<br />';
27     $obj->setVal(3);
28     echo $obj->getVal();
29     echo '<br />';
30     print_r($obj);
31     }
32 ?>                                
复制代码

输出:

   test2 Object ( [variable:test:private] => 1 [variable] => 2 ) 

  2

  1

  3

  test2 Object ( [variable:test:private] => 3 [variable] => 2 )

可以看到,私有属性不能直接修改和覆盖,如果这样写只是给子类定义了一个属性,程序不会报错,只有通过父类给出的接口方法来设置父类的私有属性。
            b,或者企图覆盖父类的的私有属性 private variable = val;
            程序会报错,例如:
复制代码
 1  <?php
 2                        class test {
 3  private $variable = 1;
 4  public function setVal($param) {
 5   $this->variable = $param;
 6  }
 7  public function getVal() {
 8   return $this->variable;
 9  }
10  private function output() {
11   echo 1;
12  }
13 }
14 class test2 extends test {
15  public function __construct(){
16   //$this->variable =2;
17   private $variable = 2;
18  }
19 }
20 $obj = new test2();
21 print_r($obj);
22 echo '<br />';
23 echo $obj->variable;
24 //$obj->output();
25 echo '<br />';
26 echo $obj->getVal();
27 echo '<br />';
28 $obj->setVal(3);
29 echo $obj->getVal();
30 echo '<br />';
31 print_r($obj);
32                     ?>
复制代码
   报错:
                    Parse error: syntax error, unexpected T_PRIVATE in D:\WWW\smarty_3\index.php on line 19
2、如果子类需要修改父类中的私有属性,必须在父类中提供修改的接口,也就是修改熟悉的公共方法
  
复制代码
    <?php
                        class test {
 private $variable = 1;
 public function setVal($param) {
  $this->variable = $param;
 }
 public function getVal() {
  return $this->variable;
 }
 private function output() {
  echo 1;
 }
}
class test2 extends test {
 public function __construct(){
  $this->variable =2;
 }
}
$obj = new test2();
print_r($obj);

$obj->setVal(3);
echo $obj->getVal();
echo '<br />';
print_r($obj);
}
                    ?>
复制代码

  上班零时整理,结果还华丽丽的被领导看到了,尴尬死我了,格式没太顾得上,哎、、、、

 
 
 
 
 
 

 

A dwarf on a giant's shoulder sees the farther of the two. 站在巨人肩上的矮子看得比巨人远。 --A dwarf on a giant's shoulders
<think>嗯,用户想了解Java中publicprivateprotected访问修饰符的区别。我之前处理过似的问题,记得有四个访问修饰符,但用户只问了三个,可能漏掉了默认的default。不过根据引用内容,用户提供的参考资料里确实提到了四个,包括default。所以回答的时候需要明确说明这四个,但用户的问题里只提到了三个,可能需要先确认用户是否需要包括default,不过根据引用中的信息,用户可能已经知道,或者可能误以为default不算修饰符。根据引用[3]和[4],default是存在的,但用户的问题里没有提到,但用户的问题可能只是简化了,所以回答时应该包括四个,但重点放在用户提到的三个,同时说明default的情况。 接下来,我需要整理每个修饰符的作用范围和区别。根据引用[3],private只能在同一个内可见,default(即不写修饰符)在同一个包内可见,protected在同一个包和子类中可见,public对所有可见。引用[4]提到protected对子类公开,对不在同一包且无父子关系的私有。需要把这些信息结构化,可能用表格比较清晰。 然后,用户可能需要具体的例子来理解不同修饰符的应用场景。比如,private用于封装内部数据,public用于对外接口,protected用于允许子类访问,default用于包内共享。需要举实际的代码例子,比如的成员变量用private,方法用publicprotected方法在子类中重写等。 另外,用户提供的引用中有提到面试中应该如何回答,比如分层次从privatepublic逐步展开,这样逻辑更清晰。所以在回答时,应该按照从最严格到最宽松的顺序,即private → default → protected → public,这样结构更合理。 还需要注意用户可能存在的误区,比如认为protected可以在不同包的任意访问,但实际上只能在子类中访问,即使在不同包。引用[4]提到这一点,需要强调。 最后,生成相关问题的时候,要考虑常见的面试问题,比如应用场景、设计封装的原因、默认修饰符的作用等。确保问题与访问修饰符的实际使用相关,帮助用户深入理解。</think>### Java访问修饰符publicprivateprotected的区别 Java中访问修饰符用于控制、方法、变量的可见性和访问范围,主要分为以下四种(包括默认修饰符): #### 1. **访问范围对比** | 修饰符 | 同 | 同包 | 子类(同包) | 子类(不同包) | 其他包 | 适用对象 | |------------|------|------|--------------|----------------|--------|------------------------| | `private` | ✔️ | ❌ | ❌ | ❌ | ❌ | 变量、方法 | | `default` | ✔️ | ✔️ | ✔️ | ❌ | ❌ | 、接口、变量、方法 | | `protected`| ✔️ | ✔️ | ✔️ | ✔️(需继承) | ❌ | 变量、方法 | | `public` | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | 、接口、变量、方法 | #### 2. **核心区别** - **`private`** 仅限当前内部访问,常用于**封装敏感数据**或**隐藏实现细节**。 ```java public class User { private String password; // 外部无法直接访问 } ``` - **`default`(不显式声明)** 允许同一包内的访问,但禁止跨包访问。适用于**包内组件协作**的场景[^4]。 ```java class Logger { // 默认修饰符,仅同包可见 void log(String message) { /*...*/ } } ``` - **`protected`** 允许同一包内的访问,且不同包的子类可通过继承访问。常用于**父类提供可扩展方法**。 ```java public class Animal { protected void breathe() { /* 子类可重写或调用 */ } } ``` - **`public`** 全局可见,适用于**对外暴露的接口**或**常量**。 ```java public class Constants { public static final double PI = 3.14159; } ``` #### 3. **实际应用原则** - **封装性**:优先使用最严格的访问权限(如`private`),仅暴露必要接口(`public`方法)[^2]。 - **继承设计**:`protected`修饰符平衡了父类子类的耦合性。 - **模块化**:通过`default`实现包内高内聚,减少跨包依赖。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值