OOP(面向对象编程)的三大特征(重点)

封装/隐藏(encapsulation)

在程序的设计过程中,为了提高系统安全性及便捷性,我们追求的是 “高内聚、低耦合”
高内聚:类内部的数据操作细节自己完成,不允许暴露给用户
低耦合:仅暴露少量方法给用户使用

在开发过程中,我们一般通过访问修饰符来实现封装,各种访问修饰符的访问权限,如图所示:

在这里插入图片描述

封装要点:
1:除非确定该属性会被子类继承,否则全部使用private修饰;
2:要求提供相应的get/set来访问属性(这些方法要求用public修饰,从而提供对属性的读写操作);
3:仅用于本类的辅助性方法用private,希望被其他类调用的用public;

继承(inherit)

我们知道类是对对象的抽象(抽出“象”的部分);而继承则是对某一批类的抽象,从而实现对现实世界更好的建模;

继承的优点

1:提高代码复用;(从复用性角度来考虑,组合和继承一样;后面会详细对比)
2:从OOA(面向对象分析)和OOD(面向对象设计)方面考虑,更加方便我们建模(建立整个系统的模型、结构);

关键字

extends(扩展);子类是父类的扩展

继承的主要特性

1:如果类未通过extends来继承父类,系统默认父类为java.lang.Object(根基类);
2:Java为单继承(C++为多继承);在程序较为复杂时,多继承会引起混乱,使得程序过于复杂,系统难以维护(但是Java中可通过接口来实现多继承)
3:子类继承父类,可以获得父类的所有属性和方法(记住一点:构造方法除外);

重写

重写特点:
1:方法名相同;
2:返回值相同;
3:参数列表相同;
4:不能缩小访问权限(多态的关系);

重写运用较多的地方在于子类重写父类方法;但普通方法也可重写;
重写和重载二者没有任何关系,不要搞混淆了!

Object类

Object是所有Java类的根基类;如果在类的声明中未通过extends关键字指明父类;则默认父类为Object;
Object中的toString方法经常会被我们重写;但我们需要知道在Object类中toString方法返回的是类名+包名+@+哈希码(哈希码根据对象内存位置生成,唯一不重复)

super关键字

