Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,在面向对象思想的指引下,使用Java语言区设计、开发计算机程序。这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为。面向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算机事件的设计思想。它区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步地去操作实现。
洗衣服:
区别:
面向对象思想是一种更符合我们思考习惯的思想,它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。面向对象的语言中,包含了三大基本特征,即封装、继承和多态。
环顾一下周围会发现很对对象,比如桌子、椅子、同学、老师等。桌椅属于办公用品,师生属于人类。
类是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事务的属性特征和行为特征来描述该类事物。
现实中,描述一类事物:
举例:小猫
对象是一类事物的具体体现。对象是类的一个实例(对象并不是找个女朋友),必然具备该类事物的属性和行为。
现实中,一类事物的一个实例:一只小猫

现实世界的一类事物:
Java中用class描述事物也是如此:
public class ClassName {
//成员变量
//成员方法
}
类的定义格式举例:
public class Student {
//成员变量
String name;//姓名
int age;//年龄
//成员方法
//学习的方法
publicvoid study() {
System.out.println("好好学习,天天向上");
}
//吃饭的方法
publicvoid eat() {
System.out.println("学习饿了要吃饭");
}
}
创建对象:
类名 对象名 = new 类名();
使用对象访问类中的成员:
对象名.成员变量;
对象名.成员方法();
对象的使用格式举例:
public class Test01_Student {
public static void main(String[] args) {
//创建对象格式:类名 对象名 = new 类名();
Student s = new Student();
System.out.println("s:"+s); //cn.itcast.Student@100363
//直接输出成员变量值
System.out.println("姓名:"+s.name); //null
System.out.println("年龄:"+s.age); //0
System.out.println("‐‐‐‐‐‐‐‐‐‐");
//给成员变量赋值
s.name ="赵丽颖";
s.age = 18;
//再次输出成员变量的值
System.out.println("姓名:"+s.name); //赵丽颖
System.out.println("年龄:"+s.age); //18
System.out.println("‐‐‐‐‐‐‐‐‐‐");
//调用成员方法
s.study(); // "好好学习,天天向上"
s.eat(); // "学习饿了要吃饭"
}
}
| 数据类型 | 默认值 | |
|---|---|---|
| 基本类型 | 整型(byte、short、int、long) | 0 |
| 浮点数(float、double) | 0.0 | |
| 字符(char) | ‘\u0000’ | |
| 布尔(boolean) | false | |
| 引用类型 | 数组、类、接口 | null |
定义手机类:
public class Phone {
// 成员变量
String brand; //品牌
int price; //价格
String color; //颜色
// 成员方法
//打电话
public void call(String name) {
System.out.println("给"+name+"打电话");
}
//发短信
public void sendMessage() {
System.out.println("群发短信");
}
}
定义测试类:
public class Test02Phone {
public static void main(String[] args) {
//创建对象
Phone p = new Phone();
//输出成员变量值
System.out.println("品牌:"+p.brand);//null
System.out.println("价格:"+p.price);//0
System.out.println("颜色:"+p.color);//null
System.out.println("‐‐‐‐‐‐‐‐‐‐‐‐");
//给成员变量赋值
p.brand = "锤子";
p.price = 2999;
p.color = "棕色";
//再次输出成员变量值
System.out.println("品牌:"+p.brand);//锤子
System.out.println("价格:"+p.price);//2999
System.out.println("颜色:"+p.color);//棕色
System.out.println("‐‐‐‐‐‐‐‐‐‐‐‐");
//调用成员方法
p.call("紫霞");
p.sendMessage();
}
}

通过上图,我们可以理解,在栈内存中运行的方法,遵循"先进后出,后进先出"的原则。变量p指向堆内存中的空间,寻找方法信息,去执行该方法。
但是,这里依然有问题存在。创建多个对象时,如果每个对象内部都保存一份方法信息,这就非常浪费内存了,因为所有对象的方法信息都是一样的。

对象调用方法时,根据对象中方法标记(地址值),去类中寻找方法信息。这样哪怕是多个对象,方法信息只保存一份,节约内存空间。

引用类型作为参数,传递的是地址值。
变量根据定义位置的不同,我们给变量起了不同的名字。如下图所示:

