java--面向对象(2)--黑马程序员

面向对象(2)

主要内容:《  构造方法、成员方法、static关键字、静态的成员方法、 static的注意事项 》

1 构造方法概述和格式

         1.构造:实例化一个对象;new

         2.方法:指的是某一个方法。

         构造方法:跟构造相关的方法:

         当我们"实例化"一个对象时,使用的语法:

                            Student stu = new Student();

         后边的一对小括号就意味着调用了某个方法,这个方法就叫:构造方法;

         我们之前都没有定义过构造方法,那时是系统自动为我们添加的;

 

         自己定义构造方法:

         语法要求:

         1.构造方法的"方法名"必须和"类名"相同;

         2.构造方法不能定义"返回值类型",甚至是void;

构造方法的格式:

1.构造方法的方法名必须与类名相同;

2.不能定义返回值类型,甚至是void;

3.构造方法内部不能返回任何值。但可以写return;语句;表示:结束构造方法的执行

 1 class Student{
 2 
 3          //定义普通的方法:
 4 
 5          void show(){
 6 
 7          }
 8 
 9          //定义构造方法
10 
11          //如果我们程序员没有定义构造方法,编译器会自动为这个类添加一个构造方法:没有形参,里面什么都不做。
12 
13          //当我们实例化这个类对象时,虚拟机就会自动调用这个构造方法。
14 
15 /*       Student(){
16 
17          }
18 
19 */
20 
21          //我们可以自己定义一个构造方法,当再实例化这个类的对象时,将会调用这个构造方法。
22 
23          Student(){
24 
25                    System.out.println("你构造了一个Student......");
26 
27          }
28 
29 }
30 
31 class Demo {
32 
33          public static void main(String[] args)
34 
35          {
36 
37                    Student stu = new Student();
38 
39          }
40 
41 }

2 构造方法的作用

1.由于它是在实例化一个对象时,被调用。    一般它内部可以做一些"初始化"的工作,和其它一些"先期的准备工作"。

2.理解构造方法的作用:

         给了我们一个机会,在实例化一个类对象之前,如果想做什么事情,就可以将代码写在"构造方法"里。这个方法每当实例化一个此类对象时,会被调用.

 1 class Student{
 2 
 3          String name;
 4 
 5          int age;
 6 
 7          char sex;
 8 
 9 //定义一个构造方法,做一些初始化的操作。这个构造方法将会在每次实例化这个对象时被调用;
10 Student(){
11         name = "";
12         age = 20;
13         sex = '男';
14         System.out.println("构造了一个Student对象......");
15     }
16 }
17 class Demo {
18     public static void main(String[] args) {
19         Student stu = new Student();
20         System.out.println(stu.name);
21         System.out.println(stu.age);
22         System.out.println(stu.sex);
23         Student stu2 = new Student();
24         Student stu3 = new Student();
25         Student stu4 = new Student();
26         Student stu5 = new Student();
27     }
28     }

3  构造方法的重载及注意事项)—

构造方法的注意事项:

