Java如何模拟现实世界(1)-类、对象

一、什么是面向过程的开发方式,什么是面向对象的开发方式?

(1)面向过程的开发方式,主要的特点是注重步骤,第一步干什么,第二步干什么。

另外面向过程也注重实现功能的因果关系。

因为A所以B

因为B所以C

(2)面向过程有什么特点?

面向过程最主要的是每一步每一步的因果关系,其中A步骤因果关系到B步骤,A和B联合起来形成一个子模块,子模块和子模块之间又因为因果关系结合在一起,假设其中任何一个因果关系出现问题(错误),此时整个系统的运转都会出现问题。(代码和代码之间的耦合度太高,扩展力太差。)

(3)面向过程有什么优点(快速开发)?

对于小型项目,采用面向过程的方式进行开发,效率较高,不需要前期进行对象的提取,模型的建立,采用面向过程方式可以直接开始干活,

(4)什么是面向对象的开发方式?

采用面向对象的方式进行开发,更符合人类的思维方式。面向对象就是将现实世界分割成不同的单元,然后每一个单元都实现成对象,然后驱动一下,让各个对象之间协作起来形成一个系统。

(5)举个栗子

让我说一下面向过程和面向对象的区别,就是同样是电视,电视是有什么的部件构成的,如果焊接在一起,那么如果有一个部件坏了,会导致整个电视就可能需要换新的了,这就是面向过程,也就是说耦合度比较大,扩展能力不强,如果是面向对象,那么电视的各个部件是拼接在一起的,一个部件坏了,可以买个新的,只换部件就好了,所以,扩展能力比较强。

二、面向对象的程序开发过程

OOA(Object-Oriented Analysis):面向对象的分析;OOD:面向对象的设计;OOP:面向对象的编程。

这个是整个软件开发的过程,都是采用OO进行贯穿的,实现一个软件的过程。

三、面向对象的三大特征

(1)封装(2)继承(3)多态

四、类和对象

(一)类和对象的概念

(1)什么是类?

类实际上在现实生活中是不存在的,是人类抽象的概念,是不存在的。类是一个

(2)什么是对象?

对象是实际存在的个体。

在java语言中,要想得到"对象",必须先定义“类",对象是通过类这个模板创造出来的。

(3)重要术语

实例:对象还有另一个名字

实例化:通过类这个模板创建对象的过程,叫做实例化。

类里面包括什么?

一个类=属性+方法,属性来源于状态,方法来源于动作。

(二)类的定义

(1)类语法格式:

		[修饰符列表]  class 类名{
		//类体=属性+方法
		//属性在代码上"变量"的形式存在
		//方法描述动作/行为
		}

(2)为什么属性是以变量的形式存在的?

因为属性对应的是“数据”,数据在程序中只能放到变量中。属性就是变量。

(3)变量分类:

方法体声明的变量:局部变量,方法体外声明的变量:成员变量。

(三)对象的创建

(1)创建对象的语法是什么?

new 类名();
类名 变量名 = new 类名();
Student s1 = new Student();
这个和 int i =10; 是一样的。

解释:Student和int都是数据类型,都是在栈中开辟内存的。

s1和i都是变量名,10是具体的数据,new Student()是创建的对象是在堆中开辟内存。最后s1里面存储的是new Student()的地址。

五、创建对象时内存的变化(创建对象的原理)

(1)对象在那个内存中存储?

凡是通过new运算符创建的对象,都是存储在堆内存当中,new运算符的作用就是堆内存中开辟了一块空间,栈的活动最平凡,对象存储在堆内存当中,局部变量存储在栈内存当中。

(2)成员变量默认赋值

变量必须先声明,再赋值才能访问,局部变量是这样,但是对于成员变量来说,没有手动赋值时,系统默认赋值,赋的值都是默认值。

类型

 

默认值

Byte

 

 

0

Short

 

0

Int

 

0

Long

 

0L

Float

 

0.0F

Double

 

0.0

Boolean

 

false

Char

 

/u000

引用数据类型

 

null

(3)什么是实例变量(一个对象一份)

对象又被称为实例,实例变量实际上就是:对象级别的变量。

public class Student{
	double height;
}

height这个属性明显所以的学生都有,但是每一个对象都有“自己的身高值”,假设创建10个对象,那么就要10个height值,所以这种变量数据对象级别的变量,也就是实例变量。

实例变量在访问的时候,不能通过类.实例变量名来进行访问,因为实例变量必须先创建一个对象,堆内存中存储对象,以及对象的实例变量。

保存对象内存地址的变量,比方说Student s1 = new Student(); s1就保存了new Student()的地址,所以s1就是引用。

(4)对象和引用的区别?

对象是通过new出来的,在堆内存中存储,引用是:但凡是变量,并且该变量中保存了内存地址指向了堆内存当中的对象的。

