• JAVA入门第二季 第一章 类和对象


    面向对象编程 Object Oriented Programming OOP

    第一、什么是类和对象

      在具体说明类和对象之前,先说说别的。

      眼睛在人类身体上最为有用的器官。如果一个没有了眼睛,这个人与世界的联系会大大减小。因为人脑主要是通过眼睛来获取数据的;当然也有其它器官获取的哦数据帮助我们更加准确的描述我们所看到的现象。眼睛通过光线作用,把客观物理世界投影到人脑。人脑是由亿万多脑细胞组成。脑细胞神经元有反馈机制,当级联的脑脑细胞神经元多起来后,通过反复的实验和检测,使得大脑得到对客观世界有更准确的描述和解释(人脑能理解的)。  

      学过机器学人工神经网络理论的人都知道ALVINN系统。ALVINN系统是一个三层网络,有一个巨大的输入层(960个输入神经元). ANN的输入是一个30x32像素的图象,输出是车辆行进的方向。ALVINN系统使用反向传播算法来学习驾驶汽车(上图),它的最高时速达到每小时70英里。神经网络显示在图的左边,输入的摄像机图像在它的下边.左图显示了来自车前摄像机的图像是如何被映射到960个神经网络输入的,这些输入又前馈到4个隐藏单元,再连接到30个输出单元。网络输出编码了推荐的驾驶方向。右图显示了网络中一个隐藏单元的权值。进入这个隐藏单元的30´32个权值显示在大的矩阵中,白色的方框表示正权值而黑色的方框表示负权值。从这个隐藏单元到30个输出单元的权值被画在这个大矩阵上方的较小矩形中。从这些输出权值可以看出,激活这个隐藏单元会促进向左转。 下面是三个图。

      

      人工神经网络(Artificial Neural Networks——ANNs)受到生物学的启发,生物的学习系统是由相互连接的生物神经元组成的异常复杂的网络
        •人脑的构成,大约有1011个神经元,平均每一个与其他104个相连
        •神经元的活性通常被通向其他神经元的连接激活或抑制
        •最快的神经元转换时间比计算机慢很多,然而人脑能够以惊人的速度做出极其复杂的决策
        •很多人推测,生物神经系统的信息处理能力一定得益于对分布在大量神经元上的信息表示的高度并行处理
      所以,我们翻过来说明人脑的学习方式更高级与ANNs。
     
      回到类和对象,我通过举人工神经网路例子是为了谁明什么?对象就是我们的感官感知到的数据,是客观存在的。而类则是我们人脑对这个客观存在对象的描述。这个描述行为、描述过程是个学习的过程,是不断的实验和检验过程。描述的越准确,我们对客观世界的影响力越大。有点扯远了,总之,一个编程语言注定从一开始的简单数据类型,例如int、float、array、structure,到高级的描述形式--
         实现复杂的功能、描述复杂的现象,我们需要更好的、更强有力的描述工具。在科学界,数学就是描述工具。这是题外话。

    第二、如何定义JAVA中的类

    分三步走:1)首先定义一个类,要求类名,首字母为大写;具体方法是先建一个工作空间>工程.>包>类

                  2)在定义该类都什么属性,即成员变量

           3)方法(JAVA中的“方法”,其实与C语言中的“函数”相同),说明该类都有什么功能

    例如:

      public class Telphone(){

        String name="世界杯";

        static String className="JAVA开发一班";//静态变量的声明和赋值。

        //属性(成员变量)有什么

        float screen;

        float cpu;

        float mem;

        //方法 干什么

        void call{

          System.out.println("Telphone 有打电话的功能!");

        }

        void sendMessage{

          System.out.println(“screen”+screen+"cpu"+cpu+"mem"+mem+"Telphone 有发短信的功能!");

        }

        //无参的构造方法

        public Telphone(){

          System.out.println("无参构造的构造方法!");

        }

        //有参的构造方法

        public Telphone(float newScreen,float newCpu,float newMem){

          screen=newScreen;

          cpu=newCpu;

          mem=newMem;

          System.out.println("无参构造的构造方法!");

        }

        public static void main(String[] args){

          System.out.println(Telphone.className);

          //下面的方法是不可以用的。

          System.out.println();

        }

    }

    第三、如何使用JAVA中的对象

    使用对象的步骤:

      1#创建对象

        类名 对象名 = new 类名();---假如有Telphone类,则创建对象:

        Telphone phone = new Telphone();

        这个创建过程是实例化的。对象是存储在内存当中的。

      2#使用对象

        引用对象的属性:对象名.属性

        phone.screen = 5;//给screen属性赋值5

        引用对象的方法(函数):对象名.方法();

        phone.sendMessage();//调用sendMessage()方法

      C语言中(《C Primer Plus》Chapter14.Sructure and Other Doata Forms)中提到 ,将声明结构体视为Template(模板),然后用这个结构体定义个结构体变量,然后对这个变量进行初始化和应用。Java中的“类”的声明和使用方法,我认为与C的结构体使用法相似的,也是先定义个类,然后用这个类新定义一个新类,对这个类,进行操作。

      模板类,起到模范、原型的作用。如上面手机类的定义和使用,假如我有两个不同配置的手机,那么,我们新定义的两个手机类其变量值和方法功能可能不尽相同的。

    第四、JAVA中的成员变量和局部变量

    1)JAVA中的成员变量和局部变量

      1、成员变量

        在类中定义,用来描述对象将要有什么。

        默认时候,其值为零。float 类型变量赋值时,后面加 f。

      2、局部变量

        在类的方法中定义,在方法中临时保存数据。

    2)成员变量和局部变量的区别

      a、作用域不同

        局部变量的作用域仅限于定义它的方法。

        成员变量的作用域在整个类内部都可见的。

       通俗讲,作用域就是跟动物领地的概念。非洲狮子群可以袭击斑马、角马等,但反过来斑马、角马一般不会主动惹非洲狮子群。

      b、初始值不同

        定义成员变量的时候有默认初始值;

        定义局部变量的时候没有默认初始值。

      c、同一个方法中,不允许有同名局部变量,

        不同方法中,可以有相同名局部变量。

      d、两类变量同名时,局部变量有具有更高的优先级----就近原则

        

    第五、JAVA中的构造方法  

      1、构造方法:  

        a、使用new+构造方法  创造一个新的对象,从而实例化

        b、构造方法是定义在Java类中的一个用来初始化对象的方法

          为什么要用构造方法来初始化对象?

          类中定义的变量和方法太多,以致一个个拷贝和赋值变量和方法变得繁琐且容易出错。

          如果我们把这个繁琐且容易出错的初始化过程,让电脑自动完成,节省了程序员的脑力,提高编写程序的准确性和快速实现能力。 

        c、因此,目前为止,一个类包括有:变量、构造方法、方法、

          构造方法,从名称就可以看出是一种方法,是特殊的方法,专门用来实现初始化类用的。

      2、构造方法与类同名且没有返回值

          构造方法要在类中包含。

      3、无参构造方法

      4、有参构造方法

        有参和无参构造方法可以并存的。

      5、但没有指定构造方法时,系统会自动添加无参的构造方法。

          这个特征也是为了,节约成本,自动化”生产线“。

      6、当有指定构造方法时,无论是有参、无参的构造方法,都不会自动添加无参的构造方法

        7、构造方法的重载:方法名相同,当参数不同的多个方法,调用时会自动根据不同的参数选择相应的方法

        其实一个类同时有无参的构造方法和有参的构造方法,其实就是方法的重载。

        问题:方法的重载,有什么作用?

           提供多种选择,

      8、构造方法不但可以给对象的属性赋值,还可以保证给对象的属性赋一个合理的值

        如何实现呢?有参构造方法内,加入条件判断,从而解决传值不正确的问题。

        

    第六、JAVA中的static 使用之静态变量

          “大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立。然而在某些时候,我们更希望该类所有的对象共享      同一个成员。此时就是 static 大显身手的时候了!!

          Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用直接  

       访问,也可以使用对象名进行访问。当然,鉴于他作用的特殊性更推荐用类名访问~~

          使用 static 可以修饰变量、方法和代码块。”

      1、静态变量及使用方法

        公有静态变量的使用方法:public static String className="JAVA开发一班";

        私有静态变量的使用方法:private static String className="JAVA开发一班";

        推荐类名访问,所以,利用上面的代码段的定义,可以这样调用静态变量:System.out.println(Telphone.className);

      2、静态方法、静态类

        与静态变量一样,我们也可以使用 static 修饰方法,称为静态方法或类方法。其实之前我们一直写的 main 方法就是静态方法。 

         a、 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后

        通过对象来访问非静态变量.如下:

        pbulic  class HelloWorld{

          String name="世界杯";

          static String hobby="worldcup";

        }

        public static void print(){

           //创建类的对象

           HelloWorld hello=new HelloWorld();

           //通过推向来实现在静态方法中  调用  非静态变量

           System.out.println("喜欢"+hello.name+"!");//非静态

           System.out.println("I love "+hobby+" !");//静态

        }

        b、 在普通成员方法中,则可以直接访问同类的非静态变量和静态变量。

        public void show(){

          System.out.println("喜欢"+name+"!");//非静态

          System.out.println("I love "+hobby+" !");//静态

        }

        c、 静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法。

        public void show(){

          System.out.println(我爱世界杯!");

        }

        public static void print(){

          System.out.println(2016世界杯!");

        }

        public static void main(String[] args){

          //普通成员方法必须通过对象来调用

          HelloWorld hello=new HelloWorl();

          hello.show();

          //可以直接调用静态方法

          print();

        }

    第七、静态初始化块

      在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。

      需要特别注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量

      程序清单:

    public class HelloWorld{

      int num1;

      int num2;

      static int num3;

      public HelloWorld(){  //构造方法

        num1=91;

        System.out.println("通过构造方法为变量num1赋值");

      }

      {//初始化块

         num2=74;

        System.out.println("通过初始化块为变量num1赋值");

      }

      {//静态初始化块

         num3=83;

        System.out.println("通过静态初始化块为变量num1赋值");

      }

      public static void main(String[] args){

        HelloWorld hello=new HelloWorld();

        System.out.println("num1:" + hello.num1);

        System.out.println("num2:" + hello.num2);      

        System.out.println("num3:" + num3);

        HelloWorld hello2=new HelloWorld();

      }

    }

       通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。由于静态初始化块只在类加载时执行一次,所以当再次创建对象 hello2 时并未执行静态初始化块。

    学习视频来源:www.imooc.com

  • 相关阅读:
    Emacs使用gnus收发邮件时nnfolder相关介绍
    emacs 播放mp3
    你真的会写二分查找吗?
    数独的经典case
    MySQL处理千万级数据查询、分页
    Mysql Replication 机制
    redis位图(bitmap)常用命令的解析
    由浅入深了解线程池之源码初探
    BlockingQueue家族成员一览
    由浅入深了解线程池之初识线程池
  • 原文地址:https://www.cnblogs.com/Micheal-G/p/4351377.html
Copyright © 2020-2023  润新知