Java封装、继承和多态

面向对象的三大特征:封装、继承、多态。
有了封装,才有继承;有了继承,才能说多态。

一、封装

封装的作用

在代码级别上封装的作用:
一个类体当中的数据,假设封装之后,对于代码调用的人员来说,不需要关心代码的复杂实现,只需要通过一个简单的入口就可以访问了。另外,类体中安全级别较高的数据封装起来,外部人员不能随意访问,来保证数据的安全性。

总结:

  1. 保证内部结构的安全
  2. 屏蔽复杂,暴露简单

怎么进行封装

步骤:

  1. 属性私有化(使用private关键字进行修饰);
  2. 对外提供简单的操作入口:一个属性对外提供set和get两个方法。外部程序只能通过set方法修改属性,只能通过get方法获取属性的值。可以通过在set方法中设立关卡来保证数据的安全性。

强调:

  1. set方法和get方法都是实例方法,不能带static;
    不带static的方法都称为实例方法,实例方法的调用必须先new对象;

  2. set方法和get方法有严格的规范要求:

    //set方法语法要求
    public void set+属性名首字母大写(1个参数){
    	xxx = 1个参数;
    }
    
    //get方法格式要求
    public 返回值类型 get+属性名首字母大写(无参){
    	return xxx;
    }
    

补充:实例方法和静态(static)方法

  1. 静态方法
    静态方法是带static关键字的方法,是类的行为,调用方式:类名.方法
  2. 实例方法
    不带static关键字的方法都称为实例方法,实例方法是对象的行为,它的调用必须先new对象,调用方式:引用.方法

java成员变量内存图
在这里插入图片描述


二、继承

继承的语法格式

java中继承的语法格式:

class 类名 extends 父类名{
	类体;
}

继承的作用

  1. 基本作用:子类继承父类,代码可以得到复用。
  2. 主要(重要)作用:因为有了继承关系,才有了后期的方法覆盖和多态机制。

继承的相关特性

  1. B类继承A类,则称A类为超类(superclass)、父类、基类,B则称为子类(subclass)、派生类、扩展类;

  2. Java不像C++支持多继承,Java只支持单继承,即Java中不允许这样写代码:class C extends A,B{ }

  3. 虽然Java中不支持多继承,但可以通过多次继承间接继承多个父类。

    class A{
    }
    class B extends A{
    }
    class C extends B{
    }
    //C直接继承了B,还同时间接继承了A
    
  4. Java中规定,子类继承父类,除构造方法不能继承之外,剩下的都可以被继承。但是父类的私有属性(private修饰的属性)无法在子类中直接被访问。

  5. Java中的类没有显示的继承任何类,则默认继承object类。object类是Java语言提供的根类。

  6. 继承也有一些缺点:耦合度高。父类如果修改,子类会受牵连。


三、多态

//父类
public class Animal{
	public void move(){
		System.out.printlin("动物在移动");
	}
}

public class Cat extends Animal{
	//对move方法进行重写
	public void move(){
		System.out.printlin("cat走猫步");
	}
	//Cat子类特有的方法
	public void catchMouse(){
		System.out.printlin("猫会抓老鼠");
	}
}

public class Bird extends Animal{
	public void move(){
		System.out.printlin("鸟儿在飞翔");
	}
}

向上转型和向下转型

学习多态之前,需要先学习两个概念:

  1. 向上转型:子 —> 父(类似于自动类型转换 )
    例如:Animal a = new Cat();
  2. 向下转型:父 —> 子(类似于强制类型转换)
    例如:Cat c = (Cat) a;
    什么时候使用向下转型:当要访问的是子类对象中“特有”的方法时,必须进行向下转型(c.catchmouse();)。

注意:
Java中允许向上转型,也允许向下转型。无论是向上转型还是向下转型,两种类型之间必须有继承关系,没有继承关系编译器会报错。

什么是多态

多种形态,多种状态,编译和运行时有两个不同的状态。

  1. 编译期叫静态绑定。
  2. 运行期叫动态绑定。

例如:

Animal a = new Cat();
a.move();  //cat走猫步

分析:

  1. 编译的时候编译器发现a的类型是Animal,所以编译器会去Animal类中找move()方法。找到了,绑定,编译通过;
  2. 但是运行时和底层堆内存当中的实际对象有关,真正执行的时候会自动调用“堆内存中真实对象”的相关方法。

多态的典型代码:父类型的引用指向子类型的对象。

多态在开发中的作用

降低程序的耦合度,提高程序的扩展力。

public class Master{
	public void feed(Dog d){}
	public void feed(Cat c){}
}
//以上代码表示:Master和Dog以及Cat的关系很紧密(耦合度高),导致扩展能力很差

public class Master{
	public void feed(Pet p){}
}
//以上代码表示:Master和Dog以及Cat的关系就脱离了,Master关注的是Pet类,这样Master和Dog以及Cat的耦合度就降低了,提高了扩展性
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不知-_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值