1.如果我们不定义构造方法,系统添加一个:无参,什么都不做;

         2.如果我们定义了构造方法,那么系统将不再添加无参构造方法了;

         3.构造方法也是可以"重载":

 

         构造方法重载的作用:

         1.意味着这个类,可以使用多种方式构造;方便使用者来构造对象;

         2.当我们实例化一个对象时,只能调用一个构造方法;其它构造方法将不会被调用;

   3.构造方法重载,实际上为这个类提供了一定的"灵活度";

 1 class Student
 2 {
 3     private String name;
 4     private int age;
 5     private char sex;
 6 
 7     //构造方法时可以进行重载的;
 8     Student(){
 9         System.out.println("无参的构造方法......");
10     }
11     Student(int n){
12         System.out.println("int的构造方法...... n = " + n);
13     }
14     Student(String name){
15         System.out.println("String的构造方法...... name = " + name);
16     }
17 //全参的构造方法
18     Student(String name,int age ,char sex){
19         this.name = name;
20         this.age = age;
21         this.sex = sex;
22     }
23 //提供一些get和set方法
24     void setName(String name){
25         this.name = name;
26     }
27     String getName(){
28         return this.name;
29     }
30     void setAge(int age){
31         this.age = age;
32     }
33     int getAge(){
34         return this.age;
35     }
36     void setSex(char sex){
37         this.sex = sex;
38     }
39     char getSex(){
40         return this.sex;
41     }
42 }
43 class Demo {
44     public static void main(String[] args) {
45         //调用无参的构造方法;
46     //    Student stu = new Student();
47         //调用int参数的构造方法
48     //    Student stu2 = new Student(20);//传递实参
49         //调用String参数的构造方法
50     //    Student stu3 = new Student("刘德华");
51         //***********构造方法的作用*********
52         //之前我们可以通过set方法为成员属性赋值
53         Student stu = new Student();
54         stu.setName("刘德华");
55         stu.setAge(20);
56         stu.setSex('男');
57         //使用带参的构造方法
58         Student stu2 = new Student("张学友",20,'男');
59     }
60 }

4 成员方法的分类及使用-一个标准的学生类

成员方法的分类:

         成员方法:定义在类体中,跟我们之前讲过的"方法"是一样的。可以带参数,可以具有返回值;

         成员方法的特点:必须要通过类的对象调用。必须先期实例化此类对象,因为只有实例化对象后,方法的空间才会被分配。

                            Student stu = new Student();

                            stu.show();

 

                            //不能直接调用show()

                            show();//错误。show()在Student类的内部,不能这样直接调用;

 

                            //不能通过类名调用:

                            Student.show();//错误:不能用"类名"调用;

         分类:

                   1.无返回值,无形参;

                   2.有返回值,无形参;

                   3.无返回值,有形参;

        4.有返回值,有形参;

 1 class Student{
 2     //私有的成员属性
 3     private String name;
 4     private int age;
 5     private char sex;
 6     //*********构造方法*********
 7     //无参的
 8     Student(){
 9     }
10     Student(String name,int age,char sex){
11         this.name = name;
12         this.age = age;
13         this.sex = sex;
14     }
15 //一些get和set方法
16     void setName(String name){
17         this.name = name;
18     }
19     //有返回值,无形参
20     String getName(){
21         return this.name;
22     }
23     //无返回值,有形参
24     void setAge(int age){
25         this.age = age;
26     }
27     int getAge(){
28         return this.age;
29     }
30     void setSex(char sex){
31         this.sex = sex;
32     }
33     char getSex(){
34         return this.sex;
35     }
36     //无返回值,无形参
37     void show(){
38         System.out.println("大家好,我叫:" + this.name + ",性别:" + this.sex + ",今年:" + age + " 岁!");
39     }
40     //有返回值,有形参:
41     String toString(int n){
42         System.out.println("n = " + n);
43         return this.name;
44     }
45 }
46 class Demo {
47     public static void main(String[] args) 
48     {
49         Student stu = new Student();
50         stu.show();//OK的;
51 
52         show();//编译错误
53         Student.show();//编译错误
54     }
55 }

5 static关键字

static关键字:

              1.static:静态的——全局的——整个应用程序范围内。

              2.有些成员变量具有固定的值,一般不会更改。

                            如果它作为"普通成员变量":意味着,每次实例化这个对象时,都会在堆中分配空间。所以,如果对象

                                                      多了后,就会造成"空间浪费";

              3.这时,我们可以将这种变量定义为:static

 1 class Student
 2 {
 3     static String schoolName = "传智播客--北京校区";
 4     String name;
 5     int age;
 6 
 7     Student(String name,int age){
 8         this.name = name;
 9         this.age = age;
10     }
11 }
12 class Demo 
13 {
14     public static void main(String[] args) 
15     {
16         Student stu = new Student("刘德华",20);
17         System.out.println("第一个学员打印:" + stu.schoolName);
18 
19         stu.schoolName = "传智播客";//此值是共享的,只有一个存储空间。
20 
21         Student stu2 = new Student("张学友",22);
22         System.out.println("第二个学员打印:" + stu2.schoolName);
23     }
24 }

