Java基础,打破模糊概念。
思想源于生活,举一个生活中的例子:洗衣服
使用面向过程的时候,所有洗衣服步骤都是我们自己亲手做的。如果使用面向对象,就可以找人(或物)帮我们做事,而帮我们做事的人或物就是对象。很明显面向对象,更加省时省心。
两者的区别:
面向对象思想更符合我们思考习惯,它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。适合我们程序员“偷懒”。
面向对象思想是一种程序设计思想,使用这样的思想编程就是面向对象编程。对象泛指现实中一切事物,每种事物都具备自己的属性和行为。面向对象编程就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算机事件。
它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。面向对象的语言中,包含了三大基本特征,即封装、继承和多态。Java语言是一种面向对象的程序设计语言,在面向对象思想的指引下,使用Java语言去设计、开发计算机程序。
两种编程的区别:
举一个java程序理解:
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.println(array[i] + "]");
} else { // 如果不是最后一个元素
System.out.print(array[i] + ", ");
}
}
System.out.println("==============");
// 使用面向对象
// 找一个JDK给我们提供好的Arrays类,
// 其中有一个toString方法,直接就能把数组变成想要的格式的字符串
System.out.println(Arrays.toString(array));//[10, 20, 30, 40, 50, 60]
}
}
Java中是用类和对象来体现
生活中,你会发现很多对象,比如桌子,椅子,同学,老师等。桌椅属于办公用品,师生都是人类。那么什么是类呢?什么是对象呢?
类与对象的关系
类是对一类事物的描述,是抽象的。
对象是一类事物的实例,是具体的。
类是对象的模板,对象是类的实体 。
例子:手机设计图纸是类,实体的手机产品就是对象了。
Java中的类表示现实世界的一类事物。属性:事物的状态信息。行为:事物能够做什么。
Java中用class描述事物。成员变量:对应事物的属性。成员方法:对应事物的行为。
类的定义格式:
/*
注意事项:
1. 成员变量是直接定义在类当中的,在方法外边。
2. 成员方法不要写static关键字。(加了static是静态方法了)
*/
public class ClassName {
//成员变量
//成员方法
}
我们定义一个类,用来模拟“学生”事物。其中就有两个组成部分:
属性(是什么): 姓名、年龄;
行为(能做什么):吃饭、睡觉、学习;
对应到Java的类当中
成员变量(属性):
String name; // 姓名
int age; // 年龄
成员方法(行为):
public void eat() {} // 吃饭
public void sleep() {} // 睡觉
public void study() {} // 学习
程序:
public class Student {
// 成员变量
public String name; // 姓名
public int age; // 姓名
// 成员方法
public void eat() {
System.out.println("吃饭饭!");
}
public void sleep() {
System.out.println("睡觉觉!");
}
public void study() {
System.out.println("学习!");
}
}
通常情况下,一个类并不能直接使用,需要根据类创建一个对象,才能使用。
1.1 导包:也就是指出需要使用的类,在什么位置。
1.2 创建对象
1.3 使用对象
变量类型 | 默认值 |
---|---|
整数(byte,short,int,long) | 0 |
浮点数(float,double) | 0 |
字符(char) | ‘\u0000’ |
布尔(boolean) | false |
数组,类,接口 | null |
写一个创建上面学生类对象的例子程序:
public class Demo01Student {
public static void main(String[] args) {
// 根据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();//学习!
}
}
通过例子来说明,先定义一个类,用来模拟“手机”事物。再创建对象来调用成员变量、成员方法。
public class Phone {
// 成员变量
String brand; // 品牌
double price; // 价格
String color; // 颜色
// 成员方法
public void call(String who) {
System.out.println("给" + who + "打电话");
}
public void sendMessage() {
System.out.println("群发短信");
}
}
2.1 一个对象使用的内存图
创建一个手机类的对象情况。
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(); // 群发短信
}
}
来看一下内存中栈内存、堆内存、和方法区所发生的事情。
首先,javac
生成的Phone.class
和Demo01PhoneOne.class
文件都存在方法区,.class
里有成员变量和成员方法。程序开始运行,先从main方法开始,main方法进栈(也叫压栈)。
在栈内存中开始执行main
方法。Phone one = new Phone();
对象变量名one在栈内存中,该语句在堆内存中创建了一个对象new Phone()
,给one赋值的是堆内存中对象的地址值。而对象的内容是从方法区的Phone.class
文件中获取,并会给成员变量赋上了默认值,而对象中的成员方法保存的是方法区中对应方法的地址值。
one.brand
one.price
one.color
三行语句根据one的地址值访问堆内存中相应的成员变量;
one.brand = "苹果";
one.price = 8388.0;
one.color = "黑色";
再三行语句根据one的地址值访问堆内存中相应的成员变量,并给它们赋上我设置的值;
one.brand ``one.price
one.color
后面三行语句根据one的地址值访问堆内存中相应的成员变量;
one.call("乔布斯");
根据one的地址值访问堆内存中相应的成员方法,再根据成员方法的地址值访问方法区的相应的成员方法。进行call()方法调用,call()方法进栈,运行call()方法。一旦call()方法执行完毕,在内存中它就会立刻出栈(弹栈),从栈消失,然后main方法继续执行。
one.sendMessage();
和找到call()方法一样。sendMessage()方法进栈,运行sendMessage()方法。一旦sendMessage()方法执行完毕,在内存中它就会立刻出栈(弹栈)消失,然后main方法继续执行。
mian方法执行完毕,main()也出栈。main方法停止了,所有内存就会消失不见,程序停止。这就是完整的当我们创建对象,访问成员变量,调用成员方法,内存中栈内存、堆内存、和方法区所发生的事情。
2.2 两个对象使用的内存图
创建两个手机类的对象情况。
public class Demo02PhoneTwo {
public static void main(String[] args) {
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(); // 群发短信
}
}
内存中的情况
创建两个对象情况和一个对象类似。需要说的就是:
new Phone();
赋给第二个对象名two的地址也是一个新的地址值。Phone.class
中对应成员方法的地址值。2.3 两个引用指向同一个对象的内存图
Phone one=new Phone();
对象名one,也叫做对象的引用。不同对象的引用指向同一个对象的情况:
public class Demo03PhoneSame {
public static void main(String[] args) {
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("=========");
// 将one当中保存的对象地址值赋值给two
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(); // 群发短信
}
}
Phone two =one;
是将one
中保存的对象地址值赋给的two
,two
也指向了该对象。one
和two
的地址值都可以访问到该同一对象的成员变量、成员方法。看例子程序:
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); // 土豪金
}
}
看例子程序
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); // 玫瑰金
}
//方法返回值是Phone对象
public static Phone getPhone() {
Phone one = new Phone();
one.brand = "苹果";
one.price = 8388.0;
one.color = "玫瑰金";
return one;
}
}
区别 | 成员变量 | 局部变量 |
---|---|---|
定义的位置 | 在方法的外部,直接写在类当中 | 在方法的内部 |
作用范围 | 整个类全都可以通用。 | 只有方法当中才可以使用, 出了方法就不能再用 |
默认值 | 如果没有赋值,会有默认值, 规则和数组一样 |
没有默认值,如果要想使用, 必须手动进行赋值(初始化) |
内存的位置 | 位于堆内存 | 位于栈内存 |
生命周期 | 随着对象创建而诞生, 随着对象被垃圾回收而消失 |
随着方法进栈而诞生 随着方法出栈而消失 |
举一个栗子:
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); // 错误写法!num属于上一个方法的局部变量,超出了它作用范围
System.out.println(name);
}
}
就到这了,欢迎点赞评论,指出不足,笔者由衷感谢o!