重点
重点
重点
了解
了解
package com.zzm.day06.demo01;
import java.util.Arrays;
/**
* 用途:
* 时间:2021/5/26 20:34
* 创建人:张子默
*/
/*
面向过程:当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细节。
面向对象:当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人,来帮我做事儿。
*/
public class Demo01PrintArray {
public static void main(String[] args) {
int[] array = {10, 20, 30, 40, 50, 60};
// 要求打印格式为:[10, 20, 30, 40, 50]
// 使用面向过程,每一个步骤细节都要亲力亲为。
System.out.print("[");
for (int i = 0; i < array.length; i++) {
if (i != array.length - 1) { // 如果不是最后一个元素
System.out.print(array[i] + ", ");
} else { // 如果是最后一个元素
System.out.println(array[i] + "]");
}
}
System.out.println("===============");
// 使用面向对象
// 找一个JDK给我们提供好的Arrays类
// 其中有一个toString方法,直接就能把数组变成想要的格式的字符串
System.out.println(Arrays.toString(array));
}
}
package com.zzm.day06.demo01;
/**
* 用途:
* 时间:2021/5/26 21:04
* 创建人:张子默
*/
/*
定义一个类:用来模拟"学生"事物。其中有两个组成部分:
属性(是什么):
姓名
年龄
行为(能做什么):
吃饭
睡觉
学习
对应到Java的类当中:
成员变量(属性):
String name; // 姓名
int age; // 年龄
成员方法(行为):
public void eat() {} // 吃饭
public void sleep() {} // 睡觉
public void study() {} // 学习
注意事项:
成员变量是直接定义在类当中的,在方法外边。
成员方法不要写static关键字。
*/
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("学习!");
}
}
package com.zzm.day06.demo01;
/**
* 用途:
* 时间:2021/5/26 21:13
* 创建人:张子默
*/
/*
通常情况下,一个类并不能直接使用,需要根据类创建一个对象,才能使用。
导包:也就是指出需要使用的类,在什么位置。
import 包名称.类名称;
import com.zzm.day06.demo01.Student;
对于和当前类属于同一个包的情况,可以省略导包语句不写。
创建,格式:
类名称 对象名 = new 类名称();
Student stu = new Student();
使用,分为两种情况:
使用成员变量:对象名.成员变量名
使用成员方法:对象名.成员方法名(参数);
(也就是,想用谁,就用对象名点儿谁)
注意事项:
如果成员变量没有进行赋值,那么将会有一个默认值,规则和数组一样。
*/
public class Demo02Student {
public static void main(String[] args) {
// 1.导包
// 我需要使用的Student类和我自己Demo02Student位于同一个包下,所以省略导包语句不写
// 创建,格式
// 类名称 对象名 = new 类名称();
// 根据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();
}
}
package com.zzm.day06.demo02;
/**
* 用途:
* 时间:2021/5/27 11:43
* 创建人:张子默
*/
/*
定义一个类,用来模拟"手机"事物。
属性:品牌、价格、颜色
行为:打电话、发短信
对应到类当中:
成员变量(属性):
String brand; // 品牌
double price; // 价格
String color; // 颜色
成员方法(行为):
public void call(String 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("群发短信");
}
}
package com.zzm.day06.demo02;
/**
* 用途:
* 时间:2021/5/27 11:56
* 创建人:张子默
*/
public class Demo01PhoneOne {
public static void main(String[] args) {
// 根据Phone类,创建一个名为one的对象
// 格式:类名称 对象名 = new 类名称();
Phone one = new Phone();
System.out.println(one.brand); // null
System.out.println(one.price); // 0.0
System.out.println(one.color); // null
System.out.println("===============");
one.brand = "苹果";
one.price = 8388.0;
one.color = "黑色";
System.out.println(one.brand); // 苹果
System.out.println(one.price); // 8388.0
System.out.println(one.color); // 黑色
System.out.println("===============");
one.call("乔布斯"); // 给乔布斯打电话
one.sendMessage(); // 群发短信
}
}
package com.zzm.day06.demo02;
/**
* 用途:
* 时间:2021/5/27 11:56
* 创建人:张子默
*/
public class Demo02PhoneTwo {
public static void main(String[] args) {
// 根据Phone类,创建一个名为one的对象
// 格式:类名称 对象名 = new 类名称();
Phone one = new Phone();
System.out.println(one.brand); // null
System.out.println(one.price); // 0.0
System.out.println(one.color); // null
System.out.println("===============");
one.brand = "苹果";
one.price = 8388.0;
one.color = "黑色";
System.out.println(one.brand); // 苹果
System.out.println(one.price); // 8388.0
System.out.println(one.color); // 黑色
System.out.println("===============");
one.call("乔布斯"); // 给乔布斯打电话
one.sendMessage(); // 群发短信
System.out.println("===============");
Phone two = new Phone();
System.out.println(two.brand); // null
System.out.println(two.price); // 0.0
System.out.println(two.color); // null
System.out.println("===============");
two.brand = "三星";
two.price = 5999.0;
two.color = "蓝色";
System.out.println(two.brand); // 三星
System.out.println(two.price); // 5999.0
System.out.println(two.color); // 蓝色
System.out.println("===============");
two.call("欧巴"); // 给欧巴打电话
two.sendMessage(); // 群发短信
}
}
package com.zzm.day06.demo02;
/**
* 用途:
* 时间:2021/5/27 11:56
* 创建人:张子默
*/
public class Demo03PhoneSame {
public static void main(String[] args) {
// 根据Phone类,创建一个名为one的对象
// 格式:类名称 对象名 = new 类名称();
Phone one = new Phone();
System.out.println(one.brand); // null
System.out.println(one.price); // 0.0
System.out.println(one.color); // null
System.out.println("===============");
one.brand = "苹果";
one.price = 8388.0;
one.color = "黑色";
System.out.println(one.brand); // 苹果
System.out.println(one.price); // 8388.0
System.out.println(one.color); // 黑色
System.out.println("===============");
one.call("乔布斯"); // 给乔布斯打电话
one.sendMessage(); // 群发短信
System.out.println("===============");
Phone two = one;
System.out.println(two.brand); // 苹果
System.out.println(two.price); // 8388.0
System.out.println(two.color); // 黑色
System.out.println("===============");
two.brand = "三星";
two.price = 5999.0;
two.color = "蓝色";
System.out.println(two.brand); // 三星
System.out.println(two.price); // 5999.0
System.out.println(two.color); // 蓝色
System.out.println("===============");
two.call("欧巴"); // 给欧巴打电话
two.sendMessage(); // 群发短信
}
}
package com.zzm.day06.demo02;
/**
* 用途:
* 时间:2021/5/27 12:47
* 创建人:张子默
*/
public class Demo04PhoneParam {
public static void main(String[] args) {
Phone one = new Phone();
one.brand = "苹果";
one.price = 8388.0;
one.color = "土豪金";
method(one); // 传递进去的参数其实就是地址值
}
public static void method(Phone param) {
System.out.println(param.brand); // 苹果
System.out.println(param.price); // 8388.0
System.out.println(param.color); // 土豪金
}
}
package com.zzm.day06.demo02;
/**
* 用途:
* 时间:2021/5/27 13:01
* 创建人:张子默
*/
public class Demo05PhoneReturn {
public static void main(String[] args) {
Phone two = getPhone();
System.out.println(two.brand); // 苹果
System.out.println(two.price); // 8388.0
System.out.println(two.color); // 玫瑰金
}
public static Phone getPhone() {
Phone one = new Phone();
one.brand = "苹果";
one.price = 8388.0;
one.color = "玫瑰金";
return one;
}
}
package com.zzm.day06.demo03;
/**
* 用途:
* 时间:2021/5/28 15:01
* 创建人:张子默
*/
/*
局部变量和成员变量
定义位置不一样【重点】
局部变量:在方法内部
成员变量:在方法外部,直接写在类当中
作用范围不一样【重点】
局部变量:只有方法当中才可以使用,出了方法就不能再用
成员变量:整个类全都可以通用
默认值不一样【重点】
局部变量:没有默认值,如果要想使用,必须手动进行赋值
成员变量:如果没有赋值,会有默认值,规则和数组一样
内存的位置不一样(了解)
局部变量:位于栈内存
成员变量:位于堆内存
生命周期不一样(了解)
局部变量:随着方法进栈而诞生,随着方法出栈而消失
成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失
*/
public class Demo01VariableDifference {
String name; // 成员变量
public void methodA() {
int num = 20; // 局部变量
System.out.println(num);
System.out.println(name);
}
public void methodB(int param) { // 方法参数就是局部变量
// 参数在方法调用的时候,必然会被赋值的
System.out.println(param);
int age; // 局部变量
// System.out.println(age); // 没赋值不能用
// System.out.println(num); // 错误写法!
System.out.println(name);
}
}