面向对象的两个要素:类和对象
类:是对一类事物的描述,是抽象的,概念上的定义。
对象:实际存在的某类事物的个体,也称为实例(instance)。
属性: 类中的成员变量
行为:类中的成员方法
生活中描述事物无非就是描述事物的属性和行为。如:人有身高、体重等属性,有说话、唱歌、打篮球等行为。
一、类和对象的使用
- 创建类,设计类的成员
- 创建类的对象
- 通过“对象.属性”和“对象.方法”调用对象的结构
创建一个类:Person.java
类中定义了类的属性:姓名和类的方法:吃饭、睡觉。
package com.java.study;
public class Person {
//属性
String name;//姓名
//方法
//吃饭
public void eat() {
System.out.println(this.name + "吃饭");
}
//睡觉
public void sleep() {
System.out.println(this.name + "睡觉");
}
}
创建一个测试类:PersonTest.java
创建一个Person类对象,并调用类的属性和方法。
//创建类的对象 = 类的实例化
//创建一个Person类的对象
Person p1 = new Person();
//调用对象的属性和方法
//调用属性
//姓名赋值为“小明”
p1.name = "小明";
//调用方法
//吃饭
p1.eat();
//睡觉
p1.sleep();
Person p2 = new Person();
//姓名赋值为“小章”
p2.name = "小章";
//调用方法
//吃饭
p2.eat();
//睡觉
p2.sleep();
运行结果:
小明吃饭
小明睡觉
小章吃饭
小章睡觉
注意:如果创建了一个类的多个对象,则每个对象都独立拥有一套类的属性(非静态)。
例如:小明长大了,改名为大明。
//小明改名大明
p1.name = "大明";
//调用方法
//吃饭
p1.eat();
//睡觉
p1.sleep();
运行结果:
大明吃饭
大明睡觉
2. 对象间的赋值
//对象间的賦值
Person p3 = new Person();
p3 = p1;
//调用方法
//吃饭
p3.eat();
//睡觉
p3.sleep();
运行结果:
大明吃饭
大明睡觉
将p1变量保存的对象地址赋给p3,p1和p3指向了堆内存区的同一个对象实体。
二、类的成员——属性
属性(成员变量)和局部变量
- 属性直接定义在类的一对{}内;局部变量声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量。
- 属性随着类的实例化产生,通过对象.属性调用,局部变量只在某个局部作用域中生效。
- 属性在其声明时可以指定其权限,使用权限修饰符。常用的权限修饰符:private、public、缺省、protected;局部变量不可以使用权限修饰符。
- 属性有默认初始化值:
整型(byte short int long): 0
浮点型(float double): 0.0
字符型(char):‘0’或(’\u0000’)
布尔型(boolean):false
引用类型:null
局部变量没有默认初始化值,在使用局部变量时,一定要先显示赋值。特别地,形参在调用时赋值即可。- 属性加载在堆内存区(非static);局部变量加载到栈内存区。
示例代码:User.java
package com.java.study;
public class User {
String food;
public void eat(String food) {//food:局部变量
System.out.println("吃" + food);
}
public void eat() {//food:成员变量
System.out.println("吃" + this.food);
}
public void drink() {//drink:局部变量
String drink = "雪碧";
System.out.println("喝" + drink);
}
}
UserTest.java
package com.java.study;
public class UserTest {
public static void main(String[] args) {
User user = new User();
//成员变量
user.food = "面条";
user.eat();
//局部变量
//作为形式参数
String food = "米饭";
user.eat(food);
//方法内变量
user.drink();
}
}
运行结果:
吃面条
吃米饭
喝雪碧
三、类的成员——方法
方法:描述类具有的功能。
1. 方法的声明
格式:权限修饰符 返回值类型 方法名(形参列表){方法体}
public void eat() {
}
public void sleep(int hour) {
}
public String getName() {
return name;
}
public String getNickname(String name) {
return name;
}
2. 返回值
- 如果方法有返回值。则必须在方法声明时指定返回值的类型。同时,方法中需要使用return关键字来返回指定类型的变量或常量:“return 数据”
- 如果方法没有返回值,则方法声明时,使用void来表示。在没有返回值的方法中,一般不使用return,如果要使用的话,只能"return;",表示结束此方法的意思。
3. 方法名
属于标识符,遵循标识符的规则和规范,方法名命名应“见名知意”。
4. 形参列表
方法可以声明0个到多个形参。
格式:数据类型1 形参1, 数据类型2 形参2,…
5. 方法体
方法功能的体现。
6. 方法的重载(overload)
概念:在一个类中,定义多个同名的方法。但要求每个方法具有不同的参数的类型或参数的个数。“同名不同参,返回值无关”。
例如:整型数值求和与浮点型数值求和
Overload.java
package com.java.study;
public class Overload {
//下面两个方法构成了重载
//整型求和
public int getSum(int i,int j) {
return i + j;
}
//浮点型求和
public double getSum(double i,double j) {
return i + j;
}
}
OverloadTest.java
package com.java.study;
public class OverloadTest {
public static void main(String[] args) {
Overload ol = new Overload();
//整型求和
System.out.println(ol.getSum(1,2));
//浮点型求和(自动类型转换)
System.out.println(ol.getSum(1,2.0));
System.out.println(ol.getSum(1.0,2));
System.out.println(ol.getSum(1.0,2.0));
}
}
运行结果:
3
3.0
3.0
3.0
7. 可变个数形参
- 格式:数据类型 . . .变量名
- 当调用可变个数形参的方法时,传入的参数个数可以是0个到多个
- 可变个数形参在方法的形参中,必须声明在末尾
8. 方法参数的值传递机制
形参:方法声明时的参数
实参:方法调用时实际传给形参的参数
Java里的方法传递方式只有一种:值传递。 即将实际参数值得副本传入方法内,而参数本身不受影响。
- 形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参。
- 形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参。
下面举一个经典的例子:
package com.java.study;
public class SwapTest {
public static void main(String[] args) {
//基本数据类型
int m = 10;
int n = 20;
System.out.println("交换前:m=" + m + " n=" + n);
swap(m,n);
System.out.println("交换后:m=" + m + " n=" + n);
//引用数据类型
Swap sp = new Swap();
sp.a = 10;
sp.b = 20;
System.out.println("交换前:" + "a=" + sp.a + " b=" + sp.b);
swap(sp);
System.out.println("交换后:" + "a=" + sp.a + " b=" + sp.b);
}
public static void swap(int m,int n) {
int temp = m;
m = n;
n = temp;
}
public static void swap(Swap sp) {
int temp = sp.a;
sp.a = sp.b;
sp.b = temp;
}
}
运行结果:
交换前:m=10 n=20
交换后:m=10 n=20
交换前:a=10 b=20
交换后:a=20 b=10
四、类的成员——构造器
构造器也叫构造方法。方法名与类名相同,无返回值。
1. 作用
用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
2. 说明
- 如果没有显示的定义类的构造器,系统默认提供一个无参构造。
- 定义构造器的格式:权限修饰符 方法名(参数列表){}
Constructor.java
package com.java.study;
public class Constructor {
String name;
//无参构造
public Constructor() {
}
//带参构造
public Constructor(String name) {
this.name = name;
}
}
ConstructorTest.java
package com.java.study;
public class ConstructorTest {
public static void main(String[] args) {
//构造方法创建并实例化对象
Constructor c = new Constructor("小明");
System.out.println(c.name);
}
}
总结
本篇内容
- 介绍了类和对象
- 简述了类的三个成员属性、方法、构造器
下篇内容
封装、继承、多态