Java面向对象----封装、继承

本文深入解析Java的封装和继承两大核心概念,探讨如何通过封装保护类的内部状态,以及继承如何提升代码复用性。文章详细介绍了封装的语法、步骤及应用场景,同时讲解了继承的语法、限制及特点,帮助读者掌握Java面向对象编程的关键技巧。

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

一、 封装:

  • 概念:将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来对隐藏的信息进行操作和访问。

    • 现实生活中封装概念的引入:
      • 1.包装 :快递 :打包
      • 2.台式机电脑:机箱[ 主板 显卡 内存 电源 硬盘。。。]
  • 优点:

    1. 良好的封装能够减少耦合。

    2. 类内部的结构可以自由修改。

    3. 可以对成员变量进行更精确的控制。

    4. 隐藏信息,实现细节。

1. 语法:

public class 类名{
			private 字段;//私有化
			private boolean sex;
			public void setSex(boolean sex){
				this.sex = sex;
			}
			public boolean isSex(){
				return this.sex;
			}

			public void setXxx(数据类型 变量名){
				this.字段 = 变量名;
			}
			public boolean getXxx(){
				return this.字段;
			}

			类名(){}
		}

2. 步骤:标准javabean

  • 1.私有化字段 ==》Private修饰类中的字段
  • 2.给字段提供setter(赋值方法) getter(取值方法)方法
    如果有boolean字段,就将getXxx()替换成 isXxx();
  • 3.提供无参构造
  • 4.public 修饰类

3. 对象的赋值和取值

  • 赋值:
    • 1.对象名.字段名 = 值; 不推荐,因为一般我们写的类都是用Private修饰字段
    • 2.有参构造(…);(只能够创建对象的时候赋初始值;)推荐
    • 3.set(…);推荐
  • 取值:
    • 1.对象名.字段名;不推荐,因为一般我们写的类都是用Private修饰字段
    • 2.get();推荐

4. this: 指代当前对象,就是该对象的地址

  • 即谁创建就是指代谁,哪个对象调用有this的方法就是指代哪个对象
    • 1 解决局部变量和成员变量的二义性 ----》get set 方法中的应用[在get/set可以写this]

    • 2.本类中构造方法之间的相互调用,但是必须是构造方法内的第一句 => 不会创建新的对象
      根据具体的需求写几个构造器

class Student{
		int age;
		String name;
		Student(){}//无参构造
		Student(String name){
			this();//表示调用当前对象自己的构造 作用:1.代码复用 2. 避免调用父类构造器
			this.name = name;
			//this(name,17);this调用构造方法的时候只能在另一个构造方法的第一句
		}

		Student(String name,int age){
			//this(name);//表示调用当前对象自己的构造 作用:1.代码复用 
			this.name = name;
			this.age = age;
		}
	}
  • 3.作为返回值返回 : this持有对象地址,表示该类的一个对象即是一个数据
  • 4.作为参数传递

二. 继承

  • 概念:继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
  • 好处 : 提高了代码的复用性

1. 语法:

设计类的时候

子类名 extends 父类
		class A{
		}
		class B extends A{
		}
	前提:不能有final修饰的父类

2. 能继承的元素

  • 1.非私有的字段和普通方法

3. 不能继承:

  • 私有的字段和普通方法
  • 构造方法

4. Java中类的继承特点:

  • 1.Java中类的继承只能够是单继承
  • 2.可以支持多重继承
示例:
class A{}
class B extends A{}
class C extends B{}
class D extends C{}
C 是D的直接父类;
A B 都是D的间接父类
  • 3.每一个类都有一个直接父类,如果没有看到显示的继承代码,
    那么就隐式继承就Object(顶级父类)

5. Object

  • 类 Object 是类层次结构的根类,每个类都使用 Object 作为超类。(和接口没有关系)

  • 所有对象(包括数组)都实现这个类的方法 : 所有的对象都可以调用到Object中的方法;

  • 1.toString();返回当前对象的字符串形式
    如果打印对象不满足需求就要重写toSting()方法

  • 2.equals(Object obj);
    判断当前对象和obj是否"相等",默认是==比较,所以一般情况下,以后都要重写该方法

  • 3.hashCode();
    返回当前对象的hash值int类型

  • 4.Class getClass();
    返回当前对象的运行时类,比如:如果是Student类型的对象,调用该方法,返回的就是Student类型

  • hash值相等,equals比较是否相等?

    • equal比较相等,hash值比较是否相等?在实际开发中,只要是equals比较相等,hash值也相等

6.继承关键字

  • 继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。
  • extends关键字
    • 在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。
  • implements关键字
    • 使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
  • super 与 this 关键字
    • super关键字:
      • 我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。super 表示父类对象;
      • super(); 调用父类无参数的构造方法;
      • 必须是子类的构造方法中的第一句
    • this关键字:指向自己的引用。
  • final
    • final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:

构造器

  • 子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。

  • 如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

6. == 和 equals区别(重点)

== 和 equals 都是比较是否相等,请问它们到底有什么区别呢?

相等 :  a 传统的理解一般都是数字值是否相等;
        b 在程序中任何东西都是数据,都会比较是否相等
  • 1.==
    • 基本数据类型: 比较的就是值是否相等;
    • 引用数据类型: 比较的是对象的地址是否一样;(排除特殊 String)
  • 2.equals (最初定义在根类Object中的)只能用于引用类型
    • 基本数据类型 : 不能够使用! 基本数据类型不是对象,不能够调用Object中的方法
    • 引用数据类型 : 在Object的源码中定义的就是== 进行比较比较
    • 如果我们没有去覆写过equals方法而是直接调用到了Object中的此方法,那么结果和== 比较应用数据类型一样的;
  • 在实际开发中,我们一般比较对象都是通过对象的属性值进行比较(一般比较对象的地址没有多大用处),所以我们会经常覆写Object中的此方法,把自己的规则写在方法里面;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值