面向对象基础

1.1概述

​ 面向对象是相对于面向过程来讲的,指的是把 相关的数据和方法组织为一个整体 来看待,从更高的层次来进行系

统建模,更贴近事物的自然运行模式。

面向过程关注的是执行的过程,面向对象关注的是具备功能的对象。
​面向过程到面向对象,是程序员思想上 从执行者到指挥者的转变。

1.1.1三大思想

面向对象思想从概念上讲分为以下三种:OOA、OOD、OOP
OOA:面向对象分析(Object Oriented Analysis)
OOD:面向对象设计(Object Oriented Design)
OOP:面向对象程序(Object Oriented Programming

1.1.2三大特征

封装性:所有的内容对外部不可见

继承性:将其他的功能继承下来继续发展(重要:权限修饰符对继承的影响)

多态性:方法的重载本身就是一个多态性的体现 (比如:重载+重写)

1.2类与对象

类表示一个共性的产物,是一个综合的特征,而对象,是一个个性的产物,是一个个体的特征。 
(类似生活中的图纸与实物的概念。) 

类必须通过对象才可以使用,对象的所有操作都在类中定义。 

类由属性和方法组成: 
· 属性:就相当于人的一个个的特征 
· 方法:就相当于人的一个个的行为,例如:说话、吃饭、唱歌、睡觉 

class 类名称{ 
成员属性 
成员方法 
}

1.2.1属性和方法

属性定义格式: 
	数据类型 属性名; 
属性定义并赋值的格式: 
	数据类型 属性名 = 初始化值; 

方法定义格式: 
    权限修饰符 返回值类型 方法名(形式参数列表){ 
    //方法体 
    return 返回值; 

    }

1.2.2 对象的创建与使用

1.3创建对象内存分析

1.3.1栈

Java栈的区域很小 , 大概2m左右 , 特点是存取的速度特别快 ,栈存储的特点是, 先进后出

存储速度快的原因:

栈内存, 通过’栈指针’来创建空间与释放空间 !

指针向下移动, 会创建新的内存, 向上移动, 会释放这些内存 ! 这种方式速度特别快 , 仅次于PC寄存器 !
但是这种移动的方式, 必须要明确移动的大小与范围 ,
明确大小与范围是为了方便指针的移动 , 这是一个对于数据存储的限制, 存储的数据大小是固定的 , 影响了程序
的灵活性 ~
所以我们把更大部分的数据 存储到了堆内存中
存储的是:
基本数据类型的数据 以及 引用数据类型的引用!

1.3.2堆

存放的是类的对象 .
1、Java是一个纯面向对象语言, 限制了对象的创建方式: 所有类的对象都是通过new关键字创建
2、new关键字, 是指告诉JVM , 需要明确的去创建一个新的对象 , 去开辟一块新的堆内存空间:
3、堆内存与栈内存不同, 优点在于我们创建对象时 , 不必关注堆内存中需要开辟多少存储空间 , 也不需要关注内存占用
时长 !
4、堆内存中内存的释放是由GC(垃圾回收器)完成的
5、垃圾回收器 回收堆内存的规则: 当栈内存中不存在此对象的引用时,则视其为垃圾 , 等待垃圾回收器回收 !
在这里插入图片描述

1.3.3方法区

存放的是
- 类信息
- 静态的变量
- 常量
- 成员方法
方法区中包含了一个特殊的区域 ( 常量池 )(存储的是使用static修饰的成员)

1.3.4 PC寄存器

PC寄存器保存的是 当前正在执行的 JVM指令的 地址 !
在Java程序中, 每个线程启动时, 都会创建一个PC寄存器 !

1.3.5 本地方法栈

保存本地(native)方法的地址 ! (native方法是C/C++语言传承下来的,java不可干预)

1.4、构造方法设计(构造器)

1、建议自定义无参构造方法,不要对编译器形成依赖,避免错误发生。
2、当类中有非常量成员变量时,建议提供两个版本的构造方法:一个是无参构造方法,一个是全属性做参数的构造方法。
3、当类中所有成员变量都是常量或者没有成员变量时,建议不提供任何版本的构造。

1.5、方法的重载(多态的一种表现形式)

方法重载:

1、方法名称相同, 参数类型参数长度不同, 可以完成方法的重载 ! 方法的重载与返回值无关!
方法的重载 ,可以让我们在不同的需求下, 通过传递不同的参数调用方法来完成具体的功能。

构造方法重载:

一个类, 可以存在多个构造方法 : 参数列表的长度类型不同完成构造方法的重载 ~

1.7、匿名对象

1、没有对象名称的对象 就是匿名对象。
2、 匿名对象只能使用一次,因为没有任何的对象引用,所以将称为垃圾,等待被G·C回收。 只使用一次的对象可以通过匿名对象的方式完成,这一点在以后的开发中将经常使用到。

2.1、封装 private

原因:如果不进行封装操作,让使用对象使用者可以随意改动属性的值,造成与实际不符,比如年龄出现负数。
解决:通过权限修饰符让属性对外不可见,用构造函数,或者get,set方法判断传进来的参数值是否规范再进行赋值操作。

2.2、this

1、调用类中的属性 ·
2、调用类中的方法或构造方法 (在构造方法调另一个构造方法时,必须把构造方法写在第一行)
3、 表示当前对象

2.3、static

简单理解: 被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访 问。 并且不会因为对象的多次创建 而在内存中建立多份数据
重点:

  1. 静态成员 在类加载时加载并初始化。
  2. 无论一个类存在多少个对象 , 静态的属性, 永远在内存中只有一份( 可以理解为所有对象公用 )
  3. 在访问时: 静态不能访问非静态 , 非静态可以访问静态 !
    在这里插入图片描述

2.4、代码块

1、普通代码块
在执行的流程中 出现的 代码块, 我们称其为普通代码块。
2、构造代码块
类中的成员代码块, 我们称其为构造代码块, 在每次对象创建时执行, 执行在构造方法之前
3、 静态代码块
在类中使用static修饰的成员代码块, 我们称其为静态代码块, 在类加载时执行。 每次程序启动到关闭 ,只会执行一次的代码块。
4、同步代码块。
面试题:构造方法 与 构造代码块 以及 静态代码块的执行顺序: 静态代码块 --> 构造代码块 --> 构造方法

2.5、包

1、包中java文件的定义: 在.java文件的首部, 必须编写类所属哪个包, 格式: package 包名;
2、包的定义: 通常由多个单词组成, 所有单词的字母小写, 单词与单词之间使用.隔开 ,一般命名为“com.公司名.项目名.模块名…”。

2.6、权限修饰符

在这里插入图片描述

2.7、Main方法

main:系统规定好的方法名称。如果main写错了或没有,会报错:NoSuchMethodError: main
String[] args:字符串数组,接收参数的
怎么接受参数:执行编译后的类,通过命令:java 类名 参数列表,以""分割
比如:java StaticDemo10 “hello world” “hello vince” “hello mjw”

继承

java中只有单继承,多重继承,没有多继承
子类可以通过super关键字调用父类的构造方法(在子类构造方法中,父类构造方法卸载第一行),属性,方法。
在这里插入图片描述

重载与重写

在这里插入图片描述

final关键字

在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