6  static关键字的特点

静态属性的应用:

              1.我们以后做项目时,总会有一些成员属性的值,在整个应用程序范围内是唯一的,

                而且被整个应用程序共享。

                例如:schoolName = "传智播客--北京校区";

              2.我们可以将这种字段全部定义在某个类中,并声明为static的。

 1 class Const
 2 {
 3     static String schoolName = "传智播客--北京校区";
 4     //我们的整个应用程序需要经常的计算圆的面积,需要使用统一的π值
 5     static double pi = 3.14159;
 6 class Student{
 7     String schoolName  = Const.schoolName;
 8     //例如此方法要计算圆的面积
 9     void cal(){
10     Const.pi * 半径 的平方
11     }
12 }
13 class Teacher{
14     String schoolName = Const.schoolName;
15 }
16 class Demo {
17     public static void main(String[] args) {
18         System.out.println("Hello World!");

7 静态的成员方法以及特点

静态关键字的特点:

              1.随着类的加载而加载;

              2.优先于"对象"而存在;在没有任何此类的对象的情况下,就已经存在了;

              3.被类的所有对象共享。也可以被其它类访问;

              4.可以通过"类名"调用。也可以通过"对象名"调用;

 1 class Const{
 2     static String schoolName = "传智播客--北京校区";
 3     static double PI = 3.14159;
 4 }
 5 class Demo {
 6     public static void main(String[] args) {
 7 //    Const con = new Const();//第一new这个类的对象,也会先将静态成员分配空间
 8 
 9 System.out.println(Const.schoolName);//第一次使用Const类时,会自动加载内部所有的"静态成员",并分配空间
10 System.out.println(Const.schoolName);//直接在内存中取System.out.println(Const.schoolName);//直接在内存中取
11     Const con = new Const();
12     System.out.println("con打印:" + con.schoolName);
13     }

静态的成员方法(类方法):

         1.一个成员方法也可以被修饰为static(静态的)

         2.一般一些"功能性"的方法:例如我们上午写的MyMath类中的加减乘除的一些方法

           为了方便用户使用,我们可以将这些方法定位为:static。

         3.用户使用时,可以不用实例化此类的实例,直接使用类名就可以调用了。

         静态方法的应用:

         1.我们以后做项目时,都会有一些"工具性"的方法:

                   例如:加、减、乘、除的方法;

                         对数组操作的一些方法:打印数组的内容,找数组中的最大值、最小值;

         2.我们可以将这些"工具性"的方法定义在某个类

使用户可以通过"类名"就可以直接调用了,不需要实例化此类的对象,方便了用户使用;

 1 class MyMath{
 2 
 3          //此方法就可以不通过对象调用。可以通过类名直接调用。
 4 
 5          static int add(int a ,int b){
 6 
 7                    return a + b;
 8 
 9          }
10 
11 }
12 
13 class Demo {
14 
15          public static void main(String[] args)        {
16 
17 //想使用add方法,必须先实例化一个MyMath对象;
18 
19          //       MyMath m = new MyMath();
20 
21          //       System.out.println(m.add(10,20));
22 
23                    //通过类名直接调用静态方法
24 
25 System.out.println(MyMath.add(100,20));

8  static的注意事项

static关键字的小结和注意事项:

              1.static可以修饰:

                            1).成员变量:存在静态存储区。被所有对象共享;

                            2).成员方法:存在静态存储区。被所有对象共享;

              2.static关键字的特点:

                            1.随着类的加载而加载;

                            2.优先于对象而存在;

                            3.被所有类的对象共享;

                            4.可以通过"类名"调用,也可以通过"对象名"调用;

              static关键字的注意事项:

              1.在static的方法中,不能使用this关键字;(因为此时还没有对象空间产生)

              2.静态方法,只能访问静态成员(静态成员变量和静态成员方法)

                                                                                    普通的成员方法:

                                                                                    普通的成员变量

                                                                                    普通的成员方法

                                                                                    静态的成员变量

                                                                                    静态的成员方法

                                                        静态的成员方法:

                                                                                    静态的成员变量

                                                                                    静态的成员方法

class Student
{
    static String schoolName = "传智播客--北京校区";
    
}
class StudentTools
{
    void show(){
        Student stu = new Student();
    }
}
class  Demo 
{
    public static void main(String[] args) 
    {
        int a = 10;
    }
}

9  静态变量和成员变量的区别

静态变量和成员变量的区别:

              1.所属不同

                            1).静态变量:属于某个类,又叫"类变量"。

                            2).成员变量:属于"对象",每个对象都有独立的成员变量的空间。也叫"实例变量";

              2.内存中位置不同:

                            1).静态变量:在方法区的"静态存储区"中;

                            2).成员变量:在"堆"中;

              3.在内存中出现时间不同:

                            1).静态变量:第一次使用这个类时,可能还不会产生对象。此时就会为静态变量分配空间;

                            2).成员变量:在实例化类对象时,才会分配空间;

              4.调用不同:

                            1).静态变量:可以通过"类名"访问。也可以通过"对象"访问;

                            2).成员变量:必须要通过"对象"访问;

 1 class Student{
 2     static String schoolName = "传智播客--北京校区";
 3     String name = "刘德华";
 4 }
 5 class Demo{
 6     public static void main(String[] args) 
 7     {
 8         System.out.println(Student.schoolName);//可以通过类名访问
 9         //访问成员变量:name
10         Student stu = new Student();
11         System.out.println(stu.name);//必须通过对象名访问
12         System.out.println(stu.schoolName);//也可通过对象名访问。
13     }
14 }

