目录
前言
本文主要讲java类的成员:变量和方法
1 面向过程与面向对象
面向过程(POP) 与 面向对象(OOP):
- 二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
- 面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如 抽象、分类、继承、聚合、多态等
面向对象的三大特征:
- 封装 (Encapsulation)
- 继承 (Inheritance)
- 多态 (Polymorphism)
面向对象的思想概述:
- 程序员从面向过程的执行者转化成了面向对象的指挥者。
- 面向对象分析方法分析问题的思路和步骤:
①根据问题需要,选择问题所针对的现实世界中的实体。
②从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类。
③把抽象的实体用计算机语言进行描述,形成计算机世界中类的定义。即借助某种程序 语言,把类构造成计算机能够识别和处理的数据结构。
④将类实例化成计算机世界中的对象。对象是计算机世界中解决问题的最终工具。
2 Java语言基本元素:类和对象
类(Class)和对象(Object)是面向对象的核心概念。
- 类是对一类事物的描述,是抽象的、概念上的定义。
- 对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。
- “万事万物皆对象”。
- 面向对象程序设计的重点是类的设计。
- 类的设计,其实就是类的成员的设计。
Java类及类的成员:
属性:对应类中的成员变量
行为:对应类中的成员方法
类的语法格式:
修饰符 class 类名 {
属性声明;
方法声明;
}
说明:修饰符public:类可以被任意访问
类的正文要用{ }括起来
public class Person {
/**
* 属性或成员变量
*/
String name;//姓名
int age;//年龄
/*
* 方法或函数
*/
public void sleep() {
System.out.println("每个人需要睡觉来恢复精力!");
}
}
3 对象的创建和使用
创建对象语法: 类名 对象名 = new 类名();
使用“对象名.对象成员”的方式访问对象成员(包括属性和方法)
public class PersonTest {
public static void main(String[] args) {
//创建对象
Person p1=new Person();
//访问属性
p1.name="Hello";
//访问方法
p1.sleep();
}
}
说明:
如果创建了一个类的多个对象,对于类中定义的属性,每个对象都拥有各自的一套 副本,且互不干扰。
类的访问机制:
- 在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。
(例外:static方法访问非static,编译不通过。) - 在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中定义的成员。
对象的生命周期:
内存解析:
匿名对象:
- 我们也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象。
new Person().shout();
- 使用情况:如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
我们经常将匿名对象作为实参传递给一个方法调用。
4 类的成员:属性/变量(Filed)
语法格式:
修饰符 数据类型 属性名 = 初始化值 ;
说明:
- 修饰符:
①常用的权限修饰符有:private、缺省、protected、public
②其他修饰符:static、final - 数据类型:
①任何基本数据类型(如int、Boolean) 或 任何引用数据类型。 - 属性名:
①属于标识符,符合命名规则和规范即可
变量的分类:
成员变量:在方法体外,类体内声明的变量
局部变量:在方法体内部声明的变量
成员变量与局部变量的区别:
public class Person {
/**
* 属性或成员变量
*/
String name;//姓名
int age;//年龄
/*
* 方法或函数
*/
public void sleep() {
System.out.println("每个人需要睡觉来恢复精力!");
}
/*
* 局部变量
*/
public void eat() {
//局部变量
String str="food";
}
}
对象属性的默认初始化赋值:
当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了 基本数据类型之外的变量类型都是引用类型
5 类的成员:方法(method)/函数
方法(method、函数):
- 方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中也称为函数或过程。
- 将功能封装为方法的目的是,可以实现代码重用,简化代码
- Java里的方法不能独立存在,所有的方法必须定义在类里。
方法的声明格式:
修饰符 返回值类型 方法名(参数类型 形参1, 参数类型 形参2, ….){
方法体程序代码
return 返回值;
}
说明:
- 修饰符:public,缺省,private, protected
- 返回值类型:
①没有返回值:void
②有返回值,声明出返回值的类型。与方法体中“return 返回值”搭配使用。 - 方法名:属于标识符,命名时遵循标识符命名规则和规范,“见名知意”。
- 形参列表:可以包含零个,一个或多个参数。多个参数时,中间用“,”隔开。
- 返回值:方法在执行完毕后返还给调用它的程序的数据。
方法的分类:
方法的调用:
方法通过方法名被调用,且只有被调用才会执行。
方法调用的过程分析:
注意:
- 方法被调用一次,就会执行一次。
- 没有具体返回值的情况,返回值类型用关键字void表示,那么方法体中可以不必使用return语句。如果使用,仅用来结束方法。
- 定义方法时,方法的结果应该返回给调用者,交由调用者处理。
- 方法中只能调用方法或属性,不可以在方法内部定义方法。
6 方法的重载(overload)
重载的概念: 在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
重载的特点: 与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型)。调用时,根据方法参数列表的不同来区别。
可变个数的形参:
JavaSE 5.0 中提供了Varargs(variable number of arguments)机制,允许直接定义能和多个实参相匹配的形参。从而,可以用一种更简单的方式,来传递个数可变的实参。
//JDK 5.0以前:采用数组形参来定义方法,传入多个同一类型变量
public static void test(int a ,String[] books);
//JDK5.0:采用可变个数形参来定义方法,传入多个同一类型变量
public static void test(int a ,String…books);
说明:
- 声明格式:方法名(参数的类型 …参数名)
- 可变参数:方法参数部分指定类型的参数个数是可变多个:0个,1个或多个
- 可变个数形参的方法与同名的方法之间,彼此构成重载
- 可变参数方法的使用与方法参数部分使用数组是一致的
- 方法的参数部分有可变形参,需要放在形参声明的最后
- 在一个方法的形参位置,最多只能声明一个可变个数形参
/*
* 方法的重载
*/
public void methodOverload() {
System.out.println("没有形参");
}
public void methodOverload(int i) {
System.out.println("有一个int类型形参");
}
public void methodOverload(String i) {
System.out.println("有一个String类型形参");
}
public void methodOverload(int i,int j) {
System.out.println("有两个int类型形参");
}
public void methodOverload(int i,String j) {
System.out.println("有一个int类型形参和一个String类型形参");
}
public void methodOverload(String j,int i) {
System.out.println("有一个int类型形参和一个String类型形参");
}
//可变形参
public void methodOverload(String ...strings ) {
System.out.println("有一个int类型形参和一个String类型形参");
}
7 方法参数的值传递机制
方法,必须由其所在类或对象调用才有意义。
若方法含有参数:
①形参:方法声明时的参数
①实参:方法调用时实际传给形参的参数值
Java里方法的参数传递方式:
只有一种:值传递,将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。
-
形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参。
-
形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参。
8 递归(recursion)方法
递归方法: 一个方法体内调用它自身。
- 方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。
- 递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环。
示例代码:
private static long getValue(int n) {
//如果n项为1或者2,则直接返回1
if (n == 1 || n == 2) {
return 1;
}
//否则递归调用,并把该项的前两项和相加,即为该项的值
return getValue(n - 1) + getValue(n - 2);
}