一:面向对象
Q:什么是面向对象的开发方式?
A:采用面向对象的开发方式更符合人类的思维方式,人类就是以“对象”来认识世界的。所以面向对象更容易让人接受。面向对象就是将现实世界分割成不同的单元,然后每一个单元都实现成对象,然后驱动一下
让各个对象直接协作起来形成一个系统。
当我们采用面向对象的方式贯穿整个系统的时候,涉及到3个术语。
OOA:面向对象分析
OOD:面向对象设计
OOP:面向对象编程
实现一个软件的过程:
分析(A)→设计 (D)→ 编程(P)
面向对象有三大特征:封装,继承,多态
1.类和对象的概念:
什么是类:
类其实在现实生活中是不存在的,是一个抽象的概念,是一个模板。例如西瓜,苹果都属于水果类
什么是对象:
对象是实际存在的个体
例如西瓜是一个对象,苹果也是一个对象。
在JAVA语言中,要想得到”对象“,必须先定义”类“,”对象“是通过”类“这个模板创造出来的。
类是一个模板:类中描述的是所有对象的”共同特征信息“
对象就是通过类创建出来的个体
对象还有一个名字叫做实例。
实例化:通过类这个模板创建对象的过程叫做:实例化
抽象:多个对象具有共同特征,进行思考总结抽取共同特征的过程。
类=属性+方法
属性来源于状态,方法来源于动作。
2.类的定义:
怎么定义一个类?语法格式是什么?
[修饰符列表]class 类名 {
类体 = 属性+方法
属性在以上代码上以”变量“的形式存在(描述状态)
方法描述动作/行为
}
ps:修饰符列表可以省略
Q:为什么属性是以变量的形式存在的?
A:假设我们要描述一个学生:学生包括哪些属性——
学号:12345
姓名:小熊冰淇淋
地址:北京市海淀区
性别:男(ture/false)
答案:是因为属性对应的是”数据“,数据在程序中只能放到变量中
结论:属性其实就是变量。
3.创建对象的语法:
new 类名();
类是模板,通过一个类,是可以创建出N个对象的。
new是一个运算符。专门负责对象的创建。
类型 变量名 = new 类名();
4.什么是实例变量
对象被称为实例。
实例变量实际上就是:对象级别的变量。
public class 明星类{
double height;
}
身高这个属性所有的明星对象都有,但是每一个对象都有自己的身高值
假设创建10个明星对象,height变量应该有十份。
所以这种变量被称为对象级别的变量。属于实例变量。
5.类的使用格式(笔者总是在这里蒙圈,所以这部分内容极其重要)
出处:https://www.cnblogs.com/time-to-despair/p/9700205.html
public class Test { public static void main(String[] args) { //定义了一个Phone类型的变量p Phone p = new Phone(); /* * 通过p,使用Phone中的属性 */ //访问p中的brand品牌属性 p.brand = "苹果6s";[为p中brand属性赋值为”苹果6s”] //访问p中的color颜色属性 p.color = "白色";[为p中color属性赋值为”白色”] //访问p中的size尺寸大小属性 p.size = 5.5;[为p中size属性赋值为5.5] System.out.println("手机品牌为" + p.brand[使用p中brand属性值参与运算]); System.out.println("手机颜色为" + p.color[使用p中color属性值参与运算]); System.out.println("手机尺寸大小为" + p.size[使用p中size属性值参与运算]); } }
p.brand的意思实际上是p对象的breand属性,同理p.size实际上是p对象的color属性。
成员变量中的实例变量,必须先创建对象,通过引用.来访问
凡是通过new运算符创建的对象,都存储在堆内存中。new运算符的作用就是在堆内存中开辟了一条空间。
像这种p变量,保存了内存地址的变量,有一个特殊的名字——引用。
如上图所示,new运算符在堆内存开辟了一条空间,然后将内存地址赋值给变量p
6.空指针异常
如果一个对象没有“引用”指向它时,java规定堆内存程序员是没有权力去进行操控的。所以此时这个对象就失效了,等待垃圾回收器的回收,GC会将这个垃圾对象释放掉。
而出现空指针的现象的原理是“空引用”访问实例【对象】相关的数据,会出现空指针异常。
7.方法调用时的参数传递
JAVA中规定:参数传递的时候,和类型无关,不管是基本数据类型还是引用数据类型。统一都是将盒子里的那部分值复制一份,然后传递下去。
int x=100; int y=x;
实际上是把x中保存的100复制了一份给y,x和y是两个局部变量。
8.构造方法
Q:什么是构造方法?有什么用?
A:构造方法是一个特殊的方法,通过构造方法可以来完成对象的创建,以及实例变量的初始化。换句话说:构造方法是用来创建对象,并且同时给对象的属性赋值。(实例变量没有手动赋值的时候,系统会赋默认值)
当一个类没有提供任何构造方法,系统会默认提供一个无参数的构造方法,这个构造方法北称为缺省构造器。
Q:构造方法如何调用呢?
A:使用new运算符来调用构造方法。
构造方法的语法是:
[修饰符列表] 构造方法名 (形式参数列表){
构造方法体;
}
普通方法的语法是:
[修饰符列表] 返回值类型 方法名 (形式参数列表){
方法体;
}
注意:修饰符列表不能写static,且构造方法名和类名必须一致。构造方法不需要指定返回值类型,也不能写void,写上void就表示为普通方法了,就不是构造方法了。
如果一个类没有定义任何构造方法,但是系统实际上会给这个类提供一个无参数的构造方法。
我们知道实例变量没有手动赋值的时候,实际上系统会赋默认值,那么这个默认值的赋值操作是在什么时候进行的?是在类加载的时候给这些实例变量赋值吗?
其实不然,实例变量是在构造方法执行的过程中完成初始化的,完成赋值的。
如果手动定义了有参方法,那么无参方法会消失,如果没定义有参方法和无参方法,那么系统会自动定义一个无参方法。
9.封装
面向对象三大特征:
封装
继承
多态
有了封装,才有继承,有了继承,才有多态。
Q:什么是封装?封装有什么用?
A:封装的作用有两个。一是保证内部结构的安全,二是屏蔽复杂,暴露简单。
在代码级别上封装的意义在于可以让代码的调用人员不用关心代码内部的复杂实现。只需要通过一个简单的入口就可以随意访问了。
另外,类体中安全级别较高的数据封装起来,外部人员就不能随意访问了,可以提高代码的安全性。
Q:怎么进行封装?代码怎么实现?
A:私有化成员变量,使用private关键字修饰,并且提供公有的get和set方法,在方法体中进行合理值的判断,使用public关键字修饰;
对外提供简单的访问入口,外部程序只有调用以下的代码来完成访问。
例如写一个方法专门用来完成读(get)
写一个方法专门用来完成写(set)
并且不带static
注意:JAVA开发规范中有要求,set和get方法要满足如下格式。
get方法的要求:
public 返回值类型 get+属性名首字母大写(无参){
return xxx;
}
set方法的要求:
public void set+属性名首字母大写(有1个参数){
xxx=参数;
}
程序应该尽量按照JAVA规范来提供set和get方法,如果不按照这个规范来,那么你的程序将不是一个通用的程序。
ps:带有static的方法怎么调用?通过"类名."的方式访问(如果在同一个类中,类名可以省略)
如果一个方法不带有static,这样的方法称为实例方法(对象方法,对象级别的方法)
实例变量都是对象变量,实例方法是对象方法。
实例相关的都需要 new 对象,通过“引用.”的方式去访问。
10.static关键字
static翻译为静态,所有static关键字修饰的都是类相关的,类级别的。所有static修饰的,都是采用"类名."的方式访问。
static修饰的变量:静态变量
static修饰的方法:静态方法
变量的分类:
变量根据声明的位置进行划分:
在方法体当中声明的变量叫做:局部变量
在方法体当中声明的变量叫做:成员变量
成员变量又可以分为:
实例变量
静态变量
class vartest{ //以下实例的,都是对象相关的,访问时采用"引用."的方法访问。需要先new对象 。 //实例相关的,必须先有对象,才能访问,可能会出现空指针异常 //成员变量中的实例变量 int i; //实例方法 public void m2(){ } //以下静态的,都是类相关的,访问时采用“类名.”的方式访问。不需要new对象。 //不需要对象的参与即可访问。没有空指针异常的发生 //成员变量中的静态变量 static int k; public static void m1(){ } }
静态变量在类加载时初始化,不需要new对象,静态变量的空间就已经开辟出来了。
静态变量存储在方法区。
内存图如上:
来源https://www.bilibili.com/video/BV1Rx411876f?p=412
Q:什么时候变量声明为实例的,什么时候声明为静态的?
A:如果这个类型的所有对象的某个属性值都是一样的,不建议设置为实例变量,浪费内存空间。建议定义为类级别特征,定义为静态变量,在方法区中只保留一份,节省内存开销
实例的:一定需要使用“引用.”来访问。
静态的:建议使用“类名.”来访问,但使用“引用.”也行(不建议使用引用.)
因为会造成误会,会让其他程序员认为是实例的。
结论:
空指针异常只有在什么时候才会发生呢?
只有在“空引用”访问"实例"相关的,都会出现空指针异常。
11.静态代码块
使用static关键字可以定义静态代码块
Q:什么是静态代码块?语法是什么?
A:static{
JAVA语句;
JAVA语句;
}
Q:static静态代码块在什么时候执行呢?
A:类加载时执行,并且只执行一次
注意:静态代码块在类加载时执行,并且在main方法执行前执行。
12.JAVA静态方法和实例方法的区别:
https://www.cnblogs.com/shenliang123/archive/2011/10/27/2226923.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本