(对象是从堆中new出来的,引用是存储对象内存地址的一个变量)

(5)如何访问实例变量

语法机制:

引用.实例变量名

(6)举个栗子,并且画出内存图。这个超级重要。

//地址类
public class Address{
    //一个家庭地址有3个属性
    //城市
    String city;
    //街道
    String street;
    //邮编
    String zipcode;
}
//用户类
public class User{
    //类=属性+方法
    int id;
    String username;
    Address addr;
}
public class Test{
    public static void main(String [] args){

    //家庭住址对象
    Address a = new Address();
    a.city = "廊坊";
    a.street ="爱民西道100号";
    a.zipcode="12345";
    
    //用户对象
    User u = new User();
    u.id = 1;
    u.username = "廊坊师范";
    u.addr = a;

}

}

内存图如下:

 总结:java中只要一个传递规则:

不管你是什么数据类型,基本也好,引用也罢,实际上在传递的时候都是将变量中保存的那个“值”复制一份过去,传过去,值的话,就直接复制,引用的话,就直接复制地址。

(六)程序在什么情况下会出现空指针异常

(1)程序在什么情况下会出现空指针异常?

引用没有了存储的地址就会出现空指针异常。

因此 User这个对象,没有引用指向它了,java中规定堆内存程序员是无权利直接操作的,此时这个对象就像氢气球,一样飘走了,等待垃圾回收期的回收,GC会将这个垃圾对象释放掉。

(2)什么时候数据会被垃圾回收期回收?

没有任何引用指向该对象的时候。

(3)出现空指针异常的前提条件是?

“空引用”访问实例(对象)相关的数据时,都会出现空指针异常。

(七)方法的调用时参数传递问题

(1)当值传递为基本数据类型:

x是局部变量,它的域是main区。

i也是局部变量,它的域是add。

Int x =100;

Int y =x;

这个和上面有异曲同工之妙。

java中规定:参数传递的时候,和类型无关。不管是基本数据类型还是引用数据类型,统一都是将盒子中保存的那个“值”复制一份,传递下去。内存地址也是值,也是盒子中保存的一个东西。

java中只要一个规定:参数传递的时候,一定是将“盒子”中的东西复制一份传递过去。

(2)当值传递为引用数据类型

 

分析:add方法里面的形式参数为Person,所以为引用数据类型。Person p 变量是在栈中存储的,但是存储的是new Person()的地址,也就是说p是指向new Person的。

 

重点(总结):java中关于方法调用时参数传递实际上只要一个规则:

不管你是基本数据类型,还是引用数据类型,实际上在传递的时候都是将变量中保存的那个"值"复制一份,传过去。

Int x =1;

Int y =x;把x中保存1复制一份传给y。

Person p1 = new Person(Person p1= 0x123);

Pserson p2 = p1 (相当于p1=0x123传给p2);p1和p2都是两个局部变量。

(八)构造方法

(1)什么是构造方法,有什么用?

构造方法是一个比较特殊的方法,通过构造方法可以完成对象的创建,以及实例变量的初始化,换句话说:构造方法用来创建对象,并且给对象属性赋值。(实例变量没有手动赋值时,系统会默认赋值。)

(2)当一个类没有提供任何构造方法,系统会默认提供一个无参数的构造方法。

(3)构造方法如何调用?使用哪个运算符呢?

	使用new运算符
	语法格式:
	New 类名();

(4)构造方法的语法结构?

	[修饰符列表] 构造方法名 (形式参数列表){
		构造方法体;
		(通过在构造方法体中给属性赋值,完成属性的初始化。)
	}

它和普通方法的区别就是没有返回值。

注意:(a)构造方法名和类名必须一致。

(5) 构造方法

  (a)当一个类中没有提供任何构造方法,系统默认提供一个无参数的构造方法,这个无参数的构造方法叫做缺省构造器

  (b)当一个类中手动的提供了构造方法,那么系统将不会再提供无参数构造方法

(c)无参数构造方法,和有参数构造方法都可以调用。

Student x = new Student();
Student y = new Student(123);

(d) 构造方法支持方法重载吗?

构造方法是支持方法重载的

(6)实例变量没有手动赋值的时候,实际上系统会默认赋值,那么是什么时候进行复制的?

是在类加载的时候给这些实例变量赋值的吗?

不是,实例变量是在构造方法执行的过程中完成的初始化的,完成赋值的。

其实在构造方法里面给实例变量赋的值,只不过看不见。

对于实例变量来说,只要构造方法没有赋值,那么系统都会自动给它赋默认的值。

public User(){

age =0;

name =null;

id=0

}

总结:面向对象就是更加符合人的思维逻辑,因为人认识事物就是面向对象的,面向对象的重点也就是知道创建对象在内存中是如何变化的,以及在值传递的时候,如何传递的。 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TGB-Earnest

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值