1.1 面向对象思想概述
概述
java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计、开发计算机程序。这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为。面向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算机事件的设计思想。它区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去操作实现。
举例
洗衣服:
- 面向过程:把衣服脱下来->找一个盆->放点洗衣粉->加点水->浸泡10分钟->揉一揉->清洗衣服–>拧干->晾起来
- 面向对象:把衣服脱下来->打开全自动洗衣机->扔衣服->按钮–>晾起来
区别:
- 面向过程:强调步骤。
- 面向对象:强调对象,这里的对象就是洗衣机。
特点:
面向对象的语言中,包含了三大基本特征,即封装、继承和多态。
面向对象思想是一种更符合我们思考习惯的思想,它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。
1.2类和对象
类
是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。
现实中,描述一类事物:
- 属性:就是该事物的状态信息。
- 行为:就是该事物能够做什么。
举例:小猫。
-
属性:名字、体重、年龄、颜色。
-
行为:走、跑、叫。
对象
是一类事物的具体体现。对象是类的一个实例(对象并不是找个女朋友),必然具备该类事物的属性和行为。
现实中,一类事物的一个实例:一只小猫。
举例:一只小猫。
属性:tom、5kg、2years、yellow。
行为:溜墙根走、蹦磁的跑、喵喵叫。
类与对象的关系
- 类是对一类事物的描述,是抽象的。
- 对象是一类事物的实例,是具体的。
- 类是对象的模板,对象是类的实体。
1.3 类的定义格式
事物与类的对比
属性:事物的状态信息。
行为:事物能够做什么。
Java中用class描述事物也是如此
成员变量:对应事物的属性
成员方法:对应事物的行为类的定义格式
类的定义格式
定义类:就是定义类的成员,包括成员变量和成员方法。
成员变量:和以前定义变量几乎是一样的。只不过位置发生了改变。在类中,方法外。
成员方法:和以前定义方法几乎是一样的。只不过把static去掉,static的作用在面向对象后面课程中再详细讲解。
public class ClassName {
// 成员变量
// 成员方法
}
代码:
package cn.luis.demo1;
public class Student {
//成员变量
String name;
int age;
//成员方法
public void eat() {
System.out.println("吃饭饭!");
}
public void sleep() {
System.out.println("睡觉觉!");
}
public void study() {
System.out.println("学习!");
}
}
1.4 对象
格式
创建对象
类名 对象名 = new 类名();
使用对象访问类中的成员:
对象名.成员变量名;
对象名.成员方法名();
使用方法
通常情况下,一个类不能直接使用,需要根据类创建一个对象,才能使用。
- 导包:也就是指出需要使用的类,在什么位置。
import 包名称.类名称;
import cn.itcast,day06.demo01.Student;
对于和当前类属于同一个包的情况,可以省略导包语句不写。
- 创建,格式:
类名称 对象名 = new 类名称();
Student stu = new Student();
变量就是用来保存内容的,new出来的都在堆中(成员变量直接赋初始值),对象名称就是变量名称
-
使用,分两种情况:
-
使用成员变量:对象名.成员变量名();
-
使用成员方法:对象名.成员方法名(参数);
也就是,想用谁,就用–对象名.谁
-
注意事项
若成员变量没有赋值,那么将会有一个默认值,规则和数组相同。
代码:
package cn.luis.demo1;
public class Demo01Student {
public static void main(String[] args) {
//1.导包
//2.创建
//根据Student类创建了一个名为stu的对象
Student stu = new Student();
//3.使用其中的成员变量,格式:
//对象名.成员变量名
System.out.println(stu.name); // null
System.out.println(stu.age); // 0
System.out.println("================");
//改变对象当中的成员变量数值内容
//将右侧的字符串,赋值交给stu对象当中的name成员变量
stu.name = "赵丽颖";
stu.age = 18;
System.out.println(stu.name); // 赵丽颖
System.out.println(stu.age); // 18
System.out.println("================");
//4.适用对象的成员方法,格式:
//对象名.成员方法名();
stu.eat();
stu.sleep();
stu.study();
}
}
1.5 成员变量和局部变量
成员变量的默认赋值
数据类型 | 默认值 | |
---|---|---|
基本类型 | 整数 byte、short、int、long | 0 |
浮点数 float、double | 0.0 | |
字符 char | ‘\u0000’ | |
布尔 boolean | false | |
引用类型 | 数组、类、接口 | null |
区别
- 局部变量:
- 位置:在方法的内部或者为方法的参数
- 作用范围:只有在方法当中才可以使用
- 默认值:无,使用前需手动赋值
- 方法中的未初始化变量不可以直接打印或使用。
- 方法参数中的变量可以打印或使用,因为当方法调用时一定会给参数赋值!
- 内存位置:位于栈内存(和方法一起)
- 生命周期:随着方法进栈而诞生,随着方法出栈而消失
- 全局变量:
- 位置:在方法的外部,类中。
- 作用范围:整个类通用
- 默认值:若未赋值,则与数组默认值相同
- 内存位置:堆内存
- 生命周期:成员变量:随着对象创建而生,随着对象被垃圾回收而消失
代码:
public class Demo01VariableDifference {
String name; //成员变量
public void methodA() {
int num = 20; //局部变量
System.out.println(num);
System.out.println(name);
}
public void methodB() {
int age = 20; //局部变量
System.out.println(age);
System.out.println(name);
}
public void methodC(int param) {
//参数在方法调用的时候,必然会被赋值的。
System.out.println(param);
}
public static void main(String[] args) {
}
}
1.6 对象内存图
一个对象,调用一个方法内存图
两个对象,调用同一方法内存图
两个引用,指向同一个对象的内存图
1.7 使用自定义类作为方法参数和返回值
作为方法参数
package cn.luis.demo2;
public class Demo04PhoneParam {
public static void main(String[] args) {
Phone one = new Phone();
one.brand = "小米";
one.price = 2333.3;
one.color = "白色";
//当一个对象作为参数,传递到方法当中时,实际上传递进去的是对象的地址值
method(one); //传进去的是地址值 0x666
}
// 带有static的方法,不用创建对象就能直接调用
public static void method(Phone p) { // p : 0x666
System.out.println(p.brand); //0x666.brand
System.out.println(p.price);
System.out.println(p.color);
}
}
作为返回值
package cn.luis.demo2;
public class Demo05PhoneReturn {
public static void main(String[] args) {
// 赋值调用
// 要使用Phone类型接收,对应起来
// p1 = getPhone() = 0x666
Phone p1 = getPhone(); // main方法没有创建对象,p1对象是从方法的返回值当中接收的
System.out.println(p1.brand); // 0x666.brand
System.out.println(p1.price);
System.out.println(p1.color);
}
public static Phone getPhone() {
Phone p = new Phone();
p.brand = "苹果";
p.price = 8888.88;
p.color = "玫瑰金";
// 谁调用我,我就把结果交给谁
return p; //将地址值返回给调用处 0x666 (在上面)
}
}
自定义Phone类
package cn.luis.demo2;
/*
定义一个类,用来模拟“手机”事物
属性:品牌、价格、颜色
行为:打电话、发短信
对应到类当中
成员变量(属性)
String brand;
double price;
String color;
成员方法(行为)
public void call(who) {}
public void sendmessage() {}
*/
public class Phone {
String brand;
double price;
String color;
public void call(String who) {
System.out.println("给" + who + "打电话!");
}
public void sendmessage() {
System.out.println("群发短信!");
}
}