第七章 类与对象

7.1面向过程与面向对象

面向过程的语言:c语言(自己解决问题)
面向对象:c++,java,python(别人解决问题)
在任何事情的处理当中,总体都是面向过程的,只不过在中间可能会用到面向对象的思想。面向过程是最底层的,面向对象是基于面向过程的!

7.2类与对象的关系

面向对象程序设计就是使用对象进行程序设计。对象代表现实世界中可以明确标识的一个实体。
• 一个对象的状态也称为特征或属性 是由具有当前值的数据域来表示的。
•— 个对象的行为是由方法定义的。调用对象的一个方法就是要求对象完成一个动作。
使用一个通用类来定义同一类型的对象。类是一个模板、蓝本或者说是合约,用来定义对象的数据域是什么以及方法是做什么的。一个对象是类的一个实例。可以从一个类中创建多个实例。创建实例的过程称为实例化。对象和实例经常是可以互换的。类和对象之间的关系类似于苹果派配方和苹果派之间的关系。可以用一种配方做出任意多的苹果派来。

7.3代码实现及内存图解

/*
目前的这个类主要用于描述事物
一般这种用于描述事物的类 统称为 实体类
实体类一般是没有主函数的
属性:
品牌
颜色
速度
重量
汽车启动状态
行为:
启动
关闭
加速
刹车
*/
public class Car{
	String band;
	String color;
	int speed;
	int weight;
	boolean statues;
	public void startEngine() {
		if (statues) {
			System.out.println("汽车引擎关闭....");
			statues = false;
		} else {
			System.out.println("汽车引擎启动....");
			statues = true;
		}
	}
	public void shutDownEngine() {
		if (statues) {
			System.out.println("汽车引擎关闭....");
			statues = false;
		} else {
			System.out.println("汽车引擎启动....");
			statues = true;
		}
	}
	public void addSpeed() {
		if (statues) {
			System.out.println("汽车加速....");
			speed += 10;
		} else {
		System.out.println("汽车引擎尚未启动....");
		}
	}
	public void jianSpeed() {
		if (statues) {
			System.out.println("汽车减速....");
			speed -= 10;
			if (speed <= 0) {
			speed = 0;
			}
		} else {
			System.out.println("汽车引擎尚未启动....");
		}
	}
}
关于上述代码的内存图解
javac Sample.java 编译主类的源代码,但是主类中会牵扯到Car这个类,同时也把Car这个类
也变异了,所以最终生成两个字节码文件,Sample.class,Car.class
java Sample 运行Sample这个字节码文件,为什么不运行Car字节码文件呢?因为Car不是主
类,所以不存在主函数,所以也就不能够运行,Sample才是主类,里面有主函数,所以运行
Sample这个字节码文件
具体怎么运行呢?先将相关的字节码文件加载进JVM中,JVM是在计算机内存中运行的,所以也可
以认为是将字节码文件加载进计算机本地内存里的,到底加载到哪里去了呢?加载进JVM中一个叫
做 方法区 的内存中的
根据 java Sample 这个指令,去方法区中找Sample字节码里的主函数,将主函数的函数帧读取
并加载进 栈内存 ,开始执行主函数
因为主函数是带形式参数的,这个形式参数 String[] args ,任何一个函数的形式参数都是该
函数下的局部变量!
/*
Sample这个类,并没有描述事物的内容
只是用来运行程序的,一般都还有主函数
这种类称之为主类
*/
	public class Sample {
	public static void main(String[] args) {
		//创建出一个Car类的对象,对象的名字叫c1
		Car c1 = new Car();
		//看一看c1的属性
		System.out.println(c1.band);
		System.out.println(c1.color);
		System.out.println(c1.speed);
		System.out.println(c1.weight);
		System.out.println(c1.statues);
		c1.band = "奥迪";
		c1.color = "黑色";
		c1.speed = 0;
		c1.weight = 4;
		c1.statues = false;
		System.out.println(c1.band);
		System.out.println(c1.color);
		System.out.println(c1.speed);
		System.out.println(c1.weight);
		System.out.println(c1.statues);
		c1.startEngine();
		c1.addSpeed();
		c1.addSpeed();
		c1.addSpeed();
		System.out.println(c1.speed);
		c1.jianSpeed();
		c1.jianSpeed();
		System.out.println(c1.speed);
		c1.shutDownEngine();
		Car c2 = new Car();
		c2.startEngine();
		c2.shutDownEngine();
	}
}

内存图解
第七章 类与对象

7.4局部变量与成员变量的区别

所属空间
成员变量:堆内存当中,对象的所属空间里
局部变量:栈内存当中,函数的所属空间里
生命周期
成员变量:随着对象的创建而创建,随着对象的消亡而消亡
局部变量:随着函数的进栈而创建,随着函数的弹栈而消失
初始化
成员变量:有默认初始化-显式初始化-针对性初始化
局部变量:如果没有初始化的值,那么后面不能调用
作用域
成员变量:在本类的内部是全局(静态不能调用非静态)
局部变量:前提是在函数中,在最近的一对大括号内

如果一个局部变量和一个类变量具有相同的名字,那么局部变量优先. 而同名的类变量将被隐藏。例如:在下面的程序中,x 被定义为一个实例变量,也在方法中被定义为局部变量。

public class F {
private int x = 0; 
private int y = 0;
public F() {
}
public void p() {
int x - 1; 
System.out.println("x = " + x);
System.out.println("y = " + y);
}

7.5 private关键字与访问器修改器

private的英文含义是“私有的”,因此我们可以通过使用private关键字让成员变量私有化,只允许内部访问。成员变量是不能 直接 被外界修改,对于成员变量而言,值是可以修改的,但是不能没有逻辑,不能没有条件,所以对于对象而言,要有相应的验证外界传来的参数合法性的功能!这个功能函数叫做修改器 setXXX(),同时提供访问器getXXX()。

7.6 构造函数及内存图解

构造函数:就是在创建对象时调用的函数,一是给对象进行显示初始化+针对性初始化,二是为了继承相关的内容。
构造方法是一种特殊的方法。它们有以下三个特殊性:
• 构造方法必须具备和所在类相同的名字。
• 构造方法没有返回值类型,甚至连 void 也没有。
• 构造方法是在创建一个对象使用 new 操作符时调用的。构造方法的作用是初始化对象。
构造方法具有和定义它的类完全相同的名字。和所有其他方法一样,构造方法也可以重载(也就是说,可以有多个同名的构造方法,但它们要有不同的签名),这样更易于用不同的初始数据值来构造对象。

public class DemoA {
	public static void main(String[] args) {
	//*Error 栈内存溢出错误
		A a = new A();
		System.out.println(a == a.a);
		System.out.println(a.a == a.a.a);
	}
}
class A {
	A a = new A();
}

第七章 类与对象

7.7 static静态成员及内存图解

静态变量被类中的所有对象所共享。静态方法不能访问类中的实例成员。
静态变量将变量值存储在一个公共的内存地址。因为它是公共的地址,所以如果某一个对象修改了静态变量的值,那么同一个类的所有对象都会受到影响。Java 支持静态方法和静态变童,无须创建类的实例就可以调用静态方法(static method)。

public class DemoB {
	public static void main(String[] args) {
		B b = new B();
		System.out.println(b == b.b); //0x456 0x123 false
		System.out.println(b.b == b.b.b);//0x123 0x123 true
	}
}
class B {
	static B b = new B();
}

第七章 类与对象

上一篇:LR


下一篇:设计立方体类(Cube)