黑马程序员——JAVA之面向对象(一)

基础知识概述

 

一.   类:是一组相关的"属性"和"行为"的集合;

       对象:是该类事物的具体体现;

二.类和对象的关系:

       1.现实:

                   类         对象

                   猫         波斯猫

                               折耳猫

                               加菲猫

----------------------------------------

                   狗           金毛

                                 藏 獒

                                 沙皮

      2.代码:

  

        class Cat{ Cat c1 = new Cat();

       String name; c1.name = "波斯猫";

        int age; c1.age = 2;

        } -----------------------------------

       Cat c2 = new Cat();

       c2.name = "折耳猫";

       c2.age = 3;

-----------------------------------------------------------

         class Dog{ Dog d1 = new Dog();

         String name; d1.name = "金毛";

           int age; d1.age = 2;

           } -----------------------------------

            Dog d2 = new Dog();

            d2.name = "藏獒";

            d2.age = 3;

   三.类的定义:

       1.使用关键字:class(注意小写)

       2.一个java源文件中:

            1).如果定义多个类,只能有一个是public的;而且源文件名必须与这个public的类名一致;

            2).如果定义多个类,可以没有public类;源文件名没有一致性要求;

            3).main()方法不是必须放在public类中;

       3.类中可以定义什么:

           1).成员变量:A.可以是基本数据类型,也可以是任何引用数据类型;   B.可以显示初始化;C.可以隐式初始化;

                     class Student{

                     String name = "张三" ;

                      int age = 20;

                     }

                           

                 整型:0

                 浮点:0.0

                 字符:'\u0000'

                 布尔:false

                引用类型:null

         2).成员方法:

                A.可以有参数,可以没参数;可以有返回值,可以没有返回值;

                B.方法的"形参"可以是任何Java类型(基本数据类型、引用数据类型)

                C.方法的"返回值"可以是任何Java类型(基本数据类型、引用数据类型)

                D.一个类中可以定义多个同名的方法,但形参列表不完全相同,叫:方法的重载;

          3).内部类(后面讲);

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

             1).成员变量:A.定义在"类体"中;可以是任何数据类型;B.会被自动初始化;

                class Student{

                String name;

                 void show(){

                  System.out.println("我叫:" + num); //打印:我叫:null

                    }

                 }

              C.当实例化对象后,被存储在"堆"中;

              D.当"对象"不被使用(没有任何引用),会被垃圾回收器回收时清理;

            2).局部变量:  A.定义在某个方法、或其它代码块中; B.必须显示初始化,否则不能访问其值;

                 class Student{

                     void show(){

                    String name;

                    System.out.println("我叫:" + name); //编译错误。局部变量必须显示初始化才能访问其值;

                    name = "张三"; //OK。可以被赋值。

                   }

                  }

                        C.当方法或其它代码块被执行时,基本数据类型的"值"和引用数据类型的"引用"都是存储在"栈"中;

                        D.当方法或代码块执行完毕时,会被立即清理;

     四.对象的使用:

           1.创建对象使用new关键字;会在堆中分配内存空间;

              格式:类名  变量名 = new 类名();

           2.一个类可以创建多个对象;

           3.每个“对象”的“成员变量”在"堆"中都有一份独立的空间;每个“对象”的“成员方法”被存储在“方法区”中,多个对象只有一个“方法空间”;

           4.对象的"引用(地址)"被存储在"栈"中;

   五.方法的形参:

         1.可以是"基本数据类型":1).调用时,必须传递此类型的“值”;2).调用时,是将值复制一份到方法内部;

                                       3).在方法内,使用形参接收此值的副本;4).在方法内,如果更改此值,对原值没有影响;

            int a = 10;

            show(a);

           System.out.println(a);//10

----------------------------------

             public void show(int n){//n = 10

             n = 20;//对原来的a的值是没有影响的;

         }

         2.可以是“引用数据类型“:1).调用时,必须传递此类型的“引用”;   2).调用时,是将“引用(地址)”复制一份到方法内部;   3).在方法内,使用形参接收此“引用”的副本;    4).在方法内,如果通过此引用更改堆中的值,对原堆中的值将会产生影响;

              int[] arr = {14,324,435};//arr = 0x2233

             show(arr);//show(0x2233)

             System.out.println(arr[0]);//1000

