面向对象

首先面向对象是一种思想,要学会如何用这种思想去创建对象和使用别人已经创建好的对象!!!

要想创建对象需要一个类

类和对象是依赖关系,对象是根据类创建的

注意: 一般情况下会创建一个包,创建两个类,一般一个用来编写类中的对象以及成员变量!!!

另外一个用来测试!!!

可以把类可以想成一个设计图

例如:我有一个《同学》叫《彭于晏》,《升高七尺》,平时《爱好是普性》,然后和《程冠希打架》。

《》中包裹的都是对象,然后用类把这个人构造出来;

类和对象

类的组成

  1. 成员变量 首先定义成员变量和之间定义变量是差不多的 但是!!!!!(注意成员变量是写在类中,方法外的)!!!

  2. 成员方法 : 和之前学习到的方法差不多例如

    public static void main  (注意 !成员方法是没有static这个关键字的 !!!)
  3. 然后定义对象的格式是

    3.1 类名 对象名 = new 类名();!!!注意new其实和之前学到的数组new是一样的,这个new也是在堆内存中开辟一个空间,然后将地址值赋值给对象!!!

    3.2 这个和之前调用别人写好的,例如Scanner,和Redome(就是召唤精灵)是一样的,一样通过

类名 对象名 = new 类名(),这种格式创建!!!!

  1. 举个栗子

    package com.heima.Test04;
    //首先创建一个类
    public class StudentDemo1 {
       //成员变量
       String name = "程冠希";
       int age = 18;
    //成员方法
       public void eat() {                        一个类中可以创建多个方法!!!
           System.out.println("吃饭");
      }

       public void sleep() {
           System.out.println("睡觉");
      }

       public void study() {
           System.out.println("学习");
      }
    }
    这个是类
    static .sout.println("--------------------------------------------------")
    这个是用另外一个类进行创建对象!@!!!!!!!
    package com.heima.Test04;

    import com.heima.test.Student;

    public class StudentDemo1Test {
       //首先测试方法 main方法
       public static void main(String[] args) {
           //格式 类名 对象名 = new 类名()
           StudentDemo1 stu = new StudentDemo1();
           //类创建成功就可以调用里面的,成员变量以及,成员方法
           System.out.println(stu.name);
           System.out.println(stu.age);
           stu.eat();
           stu.study();
      }
    }
    这个就是最基本的一个编写
    在一个类中可以创建多个对象
    static .sout.println("--------------------------------------------------")
           //格式 类名 对象名 = new 类名()
           StudentDemo1 stu1 = new StudentDemo1();
    但是注意这个时候,再去用里面的成员变量和成员方法,依旧会和上面的值一样,因为这个值已经在类中赋值了
    是固定死的,这个时候调用只会和stu输出一个同样的结果
       
  2. 细节,不应该在类中给成员变量赋值,(不推荐)

    就相当于默认值,调用就会输入这个默认值,除非已经确实数据,可以这样写

    1. 创建对象之后赋值

          //成员变量,中不要赋值
         String name = ;
         int age = ;

      static .sout.println("--------------------------------------------------")
         
       //格式 类名 对象名 = new 类名
             StudentDemo1 stu = new StudentDemo1();
             //类创建成功就可以调用里面的,成员变量以及,成员方法
      //那么直接输出这种格式就不行了!!!!!
             //System.out.println(stu.name);
             //System.out.println(stu.age);
      格式应该是  
      对象名 . 成员变量进行手动赋值!!
      stu.name"张三"
      stu.age(26)
            stu.eat();
             stu.study();
      static .sout.println("--------------------------------------------------")
      //创建多个对象的时候也是手动赋值
          StudentDemo1 stu1 = new StudentDemo1();
      stu.name"彭于晏"
      stu.age(16)
      stu.eat();
      stu.study()
         手动输入要录入的值然后再
  3. 成员变量和成员方法是平级关系!!!!1

  4. 面向对象的内存图

    8.1 :首先第一种情况,当在测试类中只定义了一个对象时!

    第一步:是在方法区中先载入一个TestClass字节码文件然后里面有个main方法

    第二步 :在方法区中然后加载被测试的字节码文件class 里面有成员变量以及成员方法

    第三步:jvm虚拟机自动运行然后将main方法进入栈内存,然后执行里面代码,

    首先创建一个对象,new一个对象会在堆内存中开辟一个空间,产生地址值,然后地址值赋值给对象,

    第四步:在main方法中如果运行改变堆内存中某一个值的时候,是用对象名点然后进入堆中找到对应名称进行赋值 然后输出

    第五步:main方法中更改值之后如果运行成员方法,那么久调用堆内存中特有的一一个专门放置方法的一部分空间!!!!!!(记住方法不调用不执行!!!)然后成员方法进栈,运行完方法中的程序之后结束后弹栈

    第六步 main方法结束,然后main方法执行弹栈!!!!就完了

     

8.2 ;首先第二种情况,当在测试类中定义了两个对象时!

第一步:是在方法区中先载入一个TestClass字节码文件然后里面有个main方法

第二步 :在方法区中然后加载被测试的字节码文件class 里面有成员变量以及成员方法

第三步:jvm虚拟机自动运行然后将main方法进入栈内存,然后执行里面代码,

首先创建一个对象,new一个对象会在堆内存中开辟一个空间,产生地址值,然后地址值赋值给对象,

第四步:在main方法中如果运行改变堆内存中某一个值的时候,是用对象名点然后进入堆中找到对应名称进行赋值 然后输出

第四步:创建另外一个对象,会在堆内存中开辟另外一个空间,注意是另外开辟一个空间,一样成员方法也有属于自己的一块在地址中的小区域,然后main方法执行赋值等操作一样是,通过对象名点然后进入堆中赋值,注意被测试的那个类,就是有成员变量和成员方法的那个类,只会运行一次,当多个对象是也只会运行一次!

第五步:main方法中更改值之后如果运行成员方法,那么久调用堆内存中特有的一一个专门放置方法的一部分空间!!!!!!(记住方法不调用不执行!!!)然后成员方法进栈,运行完方法中的程序之后结束后弹栈

第六步 main方法结束,然后main方法执行弹栈!!!!就完了

 

 

8.3;首先第三种情况,当在测试类中定义了两个对象时!

第一步:是在方法区中先载入一个TestClass字节码文件然后里面有个main方法

第二步 :在方法区中然后加载被测试的字节码文件class 里面有成员变量以及成员方法

第三步:jvm虚拟机自动运行然后将main方法进入栈内存,然后执行里面代码,

首先创建一个对象,new一个对象会在堆内存中开辟一个空间,产生地址值,然后地址值赋值给对象,

第四步:在main方法中如果运行改变堆内存中某一个值的时候,是用对象名点然后进入堆中找到对应名称进行赋值 然后输出

第四步:创建另外一个对象时如果其他的的对象对这个对象进行赋值,那么他就不会在堆内存中开辟新的空间在,只会额共用一块空间,如果被赋值的这个对象需要对空间的某个变量进行赋值的话,那么就可以直接通过地址进到这个区域进行改变!!!

第五步:main方法中更改值之后如果运行成员方法,那么久调用堆内存中特有的一一个专门放置方法的一部分空间!!!!!!(记住方法不调用不执行!!!)然后成员方法进栈,运行完方法中的程序之后结束后弹栈

第六步 main方法结束,然后main方法执行弹栈!!!!就完了

 

位置不同:成员变量在方法外 ,类中 局部变量在方法里,就是在方法里面定义的变量

初始化值不同:成员变量有类型,有类型就有默认值,局部变量你不赋值你压根用不了!1!!!

内存不同:成员变量在类中,创建对象的时候直接就进堆内存里了,而局部变量在方法中,方法却是在栈内存中的

生命周期不同:这个不使用或者使用过了就会消失!!

作用域:成员变量是在方法外,类那个大括号中的,所以都可以访问他,而成员变量则是,在方法中的别的方法调用不了,这个就是各自的作用域!!!

 

  1. this

    this 就是代表当前对象的地址值,相当于只要对象中调用到this,那么谁调用,this就是那个对象的地址

    特点: 哪一个对象调用方法 ,且方法中有this那么就代表哪个对象的地址值

 

特点: 哪一个对象调用方法 ,且方法中有this那么就代表哪个对象的地址值

  1. 当成员变量和局部变量变量名是一样时,使用就近原则,会先输出局部变量的值

如果就要访问成员变量的话,可以在show方法中输出语句里加一个this.name,因为根据内存图来分析,当对象调用方法是如果方法里面有this ,那么this就是那个对象的地址值,然后this.就可以进入堆中访问成员变量~~~~!!!!!!!!!!!!!!!!!!!

方法构造(也可以叫构造器)

构造方法名和类名必须完全一致,;连大小写都得额一样;

构造方法没有返回值,连void都不能写;

因为如果用void来写的话,系统会认为这个是成员方法,所以不能写void

构造方法中不能有return语句,不能有return的返回类型

 

 

面向对象三种特征:

封装 《 继承 多态》继承多态后面学;

封装:隐藏实现信息,仅暴露公共部分

将属性抽取到类中,是对数据的一种封装

将代码抽取到方法中是对代码的一种封装

 

JavaBean