面向对象总结

面向对象总结

面向对象和面向过程的区别和特点:

面向过程和面向对象都是对软件分析、设计和开发的一种思想,它指导着人们以不同的方式去分析、设计和开发软件。早期先有面向过程思想,随着软件规模的扩大,问题复杂性的提高,面向过程的弊端越来越明显的显示出来,出现了面向对象思想并成为目前主流的方式。两者都贯穿于软件分析、设计和开发各个阶段,对应面向对象就分别称为面向对象分析(OOA)、面向对象设计(OOD)和面向对象编程(OOP)。C语言是一种典型的面向过程语言,Java是一种典型的面向对象语言。

面向对象基本概念(对象和类=表格数据结构)

1.表结构对应:类结构
2.一行数据对应:一个对象
3.表中所有数据对应:这个类的所有对象
对照图在这里插入图片描述
类和对象的定义格式:

类的格式

Class 类名{
成员属性(相当于表格中的单个数据,有八种基本类型)
成员方法(将类中特点相同或有关联的属性放到一起实现一种运行后的结果)
类构造器(创建该类对象时,给对象初始化作用)
构造器的特点:
1.java通过new关键字系统自动调用类的构造器
2.返回值类型是本类类型,不可自定义返回类型,不可使用关键字return
3.如系统检测到我们没有指定构造器,则系统会默认添加一个无参的构造器
4.构造器的名称必须和类的名称相同,其执行的第一行代码始终是super,系统会默认添加
5.构造器支持重载功能,实现了多态的特点
}
在这里插入图片描述
对象的创建格式:
要执行的类名称 对象名称=new 类名称;。
在这里插入图片描述

面向对象的内存分析:

在这里插入图片描述
栈:
1.栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
2.JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
3.栈属于线程私有,不能实现线程间的共享!
4.栈的存储特性是“先进后出,后进先出”
栈是由系统自动分配,速度快!栈是一个连续的内存空间
堆:
1.堆用于存储创建好的对象和数组(数组也是对象)
2.JVM只有一个堆,被所有线程共享
3.堆是一个不连续的内存空间,分配灵活,速度慢!

方法区:
1.方法区是JAVA虚拟机规范,可以有不同的实现。
i.JD7以前是“永久代”
ii.JDK7部分去除“永久代”,静态变量、字符串常量池都挪到了堆内存中
iii.JDK8是“元数据空间”和堆结合起来。
2.JVM只有一个方法区,被所有线程共享!
3.方法区实际也是堆,只是用于存储类、常量相关的信息!
4.用来存放程序中永远是不变或唯一的内容。(类信息【Class对象】、静态变量、字符串常量等)

参数传值机制

Java中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。
值传递的两种类型:
基本数据类型值传递:
传递的是数值的副本,对其操作不会更改原始数据
引用类型值传递:
传递的是引用对象的内存地址,对其操作会连带原始数据被一起更改

面向对象使用的关键字:

This关键字:

this的本质就是“创建好的对象的地址”! 由于在构造方法调用前,对象已经创建。因此,在构造方法中也可以使用this代表“当前对象” 。
注意事项:
在程序中产生二义性之处,应使用this来指明当前对象;普通方法中,this总是指向调用该方法的对象。构造方法中,this总是指向正要初始化的对象。
使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法 中用,并且必须位于构造方法的第一句。
this不能用于static方法中
格式:
this.属性名称
指的是访问类中的成员变量,用来区分成员变量和局部变量
this.方法名称
用来访问本类的成员方法

this();
访问本类的构造方法
()中可以有参数的 如果有参数 就是调用指定的有参构造

Static关键字:

在类中,用static声明的成员变量为静态成员变量,也称为类变量。 类变量的生命周期和类相同,在整个应用程序执行期间都有效。它有如下特点:
为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化。
对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享!!
一般用“类名.类属性/方法”来调用。(也可以通过对象引用或类名(不需要实例化)访问静态成员。)
在static方法中不可直接访问非static的成员。
Static修饰的代码块叫静态代码块,用于类的初始化操作,在静态代码块中不能直接访问非静态方法,执行顺序会先执行父类静态代码块依次往下执行子类的静态代码块,知道全部执行完成
static方法中不能使用this关键字:
Static方法是类方法,先于任何的实例(对象)存在。即Static方法在类加载时就已经存在了,但是对象是在创建时才在内存中生成。
在方法中定义使用的this关键字,它的值是当前对象的引用.也就是说你只能用它来调用属于当前对象的方法或者使用this处理方法中成员变量和局部变量重名的情况.
而且,更为重要的是this和super都无法出现在static 修饰的方法中,static 修饰的方法是属于类的,该方法的调用者可能是一个类,而不是对象.如果使用的是类来调用而不是对象,则 this就无法指向合适的对象.所以static 修饰的方法中不能使用this.
直接添加关键字static修饰使用

