面向对象编程三大特性—封装、继承和多态

目录

一、封装

1.概念

2.private实现属性封装

3.封装的作用

4.其他

二、继承

1.概念

2.protected—继承访问权限

1)作用域

2)四大访问权限比较

3.继承语法

4.调用父类的有参构造

1)super关键字

2)this关键字

3)super vs this

5.对象的实例化流程

三、向上转型和向下转型

1.概念

类和对象的声明(3种情况)

2.向上转型(90%)

1)作用

2)向上转型一共发生在三个地方

3)方法重写/覆写override

4)方法重写 vs 方法重载

3.向下转型

1)什么时候需要向下转型(意义)

2)向下转型有风险

3)instanceof关键字—规避类型转换异常的错误

四、final关键字(终结器)

1.final修饰属性,表示该属性为常量,值不能修改

2.final修饰类,表示该类不能有子类(即无法被继承)

3.final修饰方法,表示该方法无法被重写

4.final+static修饰常量

五、多态

1.概念

2.分类

3.实现多态的条件

4.多态的好处


一、封装

1.概念

        封装是将代码隐藏起来,仅仅暴露一个访问接口来使用,在操作上使用get/set方法。即将方法和属性写到同一个类中,并将属性私有化,生成get/set方法,外部访问属性需要通过get和set方法,内部可以直接访问属性,这样的一个类我们认为它完成了封装。

2.private实现属性封装

        一个属性被private修饰,该属性只在类的内部可见,出了该类无法使用,不能直接通过对象访问(继承的类也不行)

        阿里编码规约:类中无特殊说明,所有的成员变量统一使用private(99%)封装,此时调用者无法直接调用。若要继续取得,设置操作private属性,直接调用类提供的getter/setter方法修改private修饰的内容。

public class Test {

    public static void main(String[] args) {
        card cd=new card();
        System.out.println(cd.getPassword());
        System.out.println(cd.getCardNumber());

    }

}
import java.util.Scanner;

public class card {
    private int cardNumber=123456;
    private String password="123456789";
    private double sal;//余额

    public int getCardNumber() {
        return cardNumber;
    }

    public String getPassword() {
        return password;
    }

    public double getSal(String pass) {
        if(pass.equals(password))
        return sal;
        else{
            System.out.println("密码错误,请查证后再试");
        }
        return -1.0;
    }

    public void setPassword(String pass) {
        if(pass==password){
            System.out.println("密码正确,可以修改密码");
            Scanner sc=new Scanner(System.in);
            String newPassword=sc.next();
            password=newPassword;
        } else{
            System.out.println("密码不正确,无法修改");
        }
    }
}

3.封装的作用

保护性+易用性

1)提高程序安全性,保护数据,防止代码数据在无意中被破坏

2)隐藏代码实现细节,只要接口不变,内容的修改不会影响到外部的调用者(方法封装)

3)统一接口,保护类中的成员,不让类以外的程序直接访问或修改,只能通过提供的公共接口访问(数据封装)

4)系统可维护性大大增加,外部不能直接访问对象的属性,只能通过该属性对应的公有方法访问

  1. 提高程序的安全性,保护数据:保护或防止代码(数据)在无意中被破坏。保护类中的成员,不让类以外的程序直接访问或修改,只能通过提供的公共接口访问(数据封装)
  2. 隐藏代码的实现细节
  3. 统一接口
  4. 系统可维护性大大增加

4.其他

1)private不能修饰外部类(内部类可以):因为类定义就是为了产生对象

2)static不能修饰外部类:因为statuc是无对象可用,类的作用是产生对象,矛盾

二、继承

1.概念

        继承是面向对象语言中一个代码复用的机制,简单说就是子类继承了父类中的非私有属性和可以继承的方法,然后子类可以继续扩展自己的属性及方法

        继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为,一个子类只能继承一个父类,但是可以多重继承,一个父类可以拥有多个子类。如某类B“继承”某类A,就把这个B称为“A的子类或派生类(subclass)”,而把类A称为“B的父类”也可以称为“A是B的超类或基类(superclass)”。

2.protected—继承访问权限

一旦一个属性和方法被protected修饰,此时该属性和方法可以被子类使用【让子类可见】

1)作用域

在不同包的具有继承关系的子类中可见

eg:animal包下有animal类。zoo包下有dog类,dog是animal的子类,dog仍可访问animal,使用animal中的name,age,food等

2)四大访问权限比较

private<default<protected<public

default:包访问权限-同一包下同级目录可见【即同级目录的不同类可见】

protected:不同包有继承关系的类可见【同一包没有关系的类也可见(即包含default可以实现的内容但比default多了另外可以访问的空间),但并没有实际用处。】

3.继承语法

子类 extends 父类

public class Test {
    public static void main(String[] args) {
        Dog dog=new Dog();
        dog.name="狗狗";
        dog.eat("狗粮");
        Cat cat=new Cat();
        cat.name="猫猫";
        cat.eat("猫粮");
    }
}
public class Animal {
    protected String name;
    public void eat(String food){
        System.out.println(name+"正在吃"+food);
    }
}
public class Cat extends Animal{
}
public class Dog extends Animal{
}

1)Java中,使用extends继承一个父类,此时子类具备了父类中所有public和protected域(属性和方法),但父类中的private属性和方法仍然不能直接访问

2)Java中的继承是单继承局限,即一个子类只能使用extends继承一个父类,不允许多继承(不允许extends后面跟多个父类),但允许多层继承(例如鸭子是两栖动物的子类,两栖动物是动物的子类)

3)Java中所有的类都默认继承object类

4)eg:出错分析

        name是子类person的对象(子类可见),可见,而animal.name是animal自己产生对象调用的,并且animal已经是在Animal包外创建了,所以不可见【继承是让子类可见,但这你用的是你自己,不可见】!

4.调用父类的有参构造

public class Animal {
    protected String name;
    protected int age;
    public Animal(String name,int age){
        this.name=name;
        this.age=age;
    }
    public void eat(String food){
        System.out.println(this.name+"正在吃"+food);
    }
}
public class Dog extends Animal{
    public Dog(String name,int age){
        //调用父类的有参构造,若父类中没有无参构造,必须在子类中通过super显示调用父类的有参构造
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值