-----------------------------------

              public void show(int[] array){//array = 0x2233

              array[0] = 1000;

             }

     六.匿名对象:

           1.匿名对象:没有名字的对象:new Student();

           2.匿名对象的两种使用情况:

                 1).对象调用方法仅仅一次的时候:new Student().show();

                2).作为实际参数在方法中传递:printStudent(new Student());

    七.封装:

           1.直接对外部暴露成员变量是很不安全的,这时可以将成员变量“私有化”,对外提供公有的

  get和set方法;

          2.封装的好处:

               1)隐藏实现细节,提供公共的访问方式

              2)提高了代码的复用性

              3)提高安全性。

          3.封装的原则:

               1)将不需要对外提供的内容都隐藏起来。

               2)把属性隐藏,提供公共方法对其访问。

   八.private关键字:

             1.是一种“访问修饰符”(将在day10讲到);

                Java中一共有四种访问修饰符:从宽到窄:public,protected,(默认),private

             2.用于修饰“成员变量”和“成员方法”;

             3.被private修饰的成员,只能在类的内部被其它成员访问。在类外部无法访问;

    九.this关键字:

            1.每个类都有一个“隐式”的变量:this;

            2.它是在实例化对象时,由虚拟机自动赋值的,会被自动赋值为当前对象的“引用”。

            3.this关键字可以调用本对象的“成员属性”、“成员方法”、“构造方法”;

            4.以下情况必须显示的使用this:

                    1).“局部变量”覆盖“成员变量”时,可以使用this显示的访问被覆盖的“成员变量”;否则访问的是“局部变量”;

                    2).在一个构造方法中调用本类的其它构造方法;this()或this(实参);

 

 

 

部分代码演示

 

[java]  view plain copy
  1. /* 
  2.     this关键字: 
  3.  
  4.     1.类中可以定义:成员属性、成员方法; 
  5.     2.当实例化一个类的对象时,在堆空间,会产生此类对象的空间,内部包含了所有"成员属性"。 
  6.       "成员方法"的字节码会被存储在"方法区"; 
  7.     3.实例化多个对象,在堆中:每个对象都有独立的"成员属性"的空间,但"方法区中的方法的字节码"空间,只有一个; 
  8.     4.如果方法内部需要访问"成员变量",那么JVM就要区分是哪个对象调用的此方法,那么就会去访问哪个对象的 
  9.       成员属性。区分的方式:this 
  10.     5.每个类都有一个隐式的this变量; 
  11.       当实例化此类的一个对象时,由JVM自动为其赋值,赋值为:当前对象的引用; 
  12.     6.我们可以显示的使用this去访问"本类的--成员属性、成员方法"; 
  13.     7.有两种情况,必须的显示的使用this关键字: 
  14.         1).局部变量覆盖成员变量时; 
  15.         2).在一个构造方法内调用另一个构造方法(下次课讲) 
  16. */  
  17. class Student{  
  18.   
  19.     String name;  
  20.     int age;  
  21.     int num = 10;  
  22.   
  23.     void show(){  
  24.         System.out.println(this.name + "," + this.age);//this可以调用本类的成员属性  
  25.     }  
  26.     void fun(){  
  27.         show();//OK的,可以这样直接调用  
  28.         this.show();//OK的,也可以这样调用;  
  29.     }  
  30.     void fun2(){  
  31.         int num = 20;//局部变量覆盖同名的成员变量,这个是可以的。  
  32.         System.out.println("num = " + num);//此时访问的num 就是局部的num  
  33.         System.out.println("this.num = " + this.num);//此时可以通过this关键字,显示的访问被覆盖的成员变量num  
  34.     }  
  35.   
  36. }  
  37. class Demo   
  38. {  
  39.     public static void main(String[] args)   
  40.     {  
  41.         Student stu1 = new Student();  
  42.         stu1.name = "胡歌";  
  43.         stu1.age = 20;  
  44.   
  45.         Student stu2 = new Student();  
  46.         stu2.name = "霍建华";  
  47.         stu2.age = 22;  
  48.   
  49.         Student stu3 = new Student();  
  50.         stu3.fun2();  
  51.   
  52.   
  53.     }  
  54. }  


 

 

 

 

