面向对象--封装

一、封装

面向对象编程的3大特点:封装、继承、多态
封装:

  • 就是快递打包封装,装起来,方便使用
  • 把一些东西藏起来不让别人看见

作用:

  • 将代码封装到方法,方便使用,复用
  • 将代码功能增强

类的封装如何实现:

  • 属性私有化
  • 提供对外可以访问的方法来对属性进行设值和取值(即get set 方法)

总结:

  • 属性私有:private
  • 对属性提供set,get方法
  • set方法一定是有参无返回值
  • get方法一定是无参有返回值
  • 且set,get方法固定命名,一定是setXXX,getXXX。即后面一定是属性首字母大写

二、继承(extends)

2.1 继承

继承:子类继承父类,子类就可以使用父类中的东西(属性和方法)

为什么要继承?

  • 有些类中定义的属性,方法有重复 --> 继承就可以减少重复
  • 为多态做准备

如何写?

public class A extends B{

}

以上代码就是继承,A类继承B类,A类是子类,B类是父类。

如何定义父类:

​ 将一些类中共同有的属性和方法向上抽取形成父类 – 即父类更抽象,子类更具体

2.2 继承的特点:

  • 子类继承父类,子类对象可以使用父类中非私有的属性和方法
  • Java支持继承,但是只能单继承

2.3 继承中的属性

父类中有的属性,子类中没有的属性:子类可以直接用父类中的

父类中没有的属性,子类中有的属性:子类 用自己的

父类中有的属性,子类中有与之同名的属性:子类使用自己的属性(就近引用)

2.4 继承中的方法

父类中有的方法,子类中没有的方法:子类可以直接用父类中的

父类中没有的方法,子类中有的方法:子类用自己的

父类中有的方法,子类中有与之同名的方法:子类使用自己的方法–>重写

2.5 继承中的构造方法

构造方法只能被new来调用

  • 会先调用父类的构造方法
  • 初始化父类中的属性
  • 执行父类的构造方法中的内容
  • 再初始化子类的属性
  • 再执行子类构造方法中的内容
  • 将引用赋值给对象

为什么在调用子类构造方法创建子类对象时先调用父类构造方法呢???

  • 是因为每个构造方法的第一行都隐藏一个super()调用父类无参构造方法

三、重写(Override)

重写:也叫覆写或者覆盖

  • 发生在子父类之间的方法的关系
  • 要求子父类的方法访问修饰符 返回值类型,方法名,参数列表完全一致,方法体不一样
  • ​ 父类修饰符可以比子类大一些

注意:Override注解 - 是重写,需与父类所定义方法的完全一致(目前学习)

为什么要重写:父类有方法,但是这个方法子类不适用

ps:重写也是多态的前提

四、super & this

默认的:

super() : 在每个类的每个构造方法第一行都隐藏了一个super()来调用父类无参构造

super代表当前对象的父类对象

在每个构造方法中第一行隐式存在有super()调用父类无参构造
在这里插入图片描述

也可以使用super(实参)来主动调用父类的有参构造
在这里插入图片描述

super:代表父类对象,就可以调用父类属性和方法

super.属性;调用父类属性

super.方法();调用父类方法

​ this & super 对比:

thissuper
代表代表当前对象代表父类对象
构造方法this() 调用自己的super() 调用父类的
this(参数) 调用自己的有参构造super(参数) 调用父类的有参构造
属性this.属性 他自己的属性,自己没有该属性也会调用父类属性super.属性 调用父类属性
方法this.方法() 调用自己的方法,自己没有调用父类方法super.方法() 调用父类方法

五、访问修饰符

访问修饰符

  • 修饰符,就是一些符号
    • public、protected 受保护的、default 默认/不写、private
  • 访问修饰符又叫访问控制符或者权限符,即通过以上这些修饰可以改变访问的权限
当前类内同包不同类不同包子类内不同包不同类
public
protected(保护儿子)子类对象可以访问×
default 缺省××
private×××

访问权限修饰符:public>protected>package>private

六、创建对象的过程

  • 如果有继承,先创建父类,再创建子类
  • 对本类,先属性初始化再执行构造方法内代码

七、final(最终)

  • final修饰类,则此类不能被继承(无子类)
  • final修饰属性(变量),该变量为常量,不能再重新赋值
  • final修饰方法,该方法子类不能被重写,但子类可以使用父类方法 --> super()

八、static(静态修饰符)

static,静态修饰符,可以修饰类(是内部类)、属性、方法

类里面的类 – 内部类

8.1 特点

机制:凡是被static修饰的属性/方法/代码块会随着类加载而初始化,内存只有一个

static修饰的属性和方法,则被该类的所有对象共享

static修饰的属性和方法都可以通过类名调用

8.2 售票案例:

8.2.1 售票案例代码

public class HuangNiu {
    /**
     * 不加static,ticket属性会随着创建对象,每个对象都有100张票
     * 不加static的属性,叫做对象属性(属于对象,归对象特有)
     * 加了static修饰,该属性会被类该的所有对象共享
     * 加了static的属性,叫做类属性(属于类,不属于某个对象)
     */
    static int ticket = 100;
    String name;

    void sell(int num) {
        ticket -= num;
        System.out.println(name + "卖出" + num + "张票");
    }
}

8.2.2 测试案例代码

public class Test {
    public static void main(String[] args) {
        //黄牛1
        HuangNiu huangNiu = new HuangNiu();
        huangNiu.name = "牛1";
        huangNiu.sell(1);
        System.out.println("还剩"+huangNiu.ticket+"张票");

        System.out.println("-------------------");
        //黄牛2
        HuangNiu huangNiu2 = new HuangNiu();
        huangNiu2.name = "牛2";
        huangNiu2.sell(10);
        System.out.println("还剩"+huangNiu2.ticket+"张票");
    }
}

8.2.3 输出结果

没加static输出:
在这里插入图片描述

加static之后输出:
在这里插入图片描述

8.3 static内存图

  • static修饰的属性/方法都会随着类加载而加载且初始化
    • 潜台词:static修饰的属性/方法不用创建对象就已经在内存初始化了
    • 即使没有创建对象,静态修饰的属性/方法也已经出现并初始化了
  • 因为内存位置比较特殊,所有被该类的所有对象共享
    在这里插入图片描述

8.4 应用

1.当某些数据需要被所有对象共享时,给数据(属性或变量)设置static

2.当某些方法需要方法调用时,可以将方法设置静态,这样就是通过类名直接调用,而不用创建对象。

3.static配合final修饰变量为静态变量,也是方法使用

  • 如 Pi(Π 3.14)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Su sir~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值