JAVA_面向对象2

一.JAVA类的定义

  JAVA里面有class关键字定义一个类,后面加上自定义的类名即可。如这里定义的person类,使用class person定义了一个person类,然后在person这个类的类体里面定义person这个类应该具有的成员变量(即属性)和方法,如这里定义的int  id和int  age这个两个成员变量,或者叫属性,这个id表示人的身份证号码,人应该具有这个属性,age表示人的年龄,这也是人应该具有的。这样就在person这个类里面定义了两个人应该有的属性,接下来就是定义方法了,这里定义了三个方法,分别是getAge()、setAge(int
 i)和getId(),分别用来获取人的年龄,设置人的年龄,获取人的id,getAge()方法获取了人的年龄后,将获取到的值返回,所以使用了return  age语句,getId()方法也使用了return  id语句用于返回获取到的id的值。

之前也说过,类是一个对象的抽象,简单的说,类就是一种对象的概括,一个大类!就好像这里定义的person类,是人特征的一个概括,你可以根据这个的类的方法属性去new一个具体特征的人,而这个人就是对象!

二. 成员变量

  在JAVA里面的任何变量首先应该要声明,然后再赋值,然后再使用。成员变量和局部变量有一个重要区别:成员变量在类里面声明时如果不进行初始化,那么JAVA会默认给它初始化,而局部变量JAVA不会默认给它初始化,所以在方法里面声明一个局部变量如果不给它初始化时就会出错。默认初始化大多数都是0,boolean类型的为false,引用类型的为null,如过不记得JAVA对成员变量默认的初始化是多少的话,那就这样做,定义一个成员变量,不给它初始化,然后直接打印这个成员变量,打印出来的结果就是JAVA默认的初始化的值。

这里就有个问题了!为什么成员变量在声明的时候不进行初始化,JAVA会默认给他初始化,而局部变量不会呢?而且为什么局部变量不给它初始化就会报错呢?

首先从设计者的角度出发,当我们新建一个对象时,Java会在Heap中申请一块内存区域用以存放类的数据。而成员变量就是类的数据,也是放在这块内存区域中的。只需要JVM在申请内存的时候顺便把整块区域都置为零即可完成初始化,方便快捷。而对于方法的局部变量,是在线程的Stack中,当然Stack他也可以帮我们初始化,不过有一个问题。对于有些局部变量,在方法的一开始是没有的,有些在循环中的局部变量是要反复的声明多次的。有些局部变量作用域结束后,另一个局部变量又会占用这个局部变量的位置。那么初始化要放在何时呢?当然JVM可以帮我们初始化多次,不过那样或许会带来性能问题,开销大!

三、Java面向对象的基本概念——引用

  引用类型和基本类型有着巨大的区别,当声明一个int  i=0时,系统会马上给这个i分配一个内存空间(在栈内存里面分配一小块区域用来装数字0),里面装着一个值为0,以后使用i这个名字马上就可以访问这个内存空间里面的值,这就是基本数据类型,所以基础类型就只占一块内存。基础类型之外的类型全都叫引用类型,我们定义一个Mouse  m,这个m就是一个引用类型的数据。引用类型有什么重要的特征——引用类型占2块内存。我们定义好这个类之后,需要使用new关键字把这个类的对象实例化出来,也就是真真正正造出一个对象出来才能使用这个对象。

eg:int i=0; 我们可以直接使用i

Mouse m;  我们必须要m=new Mouse(); 才能使用

如何在内存中区分类和对象?

  类是静态的概念,是位于代码区里面。对象是new出来的,它是位于堆内存,为什么对象要位于堆内存?因为堆内存是用来动态分配内存的,只有在运行当中才会new一个对象放堆内存里面,那这个对象到底有多大个,这个东西你不知道,你没有办法提前知道,所以你没有办法提前分配内存给这个对象,你只有在运行期间才能去分配它。什么叫运行期间?敲JAVAC这个命令那是在编译期间,编译完成后再敲JAVA命令,那就是运行期间了。只有在运行期间,才能够明白这个对象到底要分配多大的空间给它,所以把它放在堆内存里面,堆内存比较大,动态分配内存用它。如果这个对象不用了,那它就是垃圾,那么就等着垃圾收集器把它收集回去,释放掉占用的内存。

