尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

7.javase-面向对象

7.javase-面向对象 面向过程和面向对象的区别面向过程主要关注的是实现的具体的过程因果关系优点对于业务逻辑比较简单的程序可以达到快速开发前期投入成本较低缺点采用面向过程的方式开发很难解决非常复杂的业务逻辑而且也很难关注到每个点的细节软件耦合度高软件拓展力差组件代码复用性差面向对象主要关注的是对象【独立体】的能完成那些功能。优点耦合度低扩展力强。组件复用性强缺点前期投入成本高需要进行独立抽象大量的系统分析和设计。面向对象的三个生命周期OOA - 面向对象分析OOD - 面向对象设计OOP - 面向对象编程类与对象要想使用OOP一定要清楚对象的三个主要特性:对象的行为(behavior): 可以对对象施加哪些操作或可以对对象施加哪些方法?对象的状态(state): 当施加那些方法时对象如何响应?对象标识(identity)如何辨别具有相同行为与状态的不同对象?对象的状态改变不是自发的必须通过调用方法来改变。如果是自发改变只能说明封装遭到了破坏。作为一个类的实例每个对象的标识永远是不同的状态常常也存在着差异。类的定义类是对一个集合的抽象、是对事物分析结构后抽象出来的模板。现实世界中事物A和事物B之间具有共同的特征进行抽象总结出的一个模板这个模板被称为类。语法结构[修饰符列表] class 类名{ //属性(对事物状态信息的抽象) 属性的类型为java所有的数据类型 [属性修饰符] 数据类型 变量名; //这里也可以直接赋值初始化 //方法 [属性修饰符] 返回值类型 方法名(参数列表){ //方法体 } }java中所有的类都是引用类型识别类的简单规则是在分析问题的过程中寻找名词而方法对应着动词。例如在订单处理系统中有这样一些名词:商品(Item)订单(Order)送货地址(Shipping address )付款(Payment)账户(Account)这些名词很可能成为类Item、Order等。接下来查看动词:商品被添加到订单中订单被发送或取消订单货款被支付。对于每一个动词如:“添加”、“发送”、“取消”以及“支付”都要标识出主要负责完成相应动作的对象。例如当一个新的商品添加到订单中时那个订单对象就是被指定的对象因为它知道如何存储商品以及如何对商品进行排序。也就是说add应该是Order类的一个方法而Item对象是一个参数。对象对象是实际存在的个体是从类中创建出来的实例。类与对象的关系类-----实例化------对象对象又被称类的为实例instance对象—抽象----类类描述的是对象的共同特征这些特征包括类的状态—对事物**状态信息(啥样子)的抽象—类的属性类的动作信息—对事物能力能干啥**的抽象 —一个类的方法不同对象对应的状态的数值和动作的结果是可能不一样的对象的创建和使用静态变量可以通过类直接访问, 用static 修饰存储在方法区内存当中。实例变量成员变量、域不能通过类直接访问的类的变量不创建对象这个实例变量在JVM中堆内存中不会在内存中分配区域。如果没有手动赋值系统赋默认值。数据类型 默认值--------------------------------------------byte,short,int,long0double,float0.0booleanfalsechar\u0000 引用数据类型null(空值)对象的创建一个类可以实例化N个对象实例化是通过new关键字去创建的,语法为:引用数据类型 变量名new方法名(实参数列表...);//这里的这个变量名 称之为对象的引用所以叫做对象引用变量。 方法名成和类名一致。方法区: 字节码文件class文件在类加载时候将其放在内存的方法区当中只存一份栈区方法代码执行的时候会给该方法分配内存空间在栈空间压栈。主要用来存储方法的局部变量。堆区new对象在堆内存中存储。new操作符的返回值也是一个引用。下列语句:Date deadline new Date();有两个部分。表达式new Date()构造了一个Date类型的对象并且它的值是对新创建对象的引用这个引用存储在变量deadline中。局部变量不会自动地初始化为null而必须通过调用new或将它们设置为null进行初始化。代码内存分析1TestObj1.java里的代码publicclassTestObj1{publicstaticvoidmain(String[]args){inti10;//i 局部变量//这里 s 是局部变量StudentsnewStudent();s.noi;//再次创建变量StudentstunewStudent();System.out.println(s.no);System.out.println(stu.no);}}Student.java里的代码publicclassStudent{intno;intage;booleansex;Stringaddr;}内存分析图总结对象的实质是通过new运算符在堆内存中开辟的内存空间这块内存空间的地址逻辑地址赋给一个变量这个变量称之为引用变量。类的成员变量实例变量随着类被实例化后在堆内存中对应的实例对象中存储。每个new出来的对象对应内存中的一份内存。java语言中没有指针程序员不能直接操作堆内存。程序员只能通过“引用”去访问堆内存当中的实例的变量。访问变量格式去读数据对象引用变量.对象变量名 修改数据对象引用变量.对象变量名 值;代码内存分析2TestObj2.java里的代码publicclassTestObj2{publicstaticvoidmain(String[]args){//定义一个局部变量u数据类型为User的引用。UserunewUser();System.out.println(u.no);System.out.println(u.name);System.out.println(u.addr);u.no110;// jack是一个String对象u指向的对象(new出来的User的对象)的属性name中存储的是jack的内存地址也就是说这个对象的name属性也是个引用u.namejack;u.addrnewAddress();System.out.println(u.name居住在哪个城市u.addr.city);System.out.println(u.name居住在哪个街道u.addr.street);System.out.println(u.name邮编是u.addr.zipcode);u.addr.city北京;u.addr.street朝阳街道区;u.addr.zipcode11111111;System.out.println(u.name居住在哪个城市u.addr.city);System.out.println(u.name居住在哪个街道u.addr.street);System.out.println(u.name邮编是u.addr.zipcode);Addressau.addr;a.city西安;System.out.println(u.addr.city);System.out.println(a.city);}}classUser{//类的属性的类型可以为java的所有数据类型intno;//String 是一个对象引用类型Stringname;//这里表示这个User类的属性name是一个String的引用。//addr 是一个Address对象的引用类型Addressaddr;//这里表示这个User类的属性addr是一个Address的引用类型}classAddress{Stringcity;Stringstreet;Stringzipcode;}内存分析图JVM内存总结:jvm主要包括三块内存空间分别为堆空间栈空间方法区。堆和方法区空间都各存在一份而栈空间是一个线程一个栈空间。当方法调用的时候该方法所需要的空间在栈空间内存中分配称为压栈。方法执行结束之后该方法所属的内存空间释放称之为弹栈。在栈空间主要存储方法的局部变量。当程序开始运行时方法的代码片段以及整个类代码片段都会存储到方法区当中在类加载的时候这些代码片段会载入。在程序执行的过程中使用new运算符创建的对象会存储在堆内存中主要存储的是对象的实例变量。类的静态变量存储在方法区当中。当堆内存中java对象没有更多的引用指向它或者此对象无法访问时会被垃圾回收器回收。空指针异常空引用访问“实例”相关的数据时候会发生空指针异常publicclassTestObj3{publicstaticvoidmain(String[]args){UserunewUser();System.out.println(u.no);//0unull;//会抛出异常: java.lang.NullPointerException//空引用访问“实例”先关的数据时候会发生空指针异常System.out.println(u.no);//0}}总结:对象使用new运算符在堆内存中开辟的内存空间。引用是一个变量保存了指向堆内存中的对象的内存地址。创建一个对象没有用变量接受称之为匿名对象。如new Test().add()。匿名对象只能使用一次使用完后立即被销毁。构造方法构造方法/构造器/Constructor构造方法语法结构[修饰符列表]构造方法名(形式参数列表){//方法体}使用细节构造方法没有返回值。构造方法名称和类名必须保持一致。当我们在类中没有写构造器使这种情况下,编译器在编译的时候会默认加上一个无参且方法体为空的构造方法。但是,如果类的构造函数被重写了(类中有有参构造方法), 这时编译器就不会再给它默认加上一个无参且方法体为空的构造函数.可以理解为无参的构造方法被覆盖了。如果类中提供了至少一个构造器但是没有提供无参数的构造器则在构造对象时如果没有提供参数就会被视为不合法。new无参构造器创建对象会报错。建议开发中手动为当前类创建无参构造方法因为无参构造方法太常用了。构造方法不能被static、final、synchronized、abstract和native修饰构造方法支持重载机制。使用this(形参)可以调用其他构造方法必须放在构造方法第一行。构造方法的作用初始化实例变量的内存空间给实例变量赋值。publicclassAccount{//账号privateStringaccount;//余额privatedoublebalance;publicAccount(){//无参构造方法初始化实质//account null;//balance 0.0;}publicAccount(Stringaccount){this.accountaccount;}publicAccount(Stringaccount,doublebalance){this.accountaccount;this.balancebalance;}}在执行构造器之前先执行赋值操作。当一个类的所有构造器都希望把相同的值赋予某个特定的实例域时这种方式特别有用。初始化实例域时初始值不一定是常量值也有可能是一个代码块方法。this关键字this可以翻译为“当前对象”其实代表当前正在执行这个行为/动作的对象。this的内存分析this是一个引用是一个变量this变量中保存了内存地址指向了自身对象this 存储在JVM堆内存对象内部。每一个对象的内存中都有this且不相同。为什么要使用this变量在代码运行时候当某个对象执行某个实例方法(执行动作)过程中想访问当前对象一些属性或别的实例方法。我们一般采用的方式引用.xxx。但是这个引用在不同对象访问这个实例方法必须代表对应的对象(比如多态)new 出来的对象无法满足。 所以this关键字诞生了。所以this代表当前正在执行这个行为/动作的对象。在每一个方法中使用this关键字接受隐式参数。this 是可以省略的, 什么时候不能省略用来区分局部变量和实例变量的时候“this.”不能省略。this可以用在哪里可以使用在实例方法当中代表当前对象【语法格式this.】可以使用在构造方法当中通过当前的构造方法调用其他构造方法【语法格式this(实参)】this()只能出现在构造函数第一行。publicclassThisTest2{publicstaticvoidmain(String[]args){ThisTest2.doSome();ThisTest2t2newThisTest2();t2.doSome();t2null;//带有static的方法其实既可以采用类名方式访问也可采用引用方式访问。但是即使采用引用方式的访问实际上执行的时候//和引用指向的对象无关。t2.doSome();//这里不会出现空指针异常。}publicstaticvoiddoSome(){System.out.println(do some);}}
返回列表