zoukankan      html  css  js  c++  java
  • 二、Java面向对象(3)_类和对象

    2018-04-29

     

    类和对象

     

    一、什么是抽象

      在计算机科学中,抽象是一种过程,在这个过程中,数据和程序定义的形式与代表的内涵语言相似,同时隐藏了实现细节。

      抽象:一个概念或者想法不和任何特定的具体实例绑死。

        

      简单地说:“抽象只从正确的角度,透露对象的某些相关细节。”

      在面向对象编程理论中,抽象涉及到定义抽象对象的语言基础,它到底如何工作、如何获取和改变状态,并与系统中的其他对象进行“交流”。

      抽象在任何编程语言中的许多方面起作用。从创建子程序到定义接口来,生成低级语言调用,例如设计模式

      

      参考:

      http://www.cnblogs.com/keeplearnning/p/7021600.html

    二、对象和类的关系

      1.对象

        状态(属性)

        行为(功能)

     ---------------------------------------------------------------------------------------------------------------------------

        在现实中任何存在的事物都可以看成对象 通过其属性进行分类

        比如生物包括动物等不同种类,动物又分猫科等 猫科又分特定物种
        而每一个对象都是一个单独的个体,就好像世界上不存在两个你

        在程序中也是如此,类的继承就好像生物包括动物、动物包括猫科这样
        而对象也是通过不同的类来创建出来的单独的个体

        类之间只存在继承关系(extends ) 就和上边说的 生物包括动物 动物包括猫科
        而接口相当于拥有能力 一个生物可以拥有很多能力 但是他只属于一个类别
        所以说只有接口才可以implements

        对此 你也可以理解为extends过来的是父母教的 implements 是自学成才。

    ------------------------------------------------------------------------------------------------------------------------------

        通过对多个同类型的对象分析,我们可以把对象抽象成类。

      2.类

        具有相同属性(状态)和行为(功能)的对象的抽象就是类。  类实际上是一种数据类型。

        因此,对象的抽象是类,类的具体化是对象(类的实例化就是对象)。

     

        类具有的属性也就是对象的状态,使用成员变量定义,用来封装数据。

        类具有的功能也就是对象的行为,定义在方法里面。

     

        类是对象的模板/类型。创建一个对象,就是使用类作为构建该对象的基础。描述类少不了对象,描述对象也少不了类。“先有鸡还是先有蛋”。

        在面向对象编程里,先有类才有对象,如果没有类对象无法实例化。

        对象是类的实例,类是对象的模板。(根据模板来创建实例)

    三、类的定义

      [修饰符] class 类名{

        //定义成员变量(字段/field)

        //定义成员方法

      }

        

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      定义类的注意事项:

      1)如果类使用了public修饰符,则当前文件名必须与类名相同。

      2)类名最好使用名词表示,因为类表示一类事物。类名首字母大写,如果是多个单词组成则使用驼峰表示法命名,如:EmployeeSetting

      3)在面向对象学习过程中,专门为描述对象提供一个类,该类不需要main方法,我们再专门定义一个测试类用来运行程序。

     

    四、对象基本操作

     

    a)对象的创建和使用

      1.(根据类)创建对象的语法:

        类名  变量 =  new 类名();

      2.给字段设置值

        对象变量.字段名 = 该类型的值;

      3.获取字段值

        该字段类型 变量 = 对象变量.字段值;

      4.通过对象调用方法

        对象变量.方法名([实参]);

      

    b)对象的实例化过程

      先为对象分配空间,并按属性类型默认初始化
      ps:八种基本数据类型,按照默认方式初始化,其他数据类型默认为null

      

      不同类型的成员变量的初始值:

      

      对象实例化内存分析:

      

    c)对象的生命周期

       对象的打印操作:object的toString方法

       对象的比较操作:“==”对于基本数据类型比较的是值,对于引用类型比较的是内存中的地址值

                如果对象拥有完全相同的数据,想让他们相等,使用object的equals方法

       对象的生命周期:

        开始:使用new创建对象的时候,内存中就会分配一个空间

        结束:当堆中的对象没有被任何变量引用,此时改对象就成了垃圾,等着被垃圾回收器(GC)回收垃圾,当改垃圾被回收的时候,对象就被销毁了。(回收垃圾的目的是为了释放更多的内存空间)

     

    d)匿名对象

      没有名称的对象,创建对象之后没有赋给一个变量。

      new Servant();//匿名对象只是在堆中开辟一块新的内存空间,但是没有把该空间的内存地址赋给任何变量

      因为没有名称,所以匿名对象只能使用一次。

    ------------------------------------------------------------------------------------------------------------

    普通申明一个对象是这样的
    A a = new A();
    那么这个时候a就是类A的一个对象,这个对象名字就是a
    再来看下面一个例子:
    method(A a);
    整理method是一个方法,他需要传递一个对象来作为参数,那么这个时候有2种方法:
    方法1:
    A a =new A();
    method (a);
    方法2:
    method (new A());

    方法2中new A()就是一个匿名对象,他没有名字。这样可以理解了吧。

    --------------------------------------------------------------------------------------

      匿名对象的用法:

      1)当对象的方法只调用一次时,可以用匿名对象来完成,这样写比较简化。

     

        如果对一个对象进行多个成员的调用,就必须给这个对象起个名字。

     

       2)匿名对象使用方法二:可以将匿名对象作为实际参数进行传递。

     

     

    e)学生缴费案例

      学生类(Student)有两个字段:name(名字)和isFee(是否交学费的状态),有一个方法交学费(fees)。

      每一个学生都是通过Student类new出来的一个对象,现在创建一个数组存放多个学生对象,再判断数组中的学生是否已经交费,如果没有则调用交学费的方法。

     

    代码实现:

     1 class Student
     2 {
     3     String name;//名字
     4     boolean isFee = false;//是否交费,默认未交费
     5 
     6     //定义交学费的方法
     7     void fees(){
     8          isFee = true;
     9     }
    10 }
    11 
    12 
    13 //测试类
    14 public class TestDemo
    15 {
    16     public static void main(String[] args){
    17         
    18         Student s1 = new Student();
    19         s1.name = "李白";
    20         s1.isFee = true;
    21 
    22         Student s2 = new Student();
    23         s2.name = "鲁班";
    24         
    25 
    26         Student s3 = new Student();
    27         s3.name = "张三";
    28         s3.isFee = false;
    29 
    30         Student s4 = new Student();
    31         s4.name = "李军";
    32         s4.isFee = true;
    33 
    34         //创建数组用来存放多个学生对象
    35         Student[] arr = new Student[] {s1,s2,s3,s4};
    36         //使用for-each循环迭代数组元素
    37         for(Student ele : arr){
    38             //System.out.println(ele.name + "," +ele.isFee);
    39 
    40             //判断是否交费,如果没有交费则调用fees方法
    41             if(!ele.isFee){
    42                 ele.fees();
    43             }
    44         }
    45         for(Student ele : arr){
    46             System.out.println(ele.name + "," +ele.isFee);
    47         }
    48 
    49     }
    50 }

     输出结果:

     内存分析:

  • 相关阅读:
    EL+Serilog日志
    HttpClientFactory-向外请求的最佳
    Autofac依赖注入
    .Net Core MemoryCache
    时间复杂度和空间复杂度
    中间件-异常处理
    依赖注入-1
    使用并发集合
    安卓刷机&root
    Mac Android Studio 常用快捷键大全
  • 原文地址:https://www.cnblogs.com/sunNoI/p/8969378.html
Copyright © 2011-2022 走看看