当前位置:网站首页>第七章 类与对象
第七章 类与对象
2022-08-08 21:07:00 【胖丁微笑】
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) {
//StackOverflowError 栈内存溢出错误
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();
}
边栏推荐
猜你喜欢
两个行间块状div之间的间隙消除
IDEA Error:(1, 1) 错误: 非法字符: \65279 Error:(1, 10) 错误: 需要class, interface或enum 解决办法
阿里云祝顺民:算力网络架构的新探索
Property or method “XXX“ is not defined on the instance but referenced during render.
Bagging、Boosting、Stacking集成学习代码
js写一个搜索添加记录,点击记录删除内容
ssh 登录connectction reset by peer
C#版网络对战五子棋以及Socket通信
新规划|广州都市圈将以广佛为核心,广佛将有18条地铁相连通
文档图像二值化DIB_paper_2(更新中...)
随机推荐
目标检测论文 Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector
day12 Elasticserach
Introduction to GeoServer: 01-Introduction
fashion CNNs code
Property or method “XXX“ is not defined on the instance but referenced during render.
Jenkins下载安装
【JVM内存区域】
numpy
蚂蚁感冒,蓝桥杯,简易AC代码讲解
amd和Intel的CPU到底哪个好?
单片机——串口通信(从串口接收多位数据保存到数组,发送多位数据到串口)
【Voice of dreams】
【Life Growth】——Xiaobai's Growth Adventures
ES6新特性未命名参数
SQLite的简单应用
安装sentry
各类测试场景的检查点
波动数列,简易AC代码,详细讲解。
小程序-按钮透明无边框
目标检测论文 Precise detection of Chinese characters in historical documents with DRL