Java面向对象知识汇总

Java面向对象知识汇总

类和对象

一.面向过程与面向对象的区别

1.区别:
面向过程: 执行者思维,解决简单问题可以使用面向过程
面向对象:设计者思维,解决复杂,需要协作的问题可以使用面向对象
2.联系:
面向过程与面向对象是相辅相成,都是解决问题的方式
  • 宏观上:通过面向对象进行整体设计
  • 微观上:执行和处理数据,仍然是面向过程

二.类的定义

1.定义:
类可以看作是一个模板,或者图纸,系统根据类的定义造出对象
2.属性(field):
属性:
用于定义该类或者该类对象包含的数据或者是静态特征
初始化:
定义成员变量时可以对其初始化,如果不初始,Java使用默认值进行初始化
3.方法(method):
方法:
用于定义该类或者该类实例的行为特征和功能实现
返回值
形式参数——方法定义时
实际参数——方法使用时
4.构造器(constructor):
功能:
用于对象初始化,构造器是一个创建对象时被自动调用的特殊方法,目的对象初始化
4个要点
重载

三.对象

1.对象和类的关系
2.对象的生命周期:
创建对象4步
使用:
通过变量引用操作对象
回收:
对象没有被用时,则认为是‘垃圾’,会被垃圾回收器回收

四.类的管理

1.package包机制:
定义:
通常是类的第一句话非注释性语句
包名:域名倒写即可
2.import导入

内存底层

一.Java虚拟机内存模型

1.栈:
栈描述的是方法的执行内存模型。每个方法被调用都会创建一个栈帧(存储局部变量,操作数,方法出口等)
jvm为每个线程创建一个栈,用于存放线程执行方法的信息(形式参数,局部变量等)
栈属于线程私有,不能实现线程共享
栈的存储特征:“先进后出,后进先出”
栈由系统自动分配,速度快!栈是一个连续的内存空间
2.堆:
堆用于存储创建好的对象和数组(数组也是对象)
Jvm只有一个堆,被所有线程共享
  堆不是连续的内存空间,分配灵活,速度慢
3.方法区:
方法区是Java虚拟机的规范,可以有不同的实现:jdk7以前是“永久代”
jdk7部分去除“永久代“,静态变量,字符串常量池对移到堆内存中
jdk8是”元数据空间“和堆结合起来
jvm只有一个方法区,被所有线程共享
方法区实际也是堆,只是用于存储类,常量相关的信息!
用来存放程序中永远是不变或者唯一的内容

二.程序执行过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sivlF5p5-1652803117838)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220515154700922.png)]

三.垃圾回收机制

1.GC基本原理:
Java的内存管理很大程度指的就是:堆中对象的管理:对象空间的分配:使用new关键字的对象即可
对象空间的释放:将对象赋值null即可,垃圾 回收器将负责回收所有”不可达“对象的内存空间
垃圾回收过程:第一步:发现无用对象
第二步:回收无用对象占用的内存空间
三个要点:程序员无权调用垃圾回收机制
程序员可以调用System.gc(),该方法只是通知jvm,并不是运行垃圾回收机器,尽量少用,会申请启动FullGC,成本高,影响系统性能
finalize方法,是Java提供程序员用来释放对象或者资源的方法,但尽量少用
2.回收算法:
垃圾回收机制保证可以将”无用对象“进行回收,无用对象指的是没有任何变量引用对象
Java垃圾回收机器通过相关算法发现无用对象,并进行清除和整理
相关算法:引用计数
引用可达法
3.分代机制:
原理:不同对象的生命周期不一样。因此,不同生命周期的对象可以采取不同的回收算法,以便提高效率

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YNGDTf9b-1652803117840)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220515160651211.png)]

年轻代:所有新生成的对象首先放在Eden区
年轻代的目标就是尽可能快速的收集那些生命周期短的对象,对应的是Minor GC,每次Minor GC会清理年代的内存,算法采用效率较高的复制,但会浪费内存
当”年轻代“区域放满后,就会放到年老代
年老代:在年轻代中经历n(默认15)次垃圾回收仍然存活的对象,就会放在年老代
年老代存放的都是一些生命周期比较长的对象
年老代对象越来越多,我们就启动Major GC和Full GC(全量回收),来一次大扫除,全面清理年轻代和年代
永久代:用于放静态文件,如Java类,方法区,持久代对垃圾回收没有显著影响
jdk7以前就是“方法区”的一种实现
三种GC: Minor GC——用于年轻代的区域,Eden区满了就会触发一次 Minor GC,清理无用对象,将有用对象复制到“Survivor1”,”Survivor2“区中
Major GC——用于清理老年代区域
Full GC——用于清理年轻代,年老代区域,成本较高,会对系统性能产生影响
容易造成内存泄漏的操作:创建大量无用的对象
静态集合类的使用
各种连接对象(IO流的使用,数据库连接对象,网络连接对象)未关闭
监听器的使用
4.this的本质:

​ this的本质就是”创建好的对象地址“!由于构造方法调用前,对象已经创建,因此在构造方法中使用this代表”当前对象“

​ 普通方法中,this总是指向调用方法的对象

​ 构造方法中,this总是指向正要初始化的对象

​ 要点:使用this关键字调用重载的构造方法,避免相同的初始代码块,但只能在构造方法中使用,并且必须位于构造方法的第一句

​ this不能用于static方法中

5.static的本质
6.变量分类:

​ 局部变量:从属性方法,内存中,在该方法的栈帧中

​ 成员变量:从属于对象,内存中,在该对象中

​ 静态变量:从属于类,内存中,在该类中

四.面向对象三大特征