package关键字

我们通过package实现对类的管理,package的使用有两个要点:
1.通常是类的第一句非注释性语句。
2.包名:域名倒着写即可,再加上模块名,便于内部管理类。
3.当我们需要使用其他包的类时就需要通过import关键字进行导入,idea的快捷键时alt+回车就可实现包的导入,如需导入相应包类中的静态属性需在import后路径前加上static关键字即可

注意事项
写项目时都要加包,不要使用默认包。
com.gao和com.gao.car,这两个包没有包含关系,是两个完全独立的包。只是逻辑 上看起来后者是前者的一部分
表4-3 JDK中的主要包
Java中的常用包 说明
java.lang 包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。
java.awt 包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。
java.net 包含执行与网络相关的操作的类。
java.io 包含能提供多种输入/输出功能的类。
java.util 包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。

Final关键字:

final关键字可以用于三个地方。用于修饰类、类属性和类方法。
被final关键字修饰的类不能被继承,被final关键字修饰的类属性和类方法不能被覆盖(重写);
对于被final关键字修饰的类属性而言,子类就不能给他重新赋值了,如果重新赋值,会报错
在类方法前加上final关键字的用法。与类属性类似,父类方法如果用final关键字进行修饰,那么不能被覆盖,但要说明一点的是,不能被重写是指不能同时和和父类方法同名,同参数,换句话讲,只要子类中的方法与父类中的方法同名,同参数列表,即使返回值不同,仍然是属于重写的范畴

Super关键字:

super 关键字有两个用途:一是调用超类的方法,二是调用超类的构造器。super 不是一个对象的引用,不能将 super 赋给另一个对象变量,它只是一个指示编译器调用超类方法的特有关键字

面向对象的四特征(封装,继承,多态,抽象)在这里插入图片描述

继承是啥:

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

其两点作用:

对代码复用的扩展
对事务的建模

继承的使用方法 :

在子类名称后面加上extends 和要继承的父类的名称
在这里插入图片描述

继承的使用要点:

1.当一个类没有声明继承哪一个父类的时候,系统会判定这个类的父类是object类
2.Java中只有单继承,没有像C++那样的多继承。多继承会引起混乱,使得继承链过于复杂,系统难于维护。
3.Java中类没有多继承,接口有多继承。
4.子类继承父类,可以得到父类的全部属性和方法 (除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法)。
5.如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object。

继承的分类

根据继承的特性可以分为纯继承与扩展。

纯继承关系是纯粹的“is-a”(是一种)关系,因为一个类的接口已经确定了它应该是什么。继承可以确保所有的导出类具有基类的接口,且绝对不会少。基类可以接收发送给导出类的任何消息,因为二者有着完全相同的接口。

扩展关系“is-like-a”(像一个)关系,导出类就像是一个基类——它有着相同基类的基本接口,但是它还具有由额外方法实现的其他特性。导出类中接口扩展部分不能被基类访问,因此,一旦向上转型,就不能调用那些新方法。

组合与继承

继承和组合都能从现有类型生成新类型,组合一般是将现有类型作为新类型的底层实现的一部分加以复用,而继承复用的是接口。

组合在开发过程中常使用的手段,显示的在新类中放置子对象。组合的语法:只需将对象引用置于新类中即可。组合技术通常用于想在新类中使用现有类的功能而非它的接口的情景。在新类中嵌入某个对象,让其实现所需的功能,但用户看到的只是新类所定义的接口,而非所嵌入对象的接口。

封装:

就是把属性私有化,提供公共方法访问私有对象。举个简单的例子,我们去Apple店里买个iPhoneX,我们不需要知道它是怎么制造的,我们只需要知道它能用来打电话,上网和用来装B就行了。对于程序设计,用户只需要知道类中某个方法实现了什么样的功能,需要该功能的时候直接去调用就行了,不用去关心方法内部的实现细节

