Java中的封装、继承、多态知识点详解

面向对象的三大特征:
封装
继承
多态

有了封装,才有继承,有了继承,才能说多态。

封装

1、面向对象的首要特征:封装 。什么是封装?有什么用?
	现实生活中有很多现实的例子都是封装的,例如:
		手机,电视机,笔记本电脑,照相机,这些都是外部有一个坚硬的壳儿。
		封装起来,保护内部的部件。保证内部的部件是安全的。另外封装了之后,
		对于我们使用者来说,我们是看不见内部的复杂结构的,我们也不需要关心
		内部有多么复杂,我们只需要操作外部壳儿上的几个按钮就可以完成操作。

	那么封装,你觉得有什么用呢?
		封装的作用有两个:
			第一个作用:保证内部结构的安全。
			第二个作用:屏蔽复杂,暴露简单。
		
	在代码级别上,封装有什么用?
		一个类体当中的数据,假设封装之后,对于代码的调用人员来说,
		不需要关心代码的复杂实现,只需要通过一个简单的入口就可以访问了。
		另外,类体中安全级别较高的数据封装起来,外部人员不能随意访问,
		来保证数据的安全性。
2、怎么进行封装,代码怎么实现?
	第一步:属性私有化(使用private关键字进行修饰。)
	第二步:对外提供简单的操作入口。
3、封装的代码实现两步:

	第一步:属性私有化

	第二步:1个属性对外提供两个set和get方法。外部程序只能通过set方法修改,只能通过get方法读取,
可以在set方法中设立关卡来保证数据的安全性。

    强调一下:
	set和get方法都是实例方法,不能带static。
	不带static的方法称为实例方法,实例方法的调用必须先new对象。

	set和get方法写的时候有严格的规范要求:(大家要按照规矩来)
		set方法长这个样子:
			public void set+属性名首字母大写(1个参数){
				xxx = 1个参数;
			}
		get方法长这个样子:
			public 返回值类型 get+属性名首字母大写(无参){
				return xxx;
			}

继承

1、什么是继承,有什么用?
	继承:在现实世界当中也是存在的,例如:父亲很有钱,儿子不用努力也很有钱。
	继承的作用:
		基本作用:子类继承父类,代码可以得到复用。(这个不是重要的作用,是基本作用。)
		主要(重要)作用:因为有了继承关系,才有了后期的方法覆盖和多态机制。

2、继承的相关特性
	① B类继承A类,则称A类为超类(superclass)、父类、基类,
	B类则称为子类(subclass)、派生类、扩展类。
		class A{}
		class B extends A{}
		我们平时聊天说的比较多的是:父类和子类。
		superclass 父类
		subclass 子类

	② java 中的继承只支持单继承,不支持多继承,C++中支持多继承,
	这也是 java 体现简单性的一点,换句话说,java 中不允许这样写代码:
		class B extends A,C{ } 这是错误的。

	③ 虽然 java 中不支持多继承,但有的时候会产生间接继承的效果,
	例如:class C extends B,class B extends A,也就是说,C 直接继承 B,
	其实 C 还间接继承 A。

	④ java 中规定,子类继承父类,除构造方法不能继承之外,剩下都可以继承。
	但是私有的属性无法在子类中直接访问。(父类中private修饰的不能在子类中
	直接访问。可以通过间接的手段来访问。)

	⑤ java 中的类没有显示的继承任何类,则默认继承 Object类,Object类是 
	java 语言提供的根类(老祖宗类),也就是说,一个对象与生俱来就有 
	Object类型中所有的特征。

	⑥ 继承也存在一些缺点,例如:CreditAccount 类继承 Account 类会导致它
	们之间的耦合度非常高,Account 类发生改变之后会马上影响到 CreditAccount 类
3、测试:子类继承父类之后,能使用子类对象调用父类方法吗?
	可以,因为子类继承了父类之后,这个方法就属于子类了。
	当然可以使用子类对象来调用。

4、在实际开发中,满足什么条件的时候,我可以使用继承呢?
	凡是采用“is a”能描述的,都可以继承。
	例如:
		Cat is a Animal:猫是一个动物
		Dog is a Animal:狗是一个动物
		CreditAccount is a Account:信用卡账户是一个银行账户
		....
	
	假设以后的开发中有一个A类,有一个B类,A类和B类确实也有重复的代码,
	那么他们两个之间就可以继承吗?不一定,还是要看一看它们之间是否能够
	使用is a来描述。

		class Customer{
			String name; // 名字
			// setter and getter
		}

		class Product{
			String name; // 名字
			// setter and getter
		}

		class Product extends Customer{
		
		}

		以上的继承就属于很失败的。因为:Product is a Customer,是有违伦理的。

6、任何一个类,没有显示继承任何类,默认继承Object。

多态

1、向上转型和向下转型的概念。

	向上转型:子--->父 (upcasting)
		又被称为自动类型转换:Animal a = new Cat();

	向下转型:父--->子 (downcasting)
		又被称为强制类型转换:Cat c = (Cat)a; 需要添加强制类型转换符。
		什么时候需要向下转型?
			需要调用或者执行子类对象中特有的方法。
			必须进行向下转型,才可以调用。
		向下转型有风险吗?
			容易出现ClassCastException(类型转换异常)
		怎么避免这个风险?
			instanceof运算符,可以在程序运行阶段动态的判断某个引用指向的对象
			是否为某一种类型。
			养成好习惯,向下转型之前一定要使用instanceof运算符进行判断。
	
	不管是向上转型还是向下转型,首先他们之间必须有继承关系,这样编译器就不会报错。

2、什么是多态。
	多种形态,多种状态,编译和运行有两个不同的状态。
	编译期叫做静态绑定。
	运行期叫做动态绑定。
	Animal a = new Cat();
	// 编译的时候编译器发现a的类型是Animal,所以编译器会去Animal类中找move()方法
	// 找到了,绑定,编译通过。但是运行的时候和底层堆内存当中的实际对象有关
	// 真正执行的时候会自动调用“堆内存中真实对象”的相关方法。
	a.move();

	多态的典型代码:父类型的引用指向子类型的对象。(java中允许这样写代码!!!)

3、什么时候必须进行向下转型?
	调用子类对象上特有的方法时。
4、多态在开发中有什么作用?
	非常重要:五颗星!!!

	多态在开发中的作用是:
	降低程序的耦合度,提高程序的扩展力。

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

	public class Master{
		public void feed(Pet pet){
			pet.eat();
		}
	}
	以上的代表中表示:Master和Dog以及Cat的关系就脱离了,Master关注的是Pet类。
	这样Master和Dog以及Cat的耦合度就降低了,提高了软件的扩展性。

	面向对象的三大特征:
	封装、继承、多态

	真的是一环扣一环。

	有了封装,有了这种整体的概念之后。
	对象和对象之间产生了继承。
	有了继承之后,才有了方法的覆盖和多态。

	这里提到了一个软件开发原则:
	七大原则最基本的原则:OCP(对扩展开放,对修改关闭)
	目的是:降低程序耦合度,提高程序扩展力。
	面向抽象编程,不建议面向具体编程。
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值