1.继承:
要点:

​ 继承让我们更加容易实现类的扩展,extends的意思就是扩展。子类是父类的扩展

​ 使用extends实现类的扩展

​ Java中类没有多继承,接口有实现多继承

​ 子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法),但不见得可以直接访问(比如,父类私有属性和方法)

​ 如果定义一个类时,没有调用extends,则它的父类是:Java.lang.Object

instanceof :

​ 二元运算符,左边是对象,右边是类;当对象是右面类或子类所创建对象时,返回 true ;否则,返回 false

方法的重写:

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

​ 方法的重写需要符合下面的三个要点:1.“==”:方法名、形参列表相同
​ 2.‘’ ≤‘’:返回值类型和声明异常类型,子类小于等于父类
​ 3.“≥”:访问权限,子类大于等于父类

final 修饰类和方法:

​ final 修饰变量——不能被重新赋值
​ final 修饰方法——不能给重写
​ final 修饰类——不能被继承

Object 类:

​ Object 类是所有 Java 类的根基类,也就意味着所有的 Java 对象都拥有 Object 类的属性和方法

​ 如果在类的声明中未使用 extends 关键字指明其父类,则默认继承 Object 类
​ equals ()
​ toString()

super:

​ super "可以看做”是直接父类对象的引用。可以通过 super 来访问父类中被子类覆盖的方法或属性

​ 使用 super 调用普通方法,语句没有位置限制,可以在子类中随便调用
​ 在一个类中,若是构造方法的第一行代码没有显式的调用 super (.)或者 this (.….)那么 Java 默认都会调用super()含义是调用父类的无参构造方法,这里super()会省略

继承和组合:

​ is a 关系,倾向去:继承

​ has a 关系,倾向于组合
​ “组合”的核心就是“将父类对象作为类的属性”,然后,“子类通过调用这个属性来获得父类的属性和方法”

2.封装:
高内聚,低耦合:

​ 高内聚:封装细节,便于修改内部代码,提高可维护性

​ 低耦合:简化外部调用,便于调用者使用,便于扩展和协作

访问权限修饰符[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CjgxtWV1-1652803117842)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220517223521029.png)]
3.多态:
基本概念:

​ 多态指的是同一个方法调用,由于对象不同可能会有不同的行为
​ 多态是方法的多态,不是属性的多态(多态与属性无关)
​ 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象
​ 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了

对象的转型:

​ 向上转型
​ 向下转型

五.特殊类

1.抽象类:
抽象方法:

​ 使用 abstract 修饰的方法,没有方法体,只有声明。定义的是一种“规范”,就是告诉子类

抽象类:

​ 包含抽象方法的类就是抽象类。 i 通过 abstract 方法定义规范,然后要求子类必须定义具体实现

5个要点:

​ 1.有抽象方法的类只能定义成抽象类

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

2.接口:
定义:

​ 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是…则必须能…”的思想
​ 按口就是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束,全面地专业地实现了:规范和具体实现的分离

​ 接口和实现类不是父子关系,是实现规则的关系

6个要点:

​ 子类通过 implements 来实现接口中的规范
​ 接口不能创建实例,但是可用于声明引用变量理
​ 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是 public 的

​ 接口可以多继承
​ JDK18(不含8)之前,接口中只能包含静态常量、抽象方法,不能有普通属性、构造方法、普通方法

​ JDK18(含8)后,接口中包含普通的静态方法、默认方法

JDK 新特性:

​ 默认方法:默认方法和抽象方法的区别是抽象方法必须要被实现,默认方法不是。作为替代方式,接口可以提供默认 方法的实现,所以这个接口的实现类都是通过继承实现的
​ 静态方法:JAVA8以后,我们也可以在接口中直接定义静态方法的实现。这个静态方法直接从属于接口(接口也是类,一种特殊的类),可以通过接口名实现

3.内部类:
要点:

​ 内部类是一类特殊的类,指的是定义在一个类的内部的类
​ 内部类可以使用 public 、 default 、 protected 、 private 以及 static 修饰。而外部顶级类(我们以前接触的类)只能使用 publicl

本质:

​ 内部类只是一个编译时概念,一旦我们编译成功,就会成为完全不同的两个类

作用:

​ 内部类提供了更好的封装。只能让外部类直接访问,不允许同一个包中的其他类直接访问
​ 内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。但外部类不能访问内部类的内部属性
​ 接口只是解决了多重继承的部分问题,而内部类使得多重继承的解决方案变得更加完整

分类:
成员内部类:

​ 非静态内部类:非静态内部类对象必须寄存在一个外部类对象里。因此,如果有一个非静态内部类
​ 非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类
​ 非静态内部类不能有静态方法、静态属性和静态初始化块
​ 外部类的静态方法、静态代码块不能访问非静态内部类,包括不能使用非静态内部

静态内部类:

​ 静态内部类看做外部类的一个静态成员
​ 当一个静态内部类对象存在,并不一定存在对应的外部类对象。因此,静态内部类的

匿名内部类:

​ 适合那种只需要使用一次的类。比如:键盘监听操作等等
​ 匿名内部类没有访问修饰符
​ 匿名内部类没有构造方法。因为它连名字都没有那又何来构造方法呢

局部内部类:

​ 定义在方法内部的,作用域只限于本方法,称为局部内部类
​ 作用域仅限于所在方法
匿名内部类没有访问修饰符
​ 匿名内部类没有构造方法。因为它连名字都没有那又何来构造方法呢

局部内部类:

​ 定义在方法内部的,作用域只限于本方法,称为局部内部类
​ 作用域仅限于所在方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值