Java面向对象编程
1. 面向对象(OOP)与面向过程(POP)
二者都是一种思想,面向对象是相对于面向过程而言的。
面向过程,强调的是功能行为。
面向对象,将功能封装进对象,强调具备了功能的对象
面向对象的三大特征:
封装、继承多态
2. Java 类及类的成员
属性:对应类中的成员变量
语法格式
1 | 修饰符 类型 属性名=初值; |
变量的分类
- 成员变量:类体内声明的变量
- 实例变量(不以static修饰):在类实例化成对象之后才能使用
- 类变量(以static修饰):静态的,这样的变量不需要类实例化成对象就可以使用,可以通过类名.属性这样的方式直接调用
- 局部变量:方法体内声明的变量
- 形参(方法签名中定义的变量)
- 方法局部变量(在方法内定义)
- 代码块局部变量(在代码块定义)
- 成员变量与局部变量的区别
- 成员变量
- 定义在类中,在整个类中都可以被访问
- 成员变量分为类成员变量和实例成员变量,实例变量存在与对象所在的堆内存中
- 成员变量的修饰符可以根据需要选择
- 局部变量
- 局部变量只定义在局部范围内,如:方法内、代码块内等
- 局部变量存在于栈内存中
- 作用的范围结束,变量空间会自动释放
- 局部变量没有默认初始化值,每次必须显式初始化
- 局部变量声明时不指定修饰符权限
- 成员变量
行为:对应类中的成员方法
语法格式
1 | 修饰符 返回值类型 方法名(参数列表){ |
方法只有被调用才会被执行
注意
没有具体返回值的情况,返回值类型用关键字void表示。
定义方法时,方法的结果应该返回给调用者,交由调用者处理。
方法中只能调用方法,不可以在方法内部定义方法。
面向对象程序设计的重点是类的设计
定义类其实是定义类中的成员(成员变量和成员方法)
3. 类的语法格式
1 | 修饰符 class 类名{ |
说明:public 修饰符,表示类可以被任意访问
类的正文要用 { }
括起来
方法定义时,若有多个字母,采用驼峰命名法(首字母小写,其他单词首字母大写)
4. 创建 Java 自定义类
步骤:
- 定义类(考虑修饰符、类名)
- 编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
- 编写类的方法(考虑修饰符、返回值类型、方法名、形参等)
5. 对象的创建和使用
java 类及类的成员
java 类的实例化,即创建类的对象
使用 new
+ 构造器 创建一个新的对象
使用 “对象名.对象成员” 的方式访问对象成员(包括属性和方法)
6. 关于对象
匿名对象
我们可以不定义对象的句柄,而直接调用这个对象的方法,这样的对象叫做匿名对象。例如:new Person().show();
使用情况:
如果对一个对象只需要进行一次方法调用,那么就使用匿名对象
经常将匿名对象作为实参传递给一个方法调用
7. 方法的重载
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
重载的特点
与返回值类型无关,只看参数列表,且参数列表必须不同(参数个数或参数类型),调用时,根据方法参数列表的不同来区别。
8. 方法的可变个数的参数
不知道给一个方法传递的参数的个数
数组形参
1
public static void test(int a, String[] books){}
可变个数形参
1
public static void test(int a, String... books){}
说明:
可变参数:方法参数部分指定类型的参数个数是可变多个
声明方式:方法名 (参数类型名… 参数名)
可变参数方法的使用与方法参数部分使用数组是一致的
方法的参数部分有可变形参,需要放在形参声明的最后
9. 方法的参数传递
方法必须有其所在类或对象调用才有意义。若方法含有参数:
- 形参:声明方法时的参数
- 实参:方法调用时实际传给形参的参数值
Java 方法参数的传递方式是值传递,即将实际参数值的副本传入方法内,而参数本身不受影响。
JVM 的内存模型
- 栈 stack:基础数据类型、对象的引用(对象的地址)
- 堆 heap:所有的对象(包括自己定义的对象和字符串对象)
- 方法区 method:所有的 class 和 static 变量
基本数据类型在参数的传递中,就是把实参的值复制到形参中。
方法的参数传递之引用传递
总结:
- 如果方法的形参是基本数据类型,那么实参(实际的数据)向形参传递参数时,就是直接传递值,把实参的值赋给形参。
- 如果方法的形参是对象,那么实参向形参传递参数时,这个值是实参在栈内存中的值,也就是引用对象在堆内存中的地址
基本数据类型都是保存在栈内存中,引用对象在栈内存中保存的是引用对象在堆内存中的地址,那么方法的参数是传递值,实际上传递的是引用对象在堆内存中的地址。
- 本文作者: Kelly Liu
- 本文链接: http://tiantianliu2018.github.io/2019/09/27/Java-面向对象编程/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!