super指代的是父类对象的直接引用,可通过super来调用父类中被子类覆盖(重写)的属性和方法;
super作用在普通方法中没有顺序,随意调用;但是在构造方法中调用必须放在第一句;并且在构造方法中,如果第一句没有加super();系统会默认调用super()作为父类的初始化函数;(在初始化一个对象时,系统会默认调用该对象的无参构造方法,无参构造方法里会默认调用父类无参构造方法,如果未指定父类,调用Object的无参构造方法;最后返回的对象呈“包裹结构”

继承内存图分析

首先我们先定义三个类:

父类—Animal

package com.project.inherit;

public class Animal {
	String eye;
	
	public Animal(){
		super();
		System.out.println("创建一个动物");
	}
	
	public void eat(){
		System.out.println("动物吃饭");
	}
	
	public void run(){
		System.out.println("动物奔跑");
	}
}

子类----Brid

package com.project.inherit;

public class Brid extends Animal {
	
	String wing;
	
	public Brid(){
		//在无参构造方法中调用被子类覆盖的父类run方法
		super.run();
		System.out.println("创建一只鸟");
	}
	
	//重写Animal run方法
	public void run(){
		System.out.println("小鸟飞");
	}
	
	//子类特有方法sleep
	public void sleep(){
		System.out.println("小鸟睡觉");
	}
}

测试类—Test

package com.project.inherit;

public class Test {
	public static void main(String[] args) {
		Brid brid = new Brid();
		brid.wing = "翅膀";	//子类特有属性
		brid.eye = "双眼";	//父类属性
		brid.sleep();		//子类特有方法
		brid.run();			//重写了父类方法
		brid.toString();    //根基类方法
	}
}

内存分析图:
在这里插入图片描述

继承vs组合

组合是什么:
去除继承概念,我们将父类作为一个对象new出来直接放到子类中,子类通过这个“组合”对象获取到该对象的方法和属性;比如:

package com.project.inherit;

public class Brid {
	
	String wing;
	
	public Brid(){
		Animal animal = new Animal();   //去除了Brid和Animal的继承关系,将Animal作为对象
										//直接放进来;作用同继承一样。
		animal.run();
	}
}

因此,我们可以得出如果仅从代码复用的角度来考虑,组合完全可以替代继承;
但是从程序建模角度来考虑,继承比组合更加适用;继承会使程序的结构层次更加清晰,扩展性更强;
我们可以表示为:
is a的关系用继承;(比如小鸟是动物,这种关系用继承较好)
has a的关系用组合;(小鸟有一对翅膀,这种关系用组合更加合适)

final

从final这个单词的意思“最终”我们就可以看出,它对程序会有什么样的影响了;
1:修饰变量:常量,不可修改;
2:修饰方法:不可重写(可重载);
3:修饰类:不能继承其他类,也不能有子类;(比如:Math类,String类)

多态

多态主要是用来实现动态联编的,换句话说,就是程序的最终形态是由运行时决定的,而非编译时决定,即声明的引用变量最终会指向哪个实例对象;

必要条件

1:必须要有继承;
2:子类必须重写父类方法;
3:父类引用指向子类对象;

底层实现原理分析

首先,先声明三个类:
父类—Animal

package com.project.polymorphism;

public class Animal {
	String eye;
	
	public void voice(){
		System.out.println("动物叫声");
		testThis();
	}
	
	public void testThis(){
		System.out.println("this is animal");
	}
}

子类—Dog

package com.project.polymorphism;

public class Dog extends Animal{

	public void voice(){
		System.out.println("汪汪");
	}
	
	public void lookDoor(){
		System.out.println("看门");
	}
	
	public void testThis(){
		System.out.println("this is dog");
	}
}

测试类—Test

package com.project.polymorphism;

public class Test {
	
	public static void testAnimalVoice(Animal a){
		//这里的a在编译时会被统一成Animal对象,而运行时,被解释成Dog对象
		a.voice();
		
		//从包裹结构来看,可以知道,Dog对象中包含Animal对象
		//因此,a对象属于Dog类在编译上不会出错,但是在运行时必须强制转换成Dog对象
		if(a instanceof Dog){
			((Dog) a).lookDoor();
		}
	}
	
	public static void main(String[] args) {
		Animal d = new Dog();
		testAnimalVoice(d);
		
		//测试this在继承关系中所代表的对象
		d.testThis();
	}
}

以上代码在运行时在内存中的表现形式为,如图所示:
在这里插入图片描述
说明:
1:在Test测试类中我们可以发现,一共有两个引用变量(d和a),因此,将这两个引用变量放入栈中;

2:通过继承关系我们可以知道,new出的新对象是包裹结构,如上图所示;

3:super对象中的隐式参数super指代的是直接父类的引用,而通过Test测试类中的d.testThis()方法(最后打印结果为,this is dog)我们可以得出,this指代的是最终成型的对象,也就是最外层对象Dog,因此在父类Animal的voice方法中调用testThis()方法(等同于this.testThis()),其实调用的是子类Dog的testThis()方法;

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《面向对象高效编程》是一本以面向对象编程为主题的高效编程指南。本书全面介绍了面向对象编程的基本概念、原则和技术,并结合实例详细阐述了如何在实际编程过程中发挥其优势,提高编程质量和效率。 书中首先介绍了面向对象编程的基本概念,包括封装继承多态性等。这帮助读者理解面向对象编程的核心思想和基本特征,为后续内容的理解和应用打下基础。 然后,书中系统讲解了面向对象编程的原则和技术,如单一职责原则、开闭原则和依赖倒置原则等。这些原则和技术能够帮助程序员设计出高内聚、低耦合的类和模块,提高代码的可读性和可维护性。 接着,书中详细探讨了面向对象编程的一些常用技术,如设计模式、UML建模和重构等。这些技术能够帮助程序员更好地组织和管理代码,提高代码的复用性和可扩展性。 最后,书中提供了大量的实例和案例,帮助读者将理论知识应用到实际编程中。这些实例涵盖了不同类型的项目和应用场景,包括图形界面设计、数据库应用和网络编程等。通过实例的分析和实践,读者能够更深入地理解面向对象编程的优势和应用。 总的来说,《面向对象高效编程》是一本全面介绍面向对象编程的指南,它通过清晰的逻辑结构、丰富的实例和案例,帮助读者理解面向对象编程的基本概念和原则,并掌握相关的技术和方法。无论是初学者还是有一定编程基础的开发者,都可以从中获得受益匪浅。 ### 回答2: 面向对象高效编程是一本关于面向对象编程的PDF书籍。面向对象编程是一种程序设计的方法,它以对象为基本单位,将程序分解为相互独立且具有特定功能的对象,通过对象之间的交互来完成程序的功能。 该书的主题是如何以高效的方式进行面向对象编程。它涵盖了许多方面的内容,包括如何设计和构建对象、如何组织和管理对象之间的关系,以及如何优化和提高程序的性能。 这本书的第一部分介绍了面向对象编程的基本概念和原则,如封装继承多态性。它还讨论了如何设计和实现高质量的对象,包括如何定义对象的属性和方法,如何处理对象之间的通信和交互。 第二部分介绍了一些常用的面向对象编程技术和模式,如单例模式、工厂模式和观察者模式。这些技术和模式可以帮助开发人员更好地组织和管理他们的代码,提高代码的可复用性和可维护性。 第三部分重点介绍了如何优化和提高面向对象程序的性能。它涵盖了一些性能调优的技巧和策略,如延迟加载、缓存和并发控制。它还讨论了一些常见的性能问题和解决方案,如内存泄漏和循环引用。 总之,这本《面向对象高效编程》PDF是一本关于如何以高效方式进行面向对象编程的有用资源。它提供了丰富的概念、原则、技术和实践,对于想要提高他们面向对象编程技巧和能力的开发人员来说,是一本不可或缺的指南。 ### 回答3: "C面向对象高效编程"是一本关于面向对象编程OOP)的PDF文档。面向对象编程是一种软件开发方法,将程序设计抽象为对象的集合,这些对象通过相互之间的通信和交互来完成各种功能。面向对象编程具有很高的可重用性、可维护性和可扩展性,被广泛应用于软件开发领域。 该PDF文档主要探讨了如何在面向对象编程中提高效率。首先,它介绍了面向对象编程的核心概念,如类、对象、继承多态性等。通过正确理解和运用这些概念,可以更好地组织和管理程序的结构。 其次,文档提供了一些高效编程的技巧和方法。例如,使用封装性来隐藏对象的内部实现细节,以保护数据不被非法访问或修改。同时,通过合理地划分类和模块,可以将程序拆分为相互独立的部分,从而提高并行开发、测试和维护的效率。 此外,文档还强调了重用性的重要性。通过创建可复用的类和组件,可以避免重复编写相似的代码,并提高开发效率。此外,合理使用继承和接口的概念可以实现代码的模块化和灵活性,使得程序更易于维护和扩展。 总的来说,通过阅读"C面向对象高效编程"这本PDF文档,读者可以加深对面向对象编程的理解,并学习到一些提高开发效率的技巧和方法。这将使开发人员能够更好地设计和实现高质量的软件,提高开发效率和代码可维护性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值