[java]  view plain copy
  1. /* 
  2.     一个标准的Student类 
  3. */  
  4. class Student  
  5. {  
  6.     //********私有的成员属性*********//  
  7.     private String name;  
  8.     private int age;  
  9.     private char sex;  
  10.   
  11.     //********构造方法****************//  
  12.     //1.无参的构造方法,一般什么都不做  
  13.     Student(){  
  14.     }  
  15.     //2.带全参的构造方法:为所有的成员属性赋值  
  16.     Student(String name ,int age,char sex){  
  17.         this.name = name;  
  18.         this.age = age;  
  19.         this.sex = sex;  
  20.     }  
  21.   
  22.     //*********一些get和set方法***********//  
  23.     void setName(String name){  
  24.         this.name = name;  
  25.     }  
  26.     String getName(){  
  27.         return this.name;  
  28.     }  
  29.     void setAge(int age){  
  30.         this.age = age;  
  31.     }  
  32.     int getAge(){  
  33.         return this.age;  
  34.     }  
  35.     void setSex(char sex){  
  36.         this.sex = sex;  
  37.     }  
  38.     char getSex(){  
  39.         return this.sex;  
  40.     }  
  41.   
  42.     //还可以定义一些普通成员方法  
  43.     void show(){  
  44.         System.out.println("大家好,我叫:" + this.name +   
  45.                             ",今年:" + this.getAge() +   
  46.                             ",性别:" + this.sex);  
  47.     }  
  48. }  
  49. class Demo   
  50. {  
  51.     public static void main(String[] args)   
  52.     {  
  53.         //通过"无参构造方法"构造一个对象  
  54.         Student stu = new Student();  
  55.         stu.setName("张三");  
  56.         stu.setAge(20);  
  57.         stu.setSex('男');  
  58.   
  59.         System.out.println(stu.getName() + "," + stu.getAge() + "," + stu.getSex());  
  60.         System.out.println("调用show()方法:");  
  61.         stu.show();  
  62.   
  63.         //通过"全参的构造方法"构造一个对象  
  64.         Student stu2 = new Student("李四",22,'男');  
  65.         System.out.println(stu2.getName() + "," + stu2.getAge() + "," + stu2.getSex());  
  66.         System.out.println("调用show()方法:");  
  67.         stu2.show();  
  68.     }  
  69. }  

 

  

[java]  view plain copy
  1. /* 
  2.     当我们定义一个类,在类中定义"成员属性"时,这些属性是可以直接被其它类访问的。 
  3.     这种方式,是很不安全的。所以这里讲解Java的封装: 
  4.  
  5. */  
  6. class Student  
  7. {  
  8.     private String name;  
  9.     private int age;  
  10.     private String schooName = "北京大学";//此属性的值,只能被获取,不能被设置  
  11.       
  12.     void setAge(int a){  
  13.         age = a;  
  14.     }  
  15.     int getAge(){  
  16.         return age;  
  17.     }  
  18.   
  19.     void setName(String n){  
  20.         name = n;  
  21.     }  
  22.     String getName(){  
  23.         return name;  
  24.     }  
  25.   
  26.     String getSchoolName(){  
  27.         return schoolName;  
  28.     }  
  29.   
  30. }  
  31. class Demo   
  32. {  
  33.     public static void main(String[] args)   
  34.     {  
  35.         Student stu = new Student();  
  36.     //  stu.name = "张三";  
  37.     //  stu.age = 200;//当age属性被私有化后,这里不能直接访问了  
  38.   
  39.     //  System.out.println(stu.name + "," + stu.age);//当age属性被私有化后,这里不能直接访问了  
  40.           
  41.       
  42.         stu.setName("张三");  
  43.         stu.setAge(20);  
  44.           
  45.         System.out.println(stu.getName() + "," + stu.getAge());  
  46.   
  47.     }  
  48. }  


 

 

 

[java]  view plain copy
  1. /* 
  2.     1.怎样调用类的成员属性和成员方法: 
  3.         1).一定要通过类的"对象的引用"去调用; 
  4.     2.以下情况可以使用匿名对象: 
  5.         1).如果调用某个类的方法,只需要调用一次,这时,可以使用匿名对象; 
  6.         2) 
  7.              
  8. */  
  9. class Student  
  10. {  
  11.     String name;  
  12.     int age;  
  13.     char sex;  
  14. }  
  15. class MyMath  
  16. {  
  17.     double getPI(){  
  18.         return 3.1415926;  
  19.     }  
  20.     void printStudent(Student stu){//表示:接收一个有效的Student的引用  
  21.         System.out.println("学员姓名:" + stu.name);  
  22.         System.out.println("学员年龄: " + stu.age);  
  23.         System.out.println("学员性别:" + stu.sex);  
  24.     }  
  25. }  
  26. class Demo   
  27. {  
  28.     public static void main(String[] args)   
  29.     {  
  30.     //  MyMath math = new MyMath();  
  31.   
  32.         System.out.println(new MyMath().getPI());  
  33.   
  34.           
  35.         new MyMath().printStudent(new Student());  
  36.     }  
  37.   
  38.   
  39. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值