面向对象编程 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

JAVA入门第二季 第一章 类和对象的更多相关文章

  1. Java入门第二季第一章类和对象知识点

    Java 中的 static 使用之静态方法 1. 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员.如: 如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问 ...

  2. JAVA入门第二季(mooc-笔记)

    相关信息 /** * @subject <学习与创业>作业1 * @author 信管1142班 201411671210 赖俊杰 * @className <JAVA入门第二季&g ...

  3. Java入门第二季学习总结

    课程总概 该门课程作为java入门学习的第二季,是在有一定的java基础上进行的进一步学习.由于该季涉及到了java的一些核心内容,所以相对第一季来说,课程难度有所提升.大致可将该季的课程分为五部分: ...

  4. java 入门 第二季1

    (1). 类和对象(java 语言是面向对象的) 1). 类是对象的类型 具有相同的属性和方法的一组对象的集合 类:属性和方法 定义类: 类名 属性 方法 //class为关键字 2.定义类时,首字母 ...

  5. 《Java入门第二季》第一章 类和对象

    什么是类和对象 如何定义 Java 中的类 如何使用 Java 中的对象 Java中的成员变量和局部变量1.成员变量:在类中定义,描述构成对象的组件. 2.局部变量:在类的方法中,用于临时保存数据. ...

  6. 《Java入门第二季》第四章 多态

    Java 中的多态1.引用的多态:意思就是父类的句柄既可以持有本类的对象,也可以持有子类的对象. 2.方法的多态:注意点是当父类句柄持有子类对象的时候,无法调用子类特有的方法. 多态中的引用类型转换1 ...

  7. Java入门 第二季第三章 继承

    这是我学习慕课网Java课程的笔记,原视频链接为:http://www.imooc.com/learn/124 3-1 Java 中的继承  ★ 概念:继承是类与类的一种关系,是一种 "is ...

  8. java 入门 第二季4

    1. 多态 继承是多态的实现基础 引用的多态 父类的引用可以指向本类的对象 父类的引用可以指向子类的对象 方法的多态 创建本类对象时,调用本类方法 2种是调用子类的方法或继承的方法 子类中添加独有的方 ...

  9. 慕课笔记-Java入门第二季

    1.java对象的使用 (1)创建对象 类名 对象名=new 类名(); (2)使用对象 引用对象的属性:对象名.属性; 引用对象的方法:对象名.方法(); Note: ①Java会给成员变量赋初始值 ...

随机推荐

  1. WPF里的报警闪烁效果

    <esri:MarkerSymbol x:Key="FlashMarkerSymbol" OffsetX="41" OffsetY="41&qu ...

  2. 备用帖子1Shell(Shell R语言)

    shell========================== echo 1 > /proc/sys/vm/drop_caches 清理内存 free -m du -h --max-depth= ...

  3. gdb多进程调试

    http://blog.csdn.net/nbabn/article/details/24984501 http://blog.csdn.net/zb872676223/article/details ...

  4. Java中ExecutorService和CompletionService区别

    我们现在在Java中使用多线程通常不会直接用Thread对象了,而是会用到java.util.concurrent包下的ExecutorService类来初始化一个线程池供我们使用. 之前我一直习惯自 ...

  5. winform自定义按钮菜单

    //填写其他报表按钮        private void btnWriteRep_Click(object sender, EventArgs e)        {            try ...

  6. js String对象中常用方法小结(字符串操作)

    1.charCodeAt方法返回一个整数,代表指定位置字符的Unicode编码. strObj.charCodeAt(index) 说明: index将被处理字符的从零开始计数的编号.有效值为0到字符 ...

  7. python核心编程第六章练习6-10

    6-10.字符串.写一个函数,返回一个跟输入字符串相似的字符串,要求字符串的大小写反转,比如,输入“Mr.Ed”,应该返回“mR.eD”作为输出.[答案]代码如下: #!/usr/bin/env py ...

  8. mysql数据库与oracle数据库的切换

    1.从mysql数据库中导出ambition(数据库名)结构和数据的ambition.sql文件. 2.将ambition.sql用Power Designer转换成mysql数据模型. 给模型起个名 ...

  9. django rest framework csrf failed csrf token missing or incorrect

    django rest framework csrf failed csrf token missing or incorrect REST_FRAMEWORK = { 'DEFAULT_AUTHEN ...

  10. Android基础:Activity

    Activity基本概念 Activity代表活动窗口,通过Context加载页面显示内容,每一个Activity都必须在manifest.xml中注册. 一个应用程序由多个界面构成,回退栈,活动窗口 ...