封装和继承

本文详细介绍了面向对象编程中的封装、继承和访问修饰符的概念及应用。封装通过private关键字实现属性和方法的私有化,提供getter/setter方法确保数据安全。继承允许子类继承父类的属性和方法,减少代码冗余。访问修饰符如private、default、protected和public控制成员的访问范围。此外,还讨论了super关键字在子类中调用父类成员的作用以及方法重写的原则。

封装和继承

private - 私有化

含义:私有化

作用:

  1. 修饰属性:私有化属性,不能让外界访问
  2. 修饰方法:私有化方法,不能让外界使用

应用场景:只能在本类中才能访问,不让外界访问的属性和方法,就用private修饰

封装

步骤:

  1. 私有化属性
  2. 添加 get (获取) / set (设置) 方法

好处:外界不能直接操作属性,必须通过get、set方法操作,提高代码的安全性,可以在get、set方法中添加其他的功能

this

含义:代表本对象。出现在方法中,表示调用该方法的对象

作用:

  1. this.属性:调用本对象的成员变量
  2. this.方法:调用本对象的成员方法
  3. this():调用本对象的构造方法(在一个构造方法中的第一句调用另外一个构造方法)

分包

基本作用:解决了类重名的问题

项目作用:项目中有许多的类,把功能相同的类放在同一个包中,方便管理

工具类:com.dream.util/tool

实体类:com.dream.vo/bean/entity

数据库类:com.dream.dao/mapper

static 关键字

作用
  1. 修饰属性

​ 类加载到方法区时,JVM会扫描该类的所有属性,并把静态属性加载到静态区中,静态属性属于类属性,该类所有的对象都共享该属性,静态属性直到项目结束时才会被回收

​ 注意:静态属性使用类名调用

  1. 修饰方法

    属于类方法,直接用类名调用

    应用场景:工具类

  2. 静态代码块
    1. 静态代码块是类加载到方法区时才会被调用,将类中的静态变量加载到静态区,该代码块只能初始化静态变量。
    2. 代码块是创建对象时优先于构造方法调用,该代码块可以初始化成员变量和静态变量。
    3. 构造方法是创建对象时调用,该方法可以初始化成员变量和静态变量

成员变量 vs 静态变量

成员变量:属于对象的变量,每个对象独享一份

静态变量:属于类的变量,所有对象都共享一份

静态方法

​ 含义:静态方法属于类的方法,直接用类名调用
​ 应用场景:工具类

静态代码块:类加载到方法区时调用

​ 可以初始化静态变量

public class A {
	String str1;
	static String str2;	

	static{
		str2 = "yyy";//A.str2
		System.out.println("A的静态代码块");
	}
    
}
代码块:创建对象时优先于构造方法调用

​ 可以初始化静态变量、成员变量

	{
		str1 = "xxx";//this.str1
		str2 = "yyy";//A.str2
		System.out.println("A的代码块");
	}
构造方法:创建对象时调用

​ 可以初始化静态变量、成员变量

public A() {
		
		str1 = "xxx";//this.str1
		str2 = "yyy";//A.str2
		System.out.println("A的构造方法");
	}

继承

概念:子类继承父类的属性和方法

好处:减少代码冗余

应用场景:多个类中,有相同的属性和方法,就抽取出来放在父类中

深入理解继承
1.创建子类对象,会调用父类构造方法吗?2.创建子类对象,先调用父类构造方法还是先调用子类构造方法?
	先调用子类构造方法
3.创建子类对象,先完成父类构造方法还是先完成子类构造方法?
	先完成父类构造方法
4.创建子类对象,会创建父类对象吗?
	不会
5.创建子类对象,调用父类构造方法的目的是什么?
	目的是在子类对象中开辟空间用于存放父类的属性
6.子类可以继承父类的私有化属性和方法吗?
	可以继承,但是不可以直接调用,但可以在父类中设置公有的方法,在公有的方法中调用私有的属性和方法,即间接调用。
    
public static void main(String[] args) {
		B b = new B();
		b.aMethod02();
	}

public class A {
	String aAtrr;
	//父类私有化属性
	private String a = "xxx";
  
	public A() {
		System.out.println("父类的构造方法");
	}
	//父类私有化方法
	private void aMethod01(){
		System.out.println("父类私有化方法");
	}
	
	public void aMethod02(){
		System.out.println(a);
		aMethod01();
	}
}

public class B extends A{
	String bAtrr;

	public B() {
		//super();//调用父类无参构造,默认实现
		System.out.println("子类的构造方法");
	}
}

super 关键字

super: 代表父类

作用在子类中:

​ 1.super.成员变量:调用父类的非私有化成员变量
​ 2.super.成员方法:调用父类的非私有化成员方法
​ 3.super():调用父类的非私有化构造方法
​ 注意:在子类的构造方法中必须是第一句就调用父类的构造方法

public class A {
	String str;
	
	public A() {
	}
	
	public void aMethod(){
		System.out.println("A类的方法");
	}
}

public class B extends A{
	
	public B() {
		//调用父类的非私有化构造方法
		super();
	}

	public void method(){
		
		//调用父类的非私有化属性
		super.str = "xxx";
		//调用父类的非私有化方法
		super.aMethod();
	}
}

方法重写(复写)

应用场景:父类的方法不满足子类需求时,可在子类中重写

条件:

​ 1.方法重写的位置在子类中

​ 2.重写方法的 返回值、方法名、参数列表都必须和父类的方法一致

​ 3.访问修饰符不能比父类更严格

//@Override - 注解:既解释给程序员也解释给程序,告诉程序这个方法是重写父类的方法
	@Override
	public void eat() {
		System.out.println(super.getName() + "正在吃午饭...");
	}

访问修饰符