记住,以后一提到引用,脑子里马上浮现引用那就是一小块内存指向一大块内存。

四、对象的创建和使用

  使用new关键字来创建一个新的对象。

五、类和对象的关系

在内存中分析类和对象的关系

  假设这里有一个类C,我们定义了一个类class C,然后在这个类里面定义了两个成员变量: int  i和int  j。定义好了这两个成员变量以后,我们写了一个main()方法(public static void main(Strng[] args)),程序开始执行。第一句我们写了 C c1 = new C(),这句的代码是我们相当于在堆内存里创建了一个对象,同时也创建了这个对象的一个引用对象c1,c1位于栈内存中,c1这个引用对象指向堆中一大块内存,这一大块内存里面装着new出来的那个对象。这里面我们一般来说是new出来两个对象c1和c2,当然,实际上,严格来讲,c1和c2叫做对象的引用,有时候,简称new出来了两个对象,c1和c2。你脑子里马上要浮现出两块内存,c1指向一块,c2指向一块。局部变量是分配在栈内存里面的,main方法里面的c1和c2都是局部变量,所以在栈里面分配了两小块内存出来,一块是c1的,一块是c2的,c1这块内存里面装着一个值,或者叫装着一个地址,这个地址是什么,我们不知道,我们只知道根据这个值就能找到new出来的C这个类里面的一个对象,而在这个对象里面有它自己的成员变量i和j,里面的两小块内存是分别用来装i和j的值的,因为每一个对象都有自己不同的成员变量的值,所以c1指向的那块对内存里面又分成一小块一小块内存,每一个小块的内存都装着这个对象的成员变量(或者叫属性)。如这里的第一小块装着i的值,第二小块装着j的值,所以当我们去访问第一小块里面装着的成员变量时,我们应该这样写:c1.i,这样就拿到了i的值,c1.j,这样就拿到了j的值。同理,c2这个对象也指向了一个new出来的C这个类里面的另一个对象,这个对象也有成员变量i和j,只不过和c1指向的那个对象里的i和j的值不同而已。要访问这个这个对象的成员变量时
,也是要c2.i,c2.j这样去访问。

六、构造方法

  在面向对象里面有一个特殊的方法,叫构造方法。

  构造方法是用来创建一个新的对象的,与new组合在一起用,使用new+构造方法创建一个新的对象。你new一个东西的时候,实际上你调用的是一个构造方法,构造方法就是把自己构造成一个新的对象,所以叫构造方法,构造一个新对象用的方法叫构造方法。

  构造方法比较特殊,构造方法的名字必须和类的名字完全一模一样,包括大小写,并且没有返回值。如原来定义的一个person类,在类里面声明了两个成员变量id与age,这时候你可以再为这个person类定义一个它的构造方法person(int n,int i),这个方法的名字和类名完全相同,并且没有返回值,也就是在这个方法前面不能写任何的方法的返回类型修饰符,连void都不可以写。

  构造方法写好后就和new组合在一起使用,new的作用是构建一个新对象,创造一个新对象,所以new的时候实际当中调用的是构造方法。只有调用了这个构造方法才能构造出一个新的对象。例如:

  下面是在main方法里面调用person构造方法时的内存分析情况:

  当方法调用完成之后,栈里面为它分配的空间全部都要消失,即把这个方法调用时分配给它的内存空间释放出来,所以这个构造方法person调用完成之后,栈内存里面分配的两小块内存_id和_age自动消失了。这样就把它们所占的空间让了出来,让其他的方法去占用。而new出来的对象则永远留在了堆内存里面。

  

  声明一个类,若没有在类中指定其构造方法(构造函数)时,编译器会为这个类自动添加形如类名( ){ }的构造函数。

  当没有给这个类指明构造方法时,系统会默认地给这个类加上point ( ) { }这样一个空的构造方法。所以才可以在main方法中使用

point  p = new  point(); 实际上你调用的就是编译器默认给它加上的point ( ) { }这个构造方法,在这个构造方法当中,默认地把类里面的成员变量x和y初始值设为0。正是因为系统给它默认加上这么一个构造方法,所以才能在main方法里面调用。但要记住一点,一旦给这个类里面指定了构造方法,那么系统就不会再给这个类添加构造方法了。

