您的位置:首页 > 职场人生

黑马程序员——Java编程语言学习总结– 面向对象(上)

2015-03-23 21:52 267 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

(一)类与对象

1,面向对象的概述与起源

面向对象和面向过程都是一种思想,面向过程是以函数为基础,完成各种操作,面向对象是以对象为基础,完成各种操作,面向对象是基于面向过程的。总结:万物皆对象。

 

2,面向对象思想的特点

是一种更符合人思考习惯的思想

可以将复杂的事情简单化

将程序员从执行者转换成了指挥者

3,把大象装进冰箱的实现

思考:怎么样才能让我们的操作更符合面向对象思想呢?

分析步骤:A:分析该系统中包含那些对象。B:明确每个对象可以做什么。C:明确各个对象间的关系。

代码示例:

class 大象

       {

              public void in()

              {

                     System.out.println("装进大象");

              }

       }

       class 冰箱

       {

              //一个打开冰箱门的方法Open

              //一个关闭冰箱门的方法Close

       }

       class 测试

       {

              冰箱对象.Open();

              大象对象.In();

              冰箱对象.Close();

       }

4,类与对象的关系概述

我们学习编程语言,其实就是为了把显示世界的事物通过程序语言给体现出来。Java中描述事物无非就是描述事物的属性和行为。

Java语言,最基本的单位是类,类就是用来体现事物的。

类:类是属性和行为的集合,是一个抽象的概念。

成员变量:其实也就是属性。

成员方法:其实也就是行为。

对象:就是类的具体的存在,体现。

5,如何定义一个学生类

学生事物:属性:姓名,年龄,性别。。。行为:学习,吃饭,睡觉。。。

把事物转换成Java中的类。

学生类:成员变量:例如:姓名,年龄,性别;成员方法(就是函数先把static去掉):例如:吃饭的方法,睡觉的方法,学习的方法。

6,学生类的内存

方法区:Student:study();  StudentTest:main();

调用方式:Student s1 = new Student();

Student s2 =s1;

7,什么时候将变量定义为成员变量

成员变量其实是这个类的属性。只有能够用于描述一个类的属性的东西,才可以定义为类的成员变量。否则,就应该定义为局部变量。

 

8,成员变量和局部变量的区别

A:定义位置区别

成员变量:再类中,方法外

局部变量:在方法中,或者方法的形式参数

B:初始化值的区别

成员变量:有默认初始化值

局部变量:没有默认初始化值,想先定义,赋值,才能使用

C:存储位置区别

成员变量:存储在堆中,随着对象的存在而存在,随着对象的消失而消失。

局部变量:存储在栈中。随着方法的调用而存在,随着方法调用完毕而消失。

在使用变量的时候:首先在局部范围找,有就使用。接着在成员方法中找,有就使用。如果在成员位置没有,就报错。(使用过程中,遵循一个原则:就近原则。)

9,匿名对象的概述和使用

匿名对象的概念:就是没有名字的对象。

匿名对象的应用场景:A:当对对象方法仅调用一次的时候。

                     B:匿名对象可以作为实际参数进行传递。

(二)封装

现在数据的赋值是没有问题的,但是不符合常理。这样的数据其实是不真实的。

那么,我们要保证数据的真实性,怎么办呢?

那么就必须对数据进行校验。

要想做校验,就必须有逻辑结构语句。

要想写逻辑结构语句,就必须定义方法。、但是,现在即使我们写了方法,别人还是可以通过:对象.成员变量直接使用。所以,我们应该先解决根本问题,让外界不能直接通过 对象名.成员变量 访问数据。怎么办呢? Java就提供了一个修饰符 Private。定义:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。

1,private关键字

表示私有的意义。可用于修饰成员变量和成员方法。

被他修饰完毕后的内容,在其他类中是不能直接访问的。private仅仅是封装的一种体现。因为类,函数等其实也是一个封装的体现。

2,封装的代码体现:

/*

       这一次的代码是用封装的概念来体现的标准代码。

*/

class Teacher

{

       //类的成员变量都加private

       private String name;

       private int age;

 

       //一般,get/set同时出现

       public void setName(String n)

       {

              name = n;

       }

 

       public String getName()

       {

              return name;

       }

 

       public void setAge(int a)

       {

              age = a;

       }

 

       public int getAge()

       {

              return age;

       }

}

classTeacherTest

{

       public static void main(String[] args)

       {

              //创建对象

              Teacher t = new Teacher();

              //System.out.println(t.name+"***"+t.age);

      

              //我要使用,怎么办呢?

              System.out.println(t.getName()+"***"+t.getAge());

 

              //给变量赋值

              t.setName("林青霞");

              t.setAge(26); //

 

              System.out.println(t.getName()+"***"+t.getAge());

       }

}

(三)构造方法

1,格式及特点:

A:方法名必须和类名一致

B:没有返回值类型

C:没有具体的返回值

2,作用:

给对象进行初始化。

3,注意事项:

A:如果你没有给出构造方法,那么,系统会默认给出一个无参构造方法。

B:只要你给出了构造方法,系统将不再提供无参构造。推荐做法:请永远手动给出无参构造。

C:构造方法重载其实就是构造方法接受不同的参数。

(四)代码块

1,概念:

就是由{}括起来的代码。

2,分类:

A:局部代码块:定义在方法中的代码块儿,叫局部代码块儿。

                      作用:让变量尽可能早的从内存中消失,提高效率。

B:构造代码块:定义在方法外的代码块儿,叫构造代码块儿。

    把所有构造方法中的共同的内容定义在构造代码块中。

构造代码块先执行,然后再执行构造函数。

 

(五)this关键字

1,概述:

this代表其所在方法所属对象的引用。换言之:this代本类对象的引用。

2,this的应用场景:

用于解决局部变量隐藏成
4000
员变量值的问题。

3,this关键字的标准代码写法:

class Dog

       {

              private String name;

              private int age;

              public Dog(String name,int age)

              {

                     this.name = name;

                     this.age = age;

              }

              public void setName(String name)

              {

                     this.name = name;

              }

              public String getName()

              {

                     return name;

              }

              public void setAge(int age)

              {

                     this.age = age;

              }

              public int getAge()

              {

                     return age;

              }

       }

(六)对象的初始化过程

Person p =new Person();在内存中是怎么执行的?

A:把Person.class文件加载到内存。(类加载器)

B:在栈内开辟一个变量空间。给P使用。 

C:new Person()就会在堆内存开辟空间。

D:方法进方法区,有类名做标记。并且,同时成员变量进堆内存并给出了默认初始化值。(name:null     age:0 )

E:对成员变量进行显示初始化

F:如果有构造代码块,可以在构造代码块中对成员变量赋值。

G:执行构造方法中对成员变量的赋值。

H:到此为止,对象初始化完毕。

I:把堆内存对象的首地址值赋值给栈内存的p变量。

(七)static关键字

1,概述:

如果都是“中国”这个字符串,你每次创建对象都来一个。那么,如果你有10000个对象,哪就有10000个“中国”占用内存空间。而明明我们知道,他们都是“中国”的。假如,我们能够,让他们使用的国籍是相同的,也就是说,将来只存储一个“中国”,该有多好呢?

针对这种情况,java提供了一个关键字叫:static

他可以修饰成员变量和成员方法。

2,特点:

A:随着类的加载而加载。

B:优先于对象存在。

C:为什么要使用静态呢?

如果某个内容是被所有对象所共享,那么,该内容就应该用静态修饰。

       没有被静态修饰的内容,其实是属于对象的特殊描述。

D:可以直接被类名调用。

3,注意事项:

A:在静态方法中,是没有this关键字的。

              因为静态是随着类的加载而加载。而this是对象创建才存在的。

       B:静态方法只能访问静态成员变量和静态成员方法。

C:静态的内容可以通过对象调用,也可以通过类名调用,但是一般推荐使用类名调用。

(八)如何使用帮助文档

1,通过javadoc命令制作帮助文档:

javadoc -d 目录名

2,使用步骤:

A:找到文档,打开文档。

B:点击左上角的显示变成隐藏,然后点击索引。

C:你应该知道你要找谁? Math

         所以,你就在那个输入框里边输入“Math",然后回车,再回车。

D:看到这个类的结构

              如果是java。lang包下的类,类可以直接使用的。(Math)

              否则,就需要导包才能使用。(Scanner)

F:看构造方法。

              字段--- 也就是成员变量 --- 也叫 属性。

           A:有构造方法,那么,就通过构造方法创建对象使用。

              B:没有构造方法,那么,这个类的成员一般都是静态。通过类名调用。

G:按照正常的操作使用方法。

              左边:

                     是否静态:如果静态修饰,那么可以通过类名调用。

                     是否有明确返回值:如果是void类型,就直接调用即可。否则,就可以输出或者赋值。

              右边:

                     看方法名:不要写错了。

                     看参数:看参数的类型及个数。

(九)Math类

Math中我们需要掌握的功能:

成员常量:

Math.E和Math.PI

成员方法:

A:绝对值:Math.abs(参数类型 形式参数)

B:天花板数:Math.ceil(12.3); //结果是13.0

C:地板数:Math.floor(12.3)

D:四舍五入:Math.round(12.6);

E:随机数:Math.random();

F:两个数中的最大值:Math.max(12,53);

G:两个数中的最小值:Math.min(11,66);

H:三个数中的最大值:Math.max(Math.max(11,33),120);

 

Math类方法探究:

猜数字小游戏代码:

/*

       猜数字游戏:

              A:产生一个1-100之间的随机数。

              B:键盘录入一个数据。

              C:把两个数据进行比较:

                     大了      -      你猜的数据大了

                     小了      -      你猜的数据小了

                     等了      -      恭喜你,猜中了

              D:为了多次猜,用循环改进。

                     由于不知道要猜多少次,所以用while循环。

*/

importjava.util.Scanner;

classGuessNumber

{

       public static void main(String[] args)

       {

              //产生一个1-100之间的随机数

              int number =(int)(Math.random()*100)+1;

 

              while(true)

              {

                     //键盘录入一个数据

                     Scanner sc = new Scanner(System.in);

                     System.out.println("请输入一个数据(1-100):");

                     int guessNumber =sc.nextInt();

 

                     //把两个数据进行比较

                     if(guessNumber>number)

                     {

                            System.out.println("你猜的数据"+guessNumber+"大了");

                     }

                     elseif(guessNumber<number)

                     {

                            System.out.println("你猜的数据"+guessNumber+"小了");

                     }

                     else

                     {

                            System.out.println("恭喜你,猜中了。到田野处领奖品");

                            break;

                     }

              }

       }

}

(十)Random类

Random的构造方法:

A,  Random(); :使用默认种子,当前时间的毫秒值。每次产生的随机数都是变化的。

B,  random(long seed); :如果给定了种子,每次都是按照种子作为初始值产生的随机数,如果种子固定,值是一样的。

 

Random的成员方法:

Random r = newRandom();

int ---r.nextInt(); ---》int范围内的一个数据

int ---r.nextInt(int n); ---》在0到n范围内的一个数据,包括0,不包括n。

举例:产生一个1-100之间的随机数B:Random r = new Random();

         int number = r.nextInt(100)+1;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: