类与对象 封装 构造方法

在以前基础语法中,重点思维逻辑,所有的知识点就跟以前数学中的公式是一样的。

难点就是如何使用这些知识点

学习方法就要做一个简单的改变。

如果你代码写多了,你会发现一个特点,不管题目怎么变,代码都是八九不离十,代码相似度很高。

1,理解概念。

2,写代码。

在面向对象这一章节中,一定要做这件事情

"把理解概念为首要目标"

面向过程:当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细节—强调步骤

面向对象:当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人,来帮我做事儿—强调对象

特点:

       1面向对象思想是一种更符合我们思考习惯的思想,他可以将复杂的事情简单化,并将我们从执行者变成了指挥者

       2面向对象的语言中,包含了三大基本特征,封装 继承和多态.

使用面向对象:

       System.out.println(Arrays.toString(array));

       找一个JDK给我们提供好的Array类

       其中有一个toString方法,直接就能把数组变成想要的格式的字符串 

1-面向对象思想的概述 

       面向过程:

              侧重点: "步骤"

                     所有的步骤都需要我们自己一步一步的实现。

       面向对象:

              侧重点:"调用"

                     我们想要完成一个功能,此时就不需要我们自己手写了。

                     直接调用别人已经写好的代码就可以了。 

2-面向对象思想的举例 

       面向对象,自己不干了,找别人。

例如:

       你如何使用面向过程的方式找女朋友,

              1,务色。

              2,舔着个大脸去要微信号。

              3,尬聊

              4,约出来看电影,吃饭...

              5,成了。 

       面向对象的方式找一个女朋友呢?

              你只要打开淘宝,调用其中的发货功能,那么你就会有一个女朋友了。 

       你是否关心,你如何拥有的?

              我不关心,我只要调用别人已经有的功能(方法),就可以了。

              我不关心,我调用的那个方法是如何实现的。

3-类和对象的关系

类:是一组相关属性和行为的集合.可以看成是一类事物的模板,使用事物特征和行为特征来描述该类事物

属性:就是该事物的状态信息(是什么)

行为:该事物能够做什么

成员变量(属性):以人为类-姓名,性别,年龄

成员方法(行为):以人为类-吃饭,睡觉, 

对象:是一类事物的具体表现,对象是类的一个实例,必然具备该类事物的属性和行为.

       女朋友  //描述--- 对应着Java中的类。

              有一双漂亮的眼睛。

              有一双漂亮的耳朵。

              有一个漂亮的鼻子。

              温柔,大方,不发脾气。

              可以把她的脏衣服给你。

              可以让你去做饭。

              可以让你提交你的工资卡。

              可以一个月给你200块零花钱,有的时候还忘记。 

类和对象的关系

1 类是对一类事物的描述,是抽象的

2 对象是一类事物的实例,是具体的

类是对象的模板,对象是类的实体 

       等你实际的按照上面的描述标准去找到的女朋友。

              才是真正的对象。 --- 在Java中还有一个名词(实体) 

       "对象,实体" --- 他指的是同一个东西。 

4-类的定义

       如何定义一个类。

       事物与类的对比

现实世界的一类事物

       属性:事物的状态信息

       行为:事物能够做什么

JAVA中用class描述的事物也是如此

       成员变量:对应事物的属性

       成员方法:对应事物的行为 

类的定义格式

定义类就是定义类的成员,包括成员变量和成员方法

成员变量(属性):和以前定义变量几乎是一样的,只不过位置发生了改变,在类中,方法外