七、总结

        面向对象主要是根据一个类的基本结构进行总结分析的,首先是讲了什么是类,类和对象的关系区别!然后到变量,变量分为成员变量和局部变量,这里主要介绍了基本的概念和要注意的事项以及引用的问题!然后就是构造方法了!

时间: 2024-10-05 23:37:06

JAVA_面向对象2的相关文章

JAVA_面向对象

面向对象的目的:消灭重复代码. 万事万物皆对象. 成员变量:属性 方法:函数

[JAVA_开课吧资源]第一周 Java语言概述、Java语言基础

主题一 Java语言概述 » JDK介绍及其基本组件 Sun公司利用Java开发工具箱(Java Development Toolkit ,JDK)发布Java的各个版本.JDK由开发和测试Java程序的独立程序集组成,它们都从命令行调用. [请点击查看更多内容 转自51CTO.com] » 使用CMD开发运行Java程序 代码文件的拓展名必须为.java,并且文件名应该与类的类名完全相同.编译一个程序是指使用编译器将源代码翻译成java字节码.下面的命令用来编译源代码文件welcome.jav

[JAVA_开课吧资源]第三周 常用类库、异常处理

主题一 常用类库 » 类库中常用的包 Java类库中的类和接口大多封装在特定的包里,每个包具有自己的功能. [请点击查看更多内容 转自CSDN博客XXX的专栏] » Object类的一些常用方法 hashCode:public int hashCode()返回该对象的哈希码值.支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表 equals:public boolean equals(Object obj)指示某个其他对象是否与此对象“相等” toStr

python学习 面向对象封装

from collectoins import namedtuplePoint=namedtuple('point',['x','y'])t1=Point(1,2)print(t1.x)print(t1.y)没有方法的类属性不会发生变化    定义简单 不能改变面向对象封装私有属性!!!私有方法!!!用装饰器描述的几个方法@property !!!@classmethod!!@staticmethod! 封装:class Teacher:     def __init__(self,name,p

python—面向对象的封装

封装 私有属性 class Teacher: __identifier = 'Teacher' #私有静态属性 def __init__(self,name,pwd) self.name = name self.__pwd = pwd #私有属性 内部使用,外部不能使用 def pwd(self): print(self.__pwd) alex = Teacher('alex','3714') alex.pwd() class Teacher: __identifier = 'Teacher'

python学习_day26_面向对象之封装

1.私有属性 (1)动态属性 在python中用双下划线开头的方式将属性隐藏起来.类中所有双下划线开头的名称,如__x都会自动变形成:_类名__x的形式.这种自动变形的特点是: a.类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果.b.这种变形其实正是针对外部的变形,在外部是无法通过__x这个名字访问到的.c.在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆

python面向对象知识点疏理

面向对象技术简介 类: 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例.class 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中且在函数体之外.类变量通常不作为实例变量使用. 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据. 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖,也称为方法的重写. 实例变量:定义在方法中的变量,只作用于当前实例的类. 继承:即一个派生类(de

php学习笔记 面向对象中[接口]与[多态性]的应用

代码如下: <?php /* 接口技术 * * 接口是一种特殊的抽象类,抽象类又是一种特殊的类 * * 接口和抽象类是一样的作用 * * 因为在PHP是单继承的,如果使用抽象类,子类实现抽象类就不能再去继承其他的类了 * * 如果既想实现一些规范,又想继承其他类.就要使用接口. * * 接口和抽象类的对比 * * 1.作用相同,都不能创建对象,都需要子类去实现 * * 2.接口的声明和抽象类不一样 * * 3.接口被实现方式不一样 * * 4.接口中的所有方法必须是抽象方法,只能声明抽象方法(不

php面向对象

面向对象 什么是面向对象? 面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程 序是由单个能够起到子程序作用的单元或对象组合而成,OOP达到了软件工程的三个目标:重用性.灵活性和扩展性.为了实现整体 运算,每个对象都能够接收信息.处理数据和向其它对象发送信息. 什么是面向对象编程呢? 把每个独立的功能模块抽象成类形成 对象,由多个对象组成这个系统,这些对象之间都能够接收信息.处理数据和向其它对象