JavaSE笔记04:面向对象的理解

原文链接:http://blog.csdn.net/u011593278/article/details/9737407

1. 面向对象程序设计(Object Oriented Programming,OOP;Object Oriented Design,OOD)。

   什么是面向对象?在面向对象程序设计中有两个重要的概念:类(class)与对象(object)。

a)类:类是一种抽象的概念,类中包含了数据(通常使用属性来表示)与对数据的操纵(通常使用方法来表示)

           比如说人就是一种抽象的概念,人具有姓名、年龄、身高等数据,还有吃饭、跑步等操纵数据的动作。

b) 对象:对象是一种具体的概念,是类的一种具体表示方式。比如人是一个类,而张三、李四具体的人就是对象

 

2. 类所包含的内容,类一共包含两部分内容:

a) 数据,数据在类中称作属性(Property或者Attribute)或者叫成员变量

b) 对数据的操纵,这种操纵在类中称作方法(method)。

 

3.面向对象程序设计的三大基本特征:封装(Encapsulation)、继承(Inheritence)、多态(Polymorphism

 

4.封装:类包含了数据与方法,将数据与方法放在一个类中就构成了封装。

 

5. main方法是整个Java程序的入口点,如果类的定义中没有main方法,则程序无法执行。

 

6. 方法定义不能嵌套,也就说不能在一个方法中定义另外一个方法。方法只能定义在类中。

 

7.关于方法的执行:首先需要定义方法,接下来就可以使用方法(调用方法),当方法调用完毕后,方法可以返回值。方法到底是否返回值是由方法的定义决定的。

 

8. 如何生成对象?通过类来生成对象(通常使用new关键字来生成对象)

publicclass Person

{

}

类名 变量名 = new 类名();

Personperson = new Person();

Personperson2 = new Person();

Personperson3 = new Person();

分析:new的作用是创建类的对象,其本质是分配内存的,将创建的对象的数据分配到堆内存中存储,而对象的引用存储在栈内存中,并且指向堆内存中的对象;在此过程中,会调用类中的构造器,所以必须得有相应的构造器才能创建对象使用new来生成对象的时候,后面的小括号()表示构造方法的参数列表,如果构造方法不接收参数,那么小括号中的内容为空;如果构造方法接收参数,那么小括号中的实际参数就需要与构造方法定义中的形式参数保持一致(参数数量一致、参数类型一致、按照顺序逐一赋值)

堆内存和栈内存的区别:

栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

 

9. 方法调用需要通过对象来完成,方法调用的形式是:

对象变量.方法名([参数值1, 参数值2, 参数值3….]);

 

10. 关于方法的注意事项:

1) 在方法定义中,方法的返回类型与return后面的变量或常量类型保持一致。

2) 在方法调用时,给方法传递的参数需要与方法定义时的参数保持一致(参数个数一致,参数类型一致)。

3) 方法定义时的返回类型与接收方法返回值的变量类型保持一致。

                                                  

11. 形式参数和实际参数区别:

 //方法定义时的参数叫做形式参数,如下所示:  

 public intadd(int a, int b)

{

return a + b;

}

//方法调用时所赋予的具体值叫做实际参数,如下所示:

int a = test.add(8, 3);

 

12. 关键字void表示方法不返回值。

 

13. 如果方法不返回值,那么声明方法的时候使用void关键字,在方法定义中可以有两种情况实现不返回值:

a)不使用return语句。

b) 使用return,但return后面没有任何值或者变量,return后面只有一个分号,表示退出方法,返回到方法的调用端。

 

14. 成员变量和局部变量的区别:

   a) 成员变量:定义在类中的属性,定义的时候必须声明,但可以不用初始化(赋值),

                          系统会根据不同类型初始化为默认值的;

   b) 局部变量:定义在方法里面的属性,定义的时候必须声明和初始化(赋值);

   i. byte、short、int、long类型的初始值为0

   ii. float、double类型的初始值为0.0

   iii. char类型的初始值‘\u0000’

   iv. boolean类型的初始值为false

 

15. 对象(Object)又叫做实例(Instance)。生成一个对象的过程又叫做实例化。

 

16. 命名约定:

a) 类:首字母大写,如果一个类名由多个单词构成,那么每个单词的首字母都大写,中间不使用任何的连接符。

            比如Person类,MemberTest类。

b) 方法:首字母小写。如果一个方法由多个单词构成,那么第一个单词的所有字母全都小写,从第二个单词开始,

                每个单词的首字母大写。比如add,addThreeInt。