含义:修饰属性、方法,用于定义变量的使用范围

使用权限高—>低 (private–>public)

访问修饰符本类本包其他包的子类其他包
privateOK
默认的(default)OKOK
protectedOKOKOK
publicOKOKOKOK
<think> 我们正在讨论封装继承的区别。根据引用[^1][^2][^3][^4][^5],封装继承是面向对象编程的两大基本特征,它们有不同的目的实现方式。 封装(Encapsulation)的核心是隐藏对象的内部状态实现细节,仅通过公开的接口(方法)与外界交互。这样可以提高代码的安全性可维护性。例如,在Java中,我们可以使用private关键字来修饰属性,然后提供public的gettersetter方法来访问修改这些属性(如引用[^4]所示)。 继承(Inheritance)则是子类继承父类的特征行为,使得子类具有父类的属性方法,同时还可以添加自己特有的属性方法。继承体现了类与类之间的层次关系,支持代码的重用扩展(如引用[^2]所述)。 具体区别如下: 1. **目的不同**: - 封装是为了隐藏内部实现细节,保护数据完整性,降低模块间的耦合度[^1][^3]。 - 继承是为了实现代码的复用扩展,建立类之间的层次关系(父类与子类)[^2]。 2. **实现方式不同**: - 封装通过访问修饰符(如private, protected, public)来实现,通常结合gettersetter方法[^4]。 - 继承通过关键字(如Java的`extends`)来实现,子类自动拥有父类的非私有成员(属性方法)[^2]。 3. **关系不同**: - 封装主要关注一个类内部的实现,将数据与操作数据的方法绑定在一起[^3]。 - 继承关注类与类之间的关系,是多个类之间的纵向联系(从一般到特殊)[^2]。 4. **代码示例对比**: - 封装示例(引用[^4]): ```java class Student { private String name; // 私有属性,封装 public void setName(String name) { // 公开方法设置name this.name = name; } public String getName() { // 公开方法获取name return this.name; } } ``` - 继承示例(引用[^2]): ```java class Animal { // 父类 void eat() { System.out.println("Animal is eating"); } } class Dog extends Animal { // 子类继承父类 void bark() { System.out.println("Dog is barking"); } } ``` 5. **设计原则**: - 封装符合“信息隐藏”原则,强调对象内部状态的保护[^3][^5]。 - 继承符合“is-a”关系(例如:Dog is an Animal),强调代码重用层次化设计[^2]。 总结: 封装继承是面向对象编程中相辅相成的两个概念,但它们解决的问题不同。封装着重于内部细节的隐藏,而继承着重于类之间的关系代码复用。 §§相关问题§§ 1. 封装如何提高代码的安全性? 2. 继承可能带来什么问题? 3. 多态与封装继承有什么关系? </think> ### 封装继承的区别 封装继承是面向对象编程的两大核心特征,它们从不同维度解决代码组织问题,主要区别如下: #### 1. **核心目的不同** - **封装**:隐藏对象内部实现细节,仅暴露可控的接口 ```java class BankAccount { private double balance; // 私有属性(封装) public void deposit(double amount) { // 公开接口 if (amount > 0) this.balance += amount; } public double getBalance() { // 受控访问 return this.balance; } } ``` 通过私有化`balance`属性,外部只能通过`deposit()``getBalance()`方法操作数据,确保数据安全性[^3][^4]。 - **继承**:建立类之间的层级关系,实现代码复用 ```java class Animal { // 父类 void breathe() { System.out.println("呼吸中..."); } } class Fish extends Animal { // 子类继承 void swim() { System.out.println("游泳中..."); } } ``` `Fish`自动获得`breathe()`方法,无需重复实现[^2]。 #### 2. **实现机制对比** | 特性 | 封装 | 继承 | |--------------|--------------------------------|-------------------------------| | **访问控制** | 使用`private/protected`修饰属性 | 使用`extends`关键字建立关系 | | **代码焦点** | 单个类的内部实现 | 多个类之间的层级关系 | | **典型操作** | 定义getter/setter方法 | 重写父类方法(`@Override`) | | **核心原则** | 信息隐藏 | 代码复用与扩展 | #### 3. **解决的问题不同** - **封装的核心价值** - 防止非法数据修改(如余额不能为负数) - 降低模块耦合度(修改内部实现不影响外部调用) - 符合"高内聚,低耦合"设计原则[^1][^4] - **继承的核心价值** - 避免重复代码(子类复用父类逻辑) - 支持多态特性(父类引用指向子类对象) - 构建类层次体系(如`Animal→Mammal→Dog`)[^2][^5] #### 4. **实际应用场景** - **使用封装的场景** ```java class User { private String password; // 敏感数据必须封装 public void setPassword(String pwd) { if (isValidPassword(pwd)) this.password = encrypt(pwd); } } ``` - **使用继承的场景** ```java abstract class Shape { // 父类定义公共接口 abstract double area(); } class Circle extends Shape { // 子类实现差异化 double area() { return Math.PI * radius * radius; } } ``` ### 关键区别总结 | 维度 | 封装 | 继承 | |------------|-------------------------------|-------------------------------| | **目标** | 保护数据完整性 | 建立类层级关系 | | **范围** | 作用于单个类内部 | 作用于多个类之间 | | **关键词** | `private`/`protected`/getter | `extends`/`implements` | | **风险** | 过度封装导致冗余代码 | 深度继承破坏封装性[^1][^3] | > 封装是"内向"的自我保护机制,继承是"外向"的层级扩展机制。实践中常结合使用: > ```java > class SecureLogger extends Logger { // 继承 > private String encryptionKey; // 封装 > public void log(String msg) { > super.log(encrypt(msg)); // 复用+增强 > } > } > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值