成员方法(行为):和以前定义的方法是一样的,只不过把static去掉,static的作用在面向对象后面的课程中再详细讲解

              1,成员变量

                            定义在方法外,类的里面。

                            定义变量的时候,没有写赋值。                            

              2,成员方法

                            不加 static 关键字。 

       类:是对事物的描述。

              这个事物,什么被定义成成员变量

                              什么被定义成成员方法? 

       成员变量:

              属性。。。

                     //这类事物本身有什么特点。              

       classworker{ //工人

              //属性

                     姓名

                     年龄

                     性别

                     工号

                     职务

                     特长

              //行为

                     工作

                     吃饭

                     睡觉

       } 

       class程序猿{

              //属性

                     姓名

                     年龄

                     性别                         

              //行为

                     写代码()                     

                     改变世界(     ){                

       } 

       成员方法:

              行为。。。

                     //这类事物本身能干什么?

例子: public class student {
    String name;//----------------成员变量
    int age;       //------------------------------成员变量
    public void eat(){//--------------------成员方法
        System.out.println("吃饭饭!");
    }
    public void sieep(){//-------------------成员方法
        System.out.println("睡觉觉!");
    }
    public void study(){//-------------------成员方法
        System.out.println("学习!");
    }
}

注意:

1:成员变量是直接定义在类当中的,在方法外边

2:成员方法不要写static关键字 

5-对象的创建及其使用 

       如何使用一个类

通常情况下,一个类并不能直接使用,需要根据一个类创建一个对象,才能使用 

              1,导包  : 也就是指出需要使用什么类,在什么位置 

                     a,如果在同一个包下就不需要导包。

                     b,在java的lang包下也不需要导包

                            //java自己也给我们开发者提供了各种各样的类。以便我们开发。

                            //不可能把所有的类都放在同一个包中。

                            //其中有一个包名 lang 表示这个包是java的核心包

       import包名称,类名称

       importcn.itcast.day01.demo01.Student;

   对于和当前类属于同一个包的情况,可以省略导包语句不写                     

                     问:

                            如何看一个类是否在java的lang包下呢?

                                   这个知识点到学习java的api的时候再进行解释。 

              2.创建对象

                     格式:

                     类名称对象名 = new 类名称();

Student stu = new Student(); 

                     //Student类 就是对学生这个事物的描述 

                     //现在我new出来的这个对象,就实际的表示一个学生。

                     Studentstu = new Student();//在java代码中表示的学生对象(学生实体)                     

                     //如何表示王嘉伟同学呢?                     

                     Studentstu =  new Student();

                     stu.name= "王嘉伟";

                     stu.age= 17;                                      

              3,使用成员变量,成员方法

                            使用成员变量:(格式)对象名.成员变量名

使用成员方法:对象名,成员方法名(参数)(也就是想用谁就用对象名点谁)                            

                            当我们创建了这个类的对象的时候,

                            那么我们可以通过这个对象来调用这个类中的方法和成员变量。

                            "其他类中的成员变量和成员变量,是不能通过这个对象来调用的。"              

                            classStudent{

                                   name 

                                   publicvoid eat(){

                                          System.out.println("今天中午吃猪蹄");

                                   }

                            } 

                            classWork{

                                   id 

                                   publicvoid work(){

                                          System.out.println("工人在工作");

                                   }

                            }                            

                            Students = new Student();

                            s就是学生对象,我们可以通过这个学生对象来调用Student类中的成员变量name 和成员方法 ea

                            但是不能

                            用s这个学生对象,去调用 Work类中的id和 work

注意事项:
// 如果成员变量没有赋值,那么将会有一个默认值,规则和数组一样
实操:
student stu = new student();//--------创建格式
System.out.println(stu.name);//----使用成员变量
System.out.println(stu.age);
stu.age = 18;//----------------------改变对象中成员变量的数值内容

stu.name = "刘亦菲";//--------将右侧的字符串赋值交给stu对象中的name
System.out.println(stu.name);
System.out.println(stu.age);
stu.eat();//---------------------使用对象的成员方法,格式
stu.sieep();
stu.study();

 

六,-一个对象的内存图

 

       惊讶的发现,跟数组一毛一样的。

              凡是new 出来的,都是在内存中出现的。

              只要是new一次,都是重新在堆里面开辟了一个空间。

七-使用对象类型作为方法的返回值:

当使用一个对象类型作为方法的返回值时

返回值其实就是对象的地址值

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

1,定义的位置不一样[重点]

局部变量:在方法的内部

成员变量:在方法的外部,直接写在类中

2,作用范围不一样[重点]

局部变量:只有方法之中才可以使用,出了方法不能用

成员变量:整个类全都可以通用

3,默认值不一样[重点]

局部变量:没有默认值,如果想要使用,必须进行手动赋值

成员变量:如果没有赋值,会有默认值,规则和数组一样

4,内存的位置不一样[了解]

局部变量:位于栈内存

成员变量:位于堆内存

5,生命周期不一样[了解]

局部变量:随着方法进栈而诞生,随着方法出栈而消失

成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失

PS通!常!情!况!下,局部变量的生命周期跟着方法走短一些

                            成员变量的生命周期跟着对象走长一点 

面向对象的基本概念:

       面向过程与面向对象的区别:

              面向过程:侧重的是过程,强调代码是一步一步的进行的。所有的工作都是需要我们自己做的。

              面向对象:侧重的是对象的调用,如果我们需要完成一个功能,那么不需要自己写,我们直接去调用已经写好的代码就可以了。

                               我们是不关心调用的方法中具体是什么逻辑的。

              类,对象。

              类:  是对一类事物的描述。 并不能指具体的某一个对象。

                            classDog{ //用来描述狗的一个类。并不能直接表示是哪一条狗。

                            }

              对象:才是一个事物的具体表现。

                            Dogd  = new Dog(); //品种 ,年龄

      

       该如何定义一个类,该如何使用一个类。 

       publicclass Dog{

              //属性  --- 我们是以成员变量的形式体现的。

                     Stringcolor;

                     intage;                     

              //行为   --- 我们是以成员方法的形式体现的。

                     publicvoid eat(){

                            ...

                            }

                     publicvoid lookHome(){

                        ...}    }       

              如何使用一个类?

                     创建这个类的对象。

                            Dogd =  new Dog();                     

8-两个对象使用同一个方法的内存图

              创建两个数组的内存图是一模一样的

              结论:

                     每new一次都是一个独立的空间,互相没有影响。

                     每一个空间里面,都有各自的成员变量。 

9-两个引用指向同一个对象的内存图

       结论:

              当多个引用指向同一个对象的时候,

              只要其中一个引用对这个对象发生了改变,

              那么所有的引用再去访问这个对象时,就是改变之后的结果了。

10-使用对象类型作为方法的参数

使用对象类型作为方法的返回值:

当使用一个对象类型作为方法的返回值时

返回值其实就是对象的地址值

 

       之前我们在调用方法的时候更多的时候是把基本数据类型传递。

       结论:

              "当方法的形式参数是基本数据类型时,此时我们传递是值。 "

              "当方法的形式参数是引用数据类型时,此时我们传递是对象的地址值。"

                            引用数据:简单记:除了8种基本数据类型其他所有的都是引用数据类型。

                                             其实就是在堆里面开辟了一个空间(凡是new出来的都是引用数据类型            

       结论:

              当方法的形式参数为引用数据类型的时候,

              如果在方法中对对象进行了改变,

              那么所有的地方(main)都会发生改变。

 public static void main(String[] args) {

       Phone one(0x0011) = new Phone();(0x0011)

       one(0x0011).brand = "苹果";

       one(0x0011).price = 8388.0;

       one(0x0011).color = "土豪金";

       method(one); // 传递进去的参数其实就是地址值

                     (0x0011)

              System.out.println(one.brand);//小米

              System.out.println(one.price);//899

              System.out.println(one.color);//黑色  

    }

   public static void method(Phone param) {//引用数据类型

                                                               //param接收了传递进来的地址值,那么param也可以通过这个地址值找到上面开辟的那个空间

                                                        //param接收到的就是 0x0011

       System.out.println(param(0x0011).brand); // 苹果

       System.out.println(param(0x0011).price); // 8388.0

       System.out.println(param(0x0011).color); // 土豪金

 

              param.brand= "小米";

              param.price= "899";

              param.color= "黑色";

    } 

11-使用对象类型作为方法的返回值

 public static void main(String[] args) {

       Phone two = getPhone();

       System.out.println(two.brand); // 苹果

       System.out.println(two.price); // 8388.0

       System.out.println(two.color); // 玫瑰金

    }

   public static Phone getPhone() {

       Phone one = new Phone();

       one.brand = "苹果";

       one.price = 8388.0;

       one.color = "玫瑰金";

       return one;

    } 

通过以上的两个知识点:       

       "方法需要什么,我们就给什么"

       "方法返回什么,我们就用什么去接收"

12-成员变量和局部变量的区别

       作用范围 --- 生命周期

              //只要这个变量活着的时候,就可以被使用

       小明家有一条狗,这条狗是一只母狗。有一天小狗怀孕了。

       小红问小明,你家的狗生了吗?

       小明说:"未生出"       

       未:

              位置

                     ---代码中的位置

                                   //成员变量,类中,方法外。  局部变量,方法里面或者方法声明上(形式参数)

                     ---内存中的位置

                                   //成员变量,当创建对象时,new出来的小空间里面。

                                   //局部变量,栈的对应的方法里面。

       :

              生命周期(作用范围)

                                   //成员变量:当对象开始创建的时候开始存在,当对象变成垃圾就消失了。

                                   //局部变量:从局部变量开始定义的时候才出现,

                                   //               当代码执行到局部变量所在的右大括号的时候。就消失了                                                                     

       :

              默认初始化值

                            //成员变量是有默认初始化值。整数:0   小数(浮点数) 0.0    

                            //                                               引用:null

                            //局部变量没有默认初始化值,如果想要使用,一定要先赋值才能使用。 

13-面向对象三大特征之封装性

       面向对象的三大特征:封装,继承,多态

封装性在java当中的体现:

1,方法就是一种封装

              封装性在Java当中的体现:

                     1.方法就是一种封装  --- 侧重于调用,而忽视方法的实现细节。

                                   //好处:

                                          //1,提高了代码的复用性。 --- 我们想要用的时,直接调用就可以了。

                                          //2,提高了代码的可维护性。 --- 当我们后续想要修改逻辑时,只要修改方法中的代码就可以。调用处我们就不需要改。

                     2.关键字private也是一种封装

                                   私有化成员变量。

                                          为什么要私有化成员变量。

                                                 为了保证数据的安全性。不让外界直接使用对象点去调用。

                                                 封装就是将一些细节信息隐藏起来,对于外界不可见

                                   外界就已经不能直接访问了,但是成员变量一定要被赋值,否则是没有意义的。

                                   所以我们又写了一个setXxxx 和getXxx的方法用来获取和设置值。 

                                   "通过这样的方式又能保证数据的安全性,又能对成员变量进行赋值。"

              一旦使用了private进行修饰,那么本类中仍然可以随意访问

但是!超出了本类范围之外就不能再直接访问了 

间接访问private成员变量,就是定义一堆getter/setter方法

必须叫setXxx或者是getXxx命名规则

对于Getter来说,不能有参数,返回值类型和成员变量对应

对于Setter来说,不能有返回值,参数类型和成员变量对应 

                                   classStudent{

                                          privateString name; 

                                          publicvoid setName(String n){

                                                 name= n;                                          }

                                          publicString getName(){

                                                 returnname;

                                          }

                                   }                                          

                                   //如果我仅仅是想修改值还好。

                                   //Students = new Student();

                                   //s.setName("老王"); 

                                   //------

                                   //我仅仅只想获取值,怎么办?

                                   class Student{

                                          privateString name;

                                          publicString setName(String n){//李四

                                                 name= n;

                                                 returnname;

                                          }          }

                                    //所以 set和get方法一定一定要分开写。

                            publicprivate 这两个关键字的特点

                                   也称之为权限修饰符。

                                   public: public 可以修饰类,可以修饰方法,可以修饰成员变量。

                                                 当修饰类的时候,类名一定要跟文件名保持一致。

                              当修饰方法和成员变量时,在其他任何包,任何类中都可以进行调用。(只要是在同一个项目下)                                   private:修饰方法和成员变量。

                                                        只能在本类中被访问。

                            以上就是要求大家掌握的两种权限修饰符。

              封装就是将一些细节信息隐藏起来,对于外界不可见。

 

构造方法

构造方法是专门用来创造对象的方法,当我们通过关键字new来创建对象时其实就是在调用构造方法

格式:

public 类名称(参数类型参数名称){

       方法体 }

例子:

public student (){

system.out.println("构造方法使用了");

}

注意事项:

1,构造方法的名称必须和所在的类名称完全一样,就连大小写也要一样

2,构造方法不要写返回值类型,连void都不要写

3,构造方法不能return一个具体返回值

4,如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数没有方法体什么事情都不做.public student(){}

5,一旦编写了至少一个构造方法,那么编译器将不再赠送.

6,构造方法也是可以进行重载的

       重载:方法名称相同,参数列表不同

 

定义一个标准的类(student为例)

一个标准的类通常拥有下面四个组成部分

1,所有成员变量都要使用private关键字修饰

2,为每一个成员变量编写一对Getter/Setter方法

3,编写一个无参数的构造方法

4,编写一个全参数的构造方法

这样的标准类也叫做 Java Bean

//--------------------------------

面向对象的特点:

       可以简化了我们代码的书写。

       //当我们需要什么什么功能的时,我们不需要自己手动的写代码

       //可以使用java提供好的类,调用里面对应的方法就可以了。

学习的最为主要的知识点:

       如果写一个类去描述一个学生对象。

                                   //也会统称为  javabean类。实体类。

              publicclass Student{ //类名要跟你描述的那个群体保持一致。"见名知意。"

                                                 //成员变量 --- 用来描述学生的属性。

                     //姓名,年龄,性别,学科。

                     privateString name; //不让外界可以直接用对象点去调用这些成员变量。
                                                               //可以提高了数据的安全性。

                     privateint age;

                     privateString gender;

                     privateString subject; 

                     //为了解决外界可以赋值这样的操作。

                     //针对于每一个私有化的成员变量,要提供其对应的get和set方法。

                     //如果有10个私有化的成员变量

                     //是不是仅仅是get和set方法一共就要提供20个呢?

                     //是的。

                     利用idea 自动生成 get和set方法.

                                                 //成员方法 ---- 用来描述学生的行为,说明了学生可以做什么

       如何创建这个类去调用这个类里面的方法。

              //在别的类中创建javabean类的对象,那么别的类,我们一般也会称之为 测试类。

                            //一般会在测试类中写main方法。

                            //会在测试类中创建javabean类的对象,并进行赋值调用等。

              是在别的类中创建Student类的对象。

              Students = new Student();

              s.setName("张三");

              Stringname = s.getName();

 

              s.study();

//---------------------------------------------------

16-this关键字的作用

              this关键字的作用

当方法的局部变量和类的成员变量重名的时候,根据就近原则,有限使用局部变量

如果需要访问本类当中的成员变量,需要使用格式

this.成员变量名

重点:

"通过谁调用方法,就就是this-主要就是在重名的情况下起到区分的效果"

 

       在java代码中,使用变量的一个就近原则:

              谁离我近,我就用谁。

             

       当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量。

              System.out.println(a);//首先去当前方法的局部位置找有没有定义变量a

                                                        //如果局部位置没有变量a,那么就到本类的成员位置去找。

                                                        //等学习了继承之后,还会继续找,一直找不到才会报错。

当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量。

       如果需要访问本类当中的成员变量,需要使用格式:

       this.成员变量名

 

       “通过谁调用的方法,谁就是this。”

       this关键字

              classStudent{

                     Stringname;

                    

                     publicvoid say(String name){

                            System.out.println(this.name);

                     }

              }

              //问:

                     //方法里面 name

                     //成员位置 name

              //为什么没有报错?

                     //为什么局部变量跟成员变量重名的时候,没有报错?

                     //内存。

                     //成员变量在内存中,堆里面,创建对象的那个小空间中。

                     //局部变量在栈里面,当方法加载到栈里面的时候,才会定义一个局部变量

 

              //如何定义变量不会因为重名而报错。

                     "在内存中,不要在同一个空间中。"

       this:

              "通过谁调用的方法,谁就是this"

              ---

              "谁来调用我,我就代表谁"

 

       我们可以把this理解成一个变量,记录的是当前调用方法对象的地址值。

              "谁来调用this所在的方法,那么此时this就代表这个对象的地址值。"

       如果需要访问本类当中的成员变量,需要使用格式:

       this.成员变量名

       问:

              1,构造方法有什么作用?是被谁调用的?

                     在创建对象时,给成员变量进行赋值的。

                     不是我们手动调用的,而是在创建对象的时候,虚拟机会根据你小括号的参数,来决定调用哪个构造方法。

             

              2,既然构造方法可以用来赋值,那么set也可以用来赋值。

                     构造方法赋值更为的简单。

                     Students = new Student("zhangsan",23,"男");

                     Students = new Student();

                     s.setXXX

                     s.setXXX

                     s.setXXXX

                     既然更简单,那么我们还用set方法干嘛?

                     构造方法只能在创建对象的时候进行赋值。

                            Students = new Student("zhangsan",23,"男");

                            s= new Student("lisi",23,"男"); //把zhangsan干掉,重新创建了一个对象。

                     结论:

                            "构造方法只能在创建对象的时候赋值。"

                            "set方法准确的来说。  修改值。"

18-定义一个标准的类

定义一个标准的类(student为例)

一个标准的类通常拥有下面四个组成部分

1,所有成员变量都要使用private关键字修饰

2,为每一个成员变量编写一对Getter/Setter方法

3,编写一个无参数的构造方法

4,编写一个全参数的构造方法

这样的标准类也叫做 Java Bean

 

自动生成javabean类的快捷键:

   //以后写一个标准的 javabean类

              //创建类

                     在project界面,按 alt + Insert (alt + fn  +Insert)

   //1,私有化成员变量

                     自己手动写

   //2,生成空参构造

                     在代码编辑区域,按 alt + Insert,选择第一个构造

                     按两下tab键后按回车

                     第一次tab:取消默认选择。

                     第二次tab:选择ok右边的 selectnone

   //3,生成带全部参数的构造

                     在代码编辑区域,按 alt + Insert,选择第一个构造

                     按住shift不要松,选择全部的成员变量 后 回车

   //4,针对于没有私有化的成员变量都要提供get和set方法

                     在代码编辑区域,按 alt + Insert,选择get and set

                     按住shift不要松,选择全部的成员变量 后 回车

   //5,show方法。

                     手动写,将所有的成员变量都拼接在一起。

猜你喜欢

转载自blog.csdn.net/snack_tc_dora/article/details/81056998
今日推荐