c) 属性:命名约定与方法相同。比如age,ageOfPerson。

 

17. 引用类型(referencetype):引用类型是用在对象上的。一个对象可以被多个引用所指向,但同一时刻,每个引用只能指向唯一的一个对象。如果一个对象被多个引用所指向,那么无论哪个引用对对象的属性进行了修改,都会反映到其他的引用当中因为创建对象时会在对内存中存储对象地址,而每个对象都指向该内存地址,无论哪个应用改变对象改变属性,都会在内存中改变其属性值的,其他应用再调用该对象属性时,就会调用该内存中已改变的属性值),如下图所示:

JavaSE笔记04:面向对象的理解_第1张图片


程序示例:一个对象,一个引用

packagecom.zp.base;

public class Reference {

    int age = 20;

    public void change(Reference ref){//第二处引用ref

       ref.age = 30;//此处已将内存中的age属性值修改成30

    }

   

    public static void main(String []args){

       Reference r =new Reference();//第一处引用r

       int age = r.age;

       System.out.println(age);

      

       r.change(r);//调用修改age属性值的方法,调用了第二次的引用;

       int age2 = r.age;//调用age属性

       System.out.println(age2);

    }

}

结果:20  30

 

程序示例:两个对象,两个引用

packagecom.zp.base;

public class Reference {

    int age = 20;

   

    public void change(Reference ref){

       ref = new Reference();//创建的第二个对象

       ref.age = 40;

    }

   

    public static void main(String []args){

       Reference r =new Reference();//第一处引用r

       int age = r.age;

       System.out.println(age);

      

       r.change(r);//调用修改age属性值的方法,调用了第二次引用;

       int age2 = r.age;//调用age属性

       System.out.println(age2);

    }

}

结果: 20  20

 

18. 如果一个类包含了属性与方法,那么该类的每一个对象都具有自己的属性(数据),但无论一个类有多少个对象,这些对象共享同一个方法(每个对象的属性都是自己的,但是方法是共享的)。

 

19. 关于方法参数传递的总结:对于Java中的方法参数传递,无论传递的是原生数据类型还是引用类型,

     统一是传值(pass by value)。

    注意:引用类型传的是栈内存中的地址(值);

 

程序示例:

packagecom.zp.base;

public class Parameter {

    int age = 20;

   

    public void change1(Parameter p){

       p.age = 30;

    }

   

    public void change2(intage){

       age++; //该变量和age属性没有关系,是change2(int age)中的形参age

              //但是可以通过this.age使之成为Parameter类的age属性;

    }

   

    public static void main(String []args){

       Parameter p =new Parameter();

      

       int age = p.age;

       System.out.println(age);

      

       p.change1(p);

       int age1 = p.age;

       System.out.println(age1);

      

       int i = 15;

       p.change2(i);

       System.out.println(p.age);

    }

}

结果:20  30  30

分析:上面这个例子主要说明了change2(intage)方法中传递的基本类型值与Parameter类的属性age没有关系,

            仅仅是change2(int age)的形参age;

 

20. 什么类型的引用就能指向什么类型的对象,比如People类型的引用就能指向People类型的对象,

      但不能指向Student类型的对象。比如:

People people =new People(); // 正确

People people =new Student(); //错误

分析:如果Student继承了People,People people = new Student();就没错了,就是多态了,父类引用指向子类对象;

 

21. 构造方法(Constructor):构造方法用于完成对象属性的初始化工作,构造方法的特点:

a)构造方法的名字必须与类名完全一致(包含大小写)

b)构造方法没有返回值,连void也不能出现。

c) 如果在定义一个类的时候,没有为类声明构造方法,那么Java编译器会自动为类添加一个没有参数

    且方法体为空的构造方法(默认的构造方法)

d) 如果在定义一个类的时候,为类声明了构造方法,那么Java编译器就不会再为类添加构造方法了。

e) 不能显式调用类的构造方法,构造方法通常是通过new关键字隐式调用。

 

22. new关键字在生成对象时完成了三件事情:

a) 为对象开辟内存空间。

b) 调用类的构造方法。

c) 将生成的对象的地址返回。

 

23. 默认的构造方法:构造方法没有参数且方法体为空,一般都得显示的写出不带参数的构造方法,以免有了带参数的构造方法,就没法自动创建默认的构造方法了。

你可能感兴趣的:(JavaSE)