多态:

在这里插入图片描述
简单来说就是“一种定义,多种实现”。同一类事物表现出多种形态。Java语言中有方法重载和对象多态两种形式的多态

  方法重载:在一个类中,允许多个方法使用同一个名字,但是方法的参数不同,完成的功能也不同

  对象多态:子类对象可以与父类对象进行相互转换,而且根据其使用的子类的不同,完成的功能也不同

对象的转型(casting)

父类引用指向子类对象,我们称这个过程为向上转型,属于自动类型转换。

向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法。这时,我们就需要进行类型的强制转换,我们称之为向下转型,在向下转型过程中,必须将引用变量转成真实的子类类型(运行时类型)否则会出现类型转换异常ClassCastException
声明向下类型转换注意:
如转换对象的初始类型是子类,传换成父类后可向下强转回子类类型
如转换对象一开始就是父类类型则不可强转为子类类型

抽象:

抽象是从许多事物中,舍弃个表的,非本质的属性,抽取出共同的,本质的属性的过程。例如教师,学生和工人,他们共同的特质是人类,既然是人类就有共同的属性:性别,年龄,身高,体重等。抽象的过程就是比较的过程,通过比较找出事物之间的共同属性,通过比较区分本质。

方法的重写override

子类通过重写父类的方法,可以用自身的行为替换父类的行为。方法的重写是实现多态的必要条件。

instanceof二元运算符:

左边是对象,右边是类;当对象是右面类或子类所创建对象时,返回true;否则,返回false。

抽象方法和抽象类

·抽象方法

使用abstract修饰的方法,没有方法体,只有声明。定义的是一种“规范”,就是告诉子类必须要给抽象方法提供具体的实现。

·抽象类

包含抽象方法的类就是抽象类。通过abstract方法定义规范,然后要求子类必须定义具体实现。通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。

抽象类的使用要点:

1.有抽象方法的类只能定义成抽象类
2.抽象类不能实例化,即不能用new来实例化抽象类。
3.抽象类可以包含属性、方法、构造方法。但是构造方法不能用来new实例,只能用来被子类调用。
4.抽象类只能用来被继承。
5.抽象方法必须被子类实现。

接口interface

接口是什么:个人理解接口就是比抽象类还要抽象的东西,可以多继承
抽象类还提供某些具体实现,接口不提供任何实现,接口中所有方法都是抽象方法。接口是完全面向规范的,规定了一批类具有的公共方法规范。
从接口的实现者角度看,接口定义了可以向外部提供的服务。
从接口的调用者角度看,接口定义了实现者能提供那些服务。
接口是两个模块之间通信的标准,通信的规范。如果能把你要设计的模块之间的接口定义好,就相当于完成了系统的设计大纲,剩下的就是添砖加瓦的具体实现了。大家在工作以后,做系统时往往就是使用“面向接口”的思想来设计系统。
接口和实现类不是父子关系,是实现规则的关系。

定义接口的详细说明:

  • 访问修饰符:只能是public或默认。 接口名:和类名采用相同命名机制。 extends:接口可以多继承。
    常量:接口中的属性只能是常量,总是:public static final 修饰。不写也是。
    方法:接口中的方法只能是:public abstract。 省略的话,也是public abstract。

String类和常量池

在Java的内存分析中,我们会经常听到关于“常量池”的描述,实际上常量池也分了以下三种:
1.全局字符串常量池(String Pool)
全局字符串常量池中存放的内容是在类加载完成后存到String Pool中的,在每个VM中只有一份,存放的是字符串常量的引用值(在堆中生成字符串对象实例)。
2. class文件常量池(Class Constant Pool)
class常量池是在编译的时候每个class都有的,在编译阶段,存放的是常量(文本字符串、final常量等)和符号引用。
3. 运行时常量池(Runtime Constant Pool)
运行时常量池是在类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中,也就是说,每个class都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致。

面向对象思维导图参考文档本文链接:https://blog.csdn.net/yuanmomoya/article/details/81911407————————————————

版权声明:本文为CSDN博主「2009gis」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dilixinxixitong2009/article/details/77962030
————————————————
版权声明:本文为CSDN博主「IM随风」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/poison6/article/details/80373767
————————————————

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值