10 main方法的格式详细解释

public static void main(String[] args)

public :表示"公有的",任何类都可以访问的;

         static :表示"静态的",在不存在Demo的对象的情况下就可以直接访问;

         void   :返回值类型为"空"。

         main   :方法名,不是关键字。

         形参:String[] args:字符串数组。用于执行这个main方法时,传入参数;

11 说明书的制作过程

此类用于封装一些对数组进行操作的一些方法

              要对此类制作帮助文档:

 

              1.类要被声明为public;

              2.在源文件中添加"文档注释";/**开头 * /结束。只有"文档注释"中的内容才会被编译到帮助文档中。

              3.对"类"和"方法",以及方法的参数和返回值进行详细说明;

              4.在"命令提示符"下使用javadoc命令,生成帮助文档:

                                          javadoc -d 目录名  -author -version ArrayTools.java

 

                                          -d:使用目录;

                                          目录名:会将生成的帮助文档存入到这个目录下

                                          -author:识别@author标记;

                                          -version:识别@version标记:

 

 1 */
 2 /**
 3     一个对数组操作的类。包含了一些静态的方法。
 4     @author 作者名
 5     @version 1.0
 6 */
 7  public class ArrayTools 
 8 {
 9     //由于是一个工具类,内部包含都是静态方法。所以也不需要构造了。
10 private ArrayTools(){
11     }
12     //查找数组的最大值
13     //参数:
14     //返回值:
15     /**
16         获取数组的最大值。
17         @param array 要查找的数组
18         @return max 数组中的最大值
19     */
20 public static int getMax(int[] array){
21         int max = array[0];
22         for(int i = 0;i < array.length ;i++){
23             max = array[i] > max ? array[i] : max;
24         }
25         return max;
26     }
27     //查找数组的最小值
28     /**
29         获取数组的最小值
30         @param array 要查找的数组
31         @return min 数组中的最小值
32     */
33     public static int getMin(int[] array){
34         int min = array[0];
35         for(int i = 0;i < array.length ;i++){
36             min = array[i] < min ? array[i] : min;
37         }
38         return min;
39     }
40 }

 

posted on 2015-08-06 21:26  林木森  阅读(124)  评论(0编辑  收藏  举报

导航