java学习笔记 --- 面向对象2

一、匿名对象 
  (1)没有名字的对象
  (2)应用场景
      A:调用方法,仅仅只调用一次的时候。

      

class Car
{
    //描述属性。颜色,轮胎数。
    String color;
    int number;
    //描述行为。
    void run()
    {
        System.out.println(color+":"+number);
    }
}
class CarDemo
{
    public static void main(String[] args)
    {    
        //采用匿名对象调用方法
        new Car().run();
        new Car().run();
     }
}


      B:可以作为实际参数传递。

    


class Student {
    public void show() {
        System.out.println("我爱学习");
    }
}

class StudentDemo {
    public void method(Student s) {
        s.show();
    }
}

class NoNameDemo {
    public static void main(String[] args) {
        //带名字的调用
        Student s = new Student();
        s.show();
        s.show();
        System.out.println("--------------");
        
        //匿名对象
        //new Student();
        //匿名对象调用方法
        new Student().show();
        new Student().show(); //这里其实是重新创建了一个新的对象
        System.out.println("--------------");
        
        
        //匿名对象作为实际参数传递
        StudentDemo sd = new StudentDemo();
        //Student ss = new Student();
        //sd.method(ss); //这里的s是一个实际参数
        //匿名对象
        sd.method(new Student());
        
        //在来一个
        new StudentDemo().method(new Student());
     }
}

 


 

  

二、基本类型和引用类型作为参数传递的区别

   1、基本类型作为参数传递(main方法中值不变)

class Demo

{

       public static void main(String[] args)

       {

              int x = 4;

              show(x);

              System.out.println("x="+x);//4

       }

       public static void show(int x)

       {

              x = 5;

             

       }

}

 

 

 

 

  说明:

    基本类型作为参数传递时,其实就是将基本类型变量x空间中的值复制了一份传递给调用的方法show(),当在show()方法中x接受到了复制的值,再在show()方法中对x变量进行操作,这时只会影响到show中的x。当show方法执行完成,弹栈后,程序又回到main方法执行,main方法中的x值还是原来的值。

 

2、引用参数作为值传递

  

说明:

  当引用变量作为参数传递时,这时其实是将引用变量空间中的内存地址(引用)复制了一份传递给了show方法的d引用变量。这时会有两个引用同时指向堆中的同一个对象。当执行show方法中的d.x=6时,会根据d所持有的引用找到堆中的对象,并将其x属性的值改为6,show方法弹栈。由于是两个引用指向同一个对象,不管是哪一个引用改变了引用的所指向的对象的中的值,其他引用再次使用都是改变后的值。

 

三、封装

  (1)隐藏实现细节,提供公共的访问方式
   (2)好处:
      A:隐藏实现细节,提供公共的访问方式
      B:提高代码的复用性
      C:提高代码的安全性
   (3)设计原则
      把不想让外界知道的实现细节给隐藏起来,提供公共的访问方式
   (4)private是封装的一种体现。
      封装:类,方法,private修饰成员变量

  (5)使用setXXX(),getXXX()对外提供

四、构造方法

  (1)作用:用于对对象的数据进行初始化
  (2)格式:
        A:方法名和类名相同
        B:没有返回值类型,连void都不能有
        C:没有返回值

     修饰符 构造方法名(参数列表){

      }

/*
    构造方法:
        给对象的数据进行初始化

    格式:
        A:方法名与类名相同
        B:没有返回值类型,连void都没有
        C:没有具体的返回值
*/
class Student {
    private String name; //null
    private int age; //0
    
    public Student() {
        System.out.println("这是构造方法");
    }
}

class ConstructDemo {
    public static void main(String[] args) {
        //创建对象
        Student s = new Student();
        System.out.println(s); //Student@e5bbd6
    }
}

 


  
          思考题:构造方法中可不可以有return语句呢?
          可以。而是我们写成这个样子就OK了:return;
          其实,在任何的void类型的方法的最后你都可以写上:return;
   (3)构造方法的注意事项
      A:如果我们没写构造方法,系统将提供一个默认的无参构造方法
      B:如果我们给出了构造方法,系统将不再提供默认构造方法
         如果这个时候,我们要使用无参构造方法,就必须自己给出。
         推荐:永远手动自己给出无参构造方法。

     C:一个类中可以有多个构造函数,多个构造函数是以重载的形式存在的

 

     D:构造函数中也是有return语句的,用于结束初始化动作。

     E:构造函数是可以被private修饰的,作用:其他程序无法创建该类的对象
   (4)给成员变量赋值的方式
      A:setXxx()
      B:带参构造方法

 

   (5)一般方法和构造方法的区别    

    构造函数在对象创建时就执行了,而且只执行一次。

 

    一般函数是在对象创建后,需要使用时才被对象调用,并可以被多次调用。

   思考:

      有了构造函数之后可以对对象的属性进行初始化,那么还需要对应的set和get方法吗?

      需要相应的set和get方法,因为对象在创建之后需要修改和访问相应的属性值时在,这时只能通过set或者get方法来操作。

 五、this关键字

    (1)代表当前类的引用对象
        记住:哪个对象调用方法,该方法内部的this就代表那个对象

    (2)调用其他构造函数的语句必须定义在构造函数的第一行,原因是初始化动作要最先执行。

posted @ 2017-03-22 22:14  皮皮虾我们上  阅读(224)  评论(0编辑  收藏  举报