您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Java面向对象(基础)
面向对象(基础)高兴伟本章内容•面向对象基本概念•类与对象•封装性•构造方法•匿名对象•String类•引用传递•this关键字•static关键字•代码块•内部类一、面向对象基本概念•面向过程:没有模块化的设计•面向对象:进行模块化的设计,每一个模块单独存在,可以重复使用。举例:造手机面向过程:手机的各个零件自己制造,并且没有规范,想怎么造就怎么造面向对象:先规定好各个零件的标准,各个厂商根据标准生产对应的零件,最后组装在一起•面向对象主要特性:(1)封装性:一指把对象属性和行为看成一个密不可分的整体,将这两者封装在一个不可分割的独立单位(即对象)中;二指信息隐藏,把不需要让外界知道的信息隐藏起来。(2)继承性:一般的类派生出特殊功能的类(3)多态性:–方法重载与重写(覆写):前者在一个类中,允许多个方法使用同一个名字,但方法的参数不同,完成的功能不同;后者同一个方法,根据实例化的子类对象不同,所完成的功能也不同。–对象多态:子类对象可以与父类对象相互转换,而且根据其使用的子类不同,完成的功能也不同。二、类与对象•类与对象举例:人(张三、李四)、车(具体的某辆车)•类的定义:声明类的例子:•对象的创建与使用:或者更常用:上面的Person类实例化:类是引用数据类型,对象的实例化也是要分堆、栈空间的,具体分配如下:说明:1、堆内存:保存每一个对象的属性内容(属性用来存值),堆内存需要用关键字new才可以开辟,如果一个对象没有对应的堆内存只想,将无法使用。2、栈内存:保存的是一块堆内存的空间地址,且只能是一个地址值(方便理解,可以理解为对象的名称,直接输出对象名称是显式的是地址,除非重写toString方法)如果使用了一个没有被实例化的对象(数组),比如调用属性(方法),为属性赋值等会出现NullPointerException(空指针异常)•访问对象中的属性和方法:对上面的类实例化,并调用属性和方法:结果:•创建多个对象:结果:•对象引用传递:结果:对象引用传递图的解释如下:所谓的引用传递就是将一个堆内存空间的使用权给多个栈内存空间,每个栈内存空间都可以修改堆内存的内容。•另一个例子:结果:•图示如下:(1)刚开始分别实例化per1和per2,并为其属性分别赋值:(2)per1赋给per2后,则per2不再指向原来的堆空间,改为指向和per1相同的堆空间(因为他们存的地址值相同,都是per1指向的堆地址),原来指向的堆会被当成垃圾回收。三、封装性•为什么使用封装?不封装会出现数据不安全情况(无法检查)•使用封装性:•修改后的例子:实例化后,调用的时候出错:上面的代码如果要访问私有的属性,则必须为每个属性设置setter和getter方法,通过setter方法进行赋值,通过getter方法进行取值,修改为:结果:•如果限定非法的值可以通过在方法中加入限定条件,比如在setAge中限定年龄只能为0~150,则:上面无法为-30赋值,结果会是0•注意:使用Java开发,针对属性有这样一种定义:所有在类中定义的属性都要求使用private声明,如果属性需要被外部所使用,那么按照要求要定义相应的setter和getter方法。实际上,属性使用private封装后设置setter和getter方法是项目开发中的标准做法,不管暂时有没有用。另外,实际开发中,setter和getter方法中不需要加入上面类似于年龄大于0小于150这样的验证,这种验证应该在其他地方(比如表单)完成,这两个方法只是单纯完成赋值和取值的操作。四、构造方法•构造方法是一种特殊的方法,它只在新对象实例化的时候被自动调用。•定义原则:方法名称与类名称相同,没有返回值类型声明(void也不行,直接不写),同时构造方法也可以重载(有多个)。•方法的实例化:类名称对象名称=new类名称();注:类名称后面的()表示调用了构造方法,所以()中的内容要和某一个构造方法对应。•构造方法定义格式:Person类的构造方法定义如下:此时如果要实例化只能提供两个参数:说明:(1)如果一个类中没有明确的声明构造方法,编译后类会自动添加一个无参的构造方法,但当明确地声明了一个构造方法后,就不会再生成默认的构造方法了,即一个类中应保证至少有一个构造方法。(2)构造方法可以有多个,实现重载。五、匿名对象•匿名对象就是没有明确给出名字的对象,一般匿名对象只使用一次,而且匿名对象只在堆内存中开辟空间,而不存在栈内存的引用。比如下面的例子:因为没有对象名字无法再次调用,所以执行完成后只能等待被垃圾回收机制回收。匿名对象一般都是作为其他类实例化对象的参数传递的(或者普通方法的参数),实际上就是一个堆内存空间。六、String类•String类的两种实例化方式(1)直接赋值:Stringstr=”HelloWorld”;则str就是String类的对象(2)使用newString():Stringstr=newString(“HelloWorld”);该种方式也可以实例化,str是String对象。区别:直接赋值的方式中字符串值是一个匿名对象(开辟了堆空间),字符串名字指向该对象,但声明多个相同值的匿名对象时不会重复开辟堆空间(在字符串池中有了就不会再开辟),只有当值不同时才会开辟新空间,即多个相同值字符串栈空间值相同。newString()的方式每次都会开辟新空间,不管值是否相同,即即使字符串值相同,栈空间中地址值也不同。注意:字符串的内容不可改变:分析如下:也就是当改变一个字符串的值时,会重新开辟一块新堆空间存储新值,原来的空间和值被回收。•String的内容比较:(1)==:比较的是两个变量值是否相同(栈空间值是否相同),地址值相同(一个),内容肯定相等了。(2)equals():比较堆空间中的内容值是否相同,只比较内容不比较地址。所以如果想比较两个字符串相同要使用equals(),而不是==•常用方法:1、字符和字符串相互转换:(1)字符数组转换为字符串:结果:(2)获取指定位置的字符:(3)字符串转换为字符数组2、字节数组与字符串的转换(1)字符串转为字节数组,字节数组再转为字符串:结果:注:这种转换往往在编码转换和数据进行传输(IO或网络编程)时。3、字符串比较:4、字符串查找5、字符串替换:6、字符串截取:第二个,包含起始索引,不包含结束索引值。7、字符串拆分:(1)将字符串按照指定字符(串)进行拆分,之后放到字符串数组中。结果:(2)拆分部分字符串8、其他方法:七、this关键字•this的作用(1)调用本类中的属性和方法(2)this()调用本类的构造方法(3)this用来表示当前对象•调用本类的属性和方法:在类中使用:this.方法名()this.属性名()•使用this()调用构造方法:用法:this()只能放在其他构造方法中,并且是第一行•this表示当前对象this最重要的特点是表示当前对象,当前对象是指当前正在调用类中方法的对象。问题:如何比较两个对象是否相等?提示:字符串的比较只要判断字符串内容相等即可,对象比较只要判断对象中每个属性值都相等即可(如果两个对象的地址都相等了,肯定内容更相等了,因为他们实际上是一个内容)•两个对象进行比较的代码:调用的代码:八、static关键字•static修饰属性:使用static修饰的属性是全局属性(静态属性)在一个类中,如果一个属性值是公共的(不属于任何一个对象,但是各个对象可以使用),则可以声明为staticstatic修饰的属性放在全局数据区中。说明:关于内存区域:static修饰属性的访问:类名称.static属性所以访问时:Person.country=“B城”注意:虽然对象名字.static属性可以访问静态的属性,但是往往使用类名.去访问•static修饰方法:属于类的访问时使用:类名称.static方法说明:非static声明的方法(普通方法)可以去调用static声明的属性或方法,但是static声明的方法不能调用非static声明的属性或方法(普通属性或方法)。•举例:•理解main方法•举例:验证参数传递,输入的必须是3个,否则程序退出:九、引用传递•引用传递是整个Java的精髓所在,引用传递的意义是:同一块堆内存空间可以被不同的栈内存所指向,不同栈内存可以对同一堆内存进行内容的修改。•传递对象:如果引用传递传递的是对象,则对象中的属性值在方法中修改了,原来的属性值也会修改。下例中,传递给temp的是msg中的地址。内存分析:•字符串做参数传递:虽然字符串是对象(引用类型),但字符串值的每次改变,都是重新开辟新的堆空间(不是在原来的空间中修改值),导致值无法完成修改。内存分析:•对象引用传递,但属性中保存的是字符串:虽然修改的是字符串,但和上面例子不同的是,该字符串值保存在对象的属性中,修改字符串的值只是在对象所在的堆内存内部进行修改,整个对象没有重新开辟空间,还能够取到。•内存分析:简单:详细:十、代码块•根据位置不同代码块可以分为普通代码块、构造块、静态代码块和同步代码块4种。•普通代码块:放在方法中一段{}中,按顺序执行,但其中定义的变量只在代码块中有效。•结果:•构造块:放在类中的{}中定义,构造块优先于构造方法执行,每次实例化类时都会自动执行,会执行多次。•静态代码块:在类中定义,如果类中有主方法(main方法)则优先于主方法执行,在普通类中定义的优先于构造块执行,但不管有多少个对象产生,静态代码块只执行一次整个的优先顺序:静态代码块主方法构造代码块构造方法普通方法(普通代码块)构造代码块在对象每次实例化时都会自动执行,可以执行多次;静态代码块只执行一次。十一、内部类•内部类的基本定义:就是在一个类的内部继续定义其他内部结构类的情况。实例化内部类使用:外部类.内部类对象=new外部类().new内部类();实例化上面的内部类:•使用static定义内部类:如果一个内部类使用static定义,那么这个内部类就变为一个“外部类”,并且只能访问外部类中定义的static操作。使用如下形式获取内部类的实例化对象:外部类.内部类对象=new外部类.内部类();普通的内部类是先实例化外部类再实例化内部类,静态内部类直接使用外部类.内部类访问,不需要先实例化外部类,Map.Entry属于静态内部类(其实是个接口)•在方法中定义内部类访问方法中定义的参数或者变量:
本文标题:Java面向对象(基础)
链接地址:https://www.777doc.com/doc-1883260 .html