• 初识面向对象(类和对象)


    目录

    1. 面向对象的初步认知

    2.面向对象与面向过程

    3.类定义和使用

    4.类的定义格式

    练习 

    5.类的实例化

     什么是实例化

     6.this引用

    为什么要有this引用 

    什么是this引用

    this引用的特性

    7.对象的初始化 

    默认初始化  

     就地初始化

     使用构造方法初始化

    1. 面向对象的初步认知

            Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。

    2.面向对象与面向过程

    如果说我想要把一头大象放进冰箱里面。

    传统的思想:会去研究到底该用什么方法去放,而这就是在面向过程。

    现在的思想:总共有三个对象:大象,冰箱,人,我们只需要将冰箱门打开放进去即可。整个过程是三个对象之间交互完成的,人是不需要去关注过程的,这就是面向对象。

    以面向对象的方式来进行处理,就不会去关注过程,通过对象之间的交互完成即可。

    3.类定义和使用

     类是用来对一个实体(对象)来进行描述的。主要描述该实体(对象)具有哪些属性。
    比如说我今天在路上看到一个美女,我回宿舍会和我室友分享一下,她是一个什么样的发型,什么样的妆容,身材怎么样啊,穿的什么样的衣服。这个过程就是在描述实体(对象)。

    在java语言中,如何对类进行定义呢?

    4.类的定义格式

     在java中定义类时需要用到class关键字,具体语法如下

     //创建类

    class ClassNsme{

            field;       //成员变量

            method:   //成员方法

    }

    class为定义类的关键字,ClassName为类的名字,{}中为类的主体。

    采用Java语言将洗衣机类在计算机中定义完成,经过javac编译之后形成.class文件,在JVM的基础上计算机就可以识别了。

    注意事项:

    • 1.类名注意采用大驼峰
    • 2.成员前写法统一为public

    练习 

    1.定义一个狗类

    成员变量有:名字,颜色     成员方法有:汪汪叫,摇尾巴

    1. class dog{
    2. public String name; //名字
    3. public String color; //颜色
    4. public void barks(){ //狗的属性
    5. System.out.println(name+"在汪汪叫");
    6. }
    7. public void wag(){ //狗的行为
    8. System.out.println(name+"在摇尾巴");
    9. }
    10. }

    注意事项:

    • 1.一般一个文件中只定义一个类
    • 2.main方法所在的类一般使用public修饰
    • 3.public修饰的类必须和文件名相同

    5.类的实例化

     什么是实例化

         定义了一个类,就相当于在计算机中定义了一种新的类型, 与int,double类似,只不过这是java语言自带的内置类型,而类是用户自定义了一个新的类型。比如上述的dog类,有了这些自定义的类型之后,就可以使用这些类来定义实例。

     用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。

    1. class dog{
    2. public String name; //名字
    3. public String color; //颜色
    4. public void barks(){ //狗的属性
    5. System.out.println(name+"在汪汪叫");
    6. }
    7. public void wag(){ //狗的行为
    8. System.out.println(name+"在摇尾巴");
    9. }
    10. }
    11. public class test {
    12. public static void main(String[] args) {
    13. dog dog1 = new dog(); //通过new去实例化一个对象
    14. dog1.name = "阿黄";
    15. dog1.color = "黄色";
    16. dog1.barks();
    17. dog1.wag();
    18. dog dog2 = new dog();//通过new去实例化一个对象
    19. dog2.name = "赛虎";
    20. dog2.color = "棕色";
    21. dog2.barks();
    22. dog2.wag();
    23. }
    24. }

     运行结果:

     注意事项:

    • 1.new关键字用于创建一个对象的实例
    • 2.使用 . 来访问对象中的属性和方法
    • 3.同一个类可以创建多个实例

    6.类和对象的说明

    •  1. 类只是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员.
    •  2. 类是一种自定义的类型,可以用来定义变量.
    •  3. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
    •  4. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

     

     6.this引用

    为什么要有this引用 

    先看一个小栗子

    1. public class Date {
    2. public int year;
    3. public int month;
    4. public int day;
    5. public void setDatr(int y ,int m , int d){
    6. year = y;
    7. month = m;
    8. day = d;
    9. }
    10. public void print(){
    11. System.out.println(year+"年"+month+"月"+day+"日");
    12. }
    13. public static void main(String[] args) {
    14. Date date1 = new Date();
    15. date1.setDatr(1945,10,1);
    16. date1.print();
    17. }
    18. }

    以上代码整体逻辑非常简单,没有任何问题,一定会打印1945年10月1日

    如果不小心形参名和成员变量名相同呢?

    这个代码不会打印,因为它采用的是局部变量进行赋值的(局部变量优先使用)。 

     这个时候编译器都紊乱了,不知道该给谁赋值,成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?

     一切让this引用来揭开这层神秘的面纱。


    什么是this引用

    this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

    这时候给我们的代码加上一个this就不会出错

     

    this引用的特性

    • 1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
    • 2. this只能在"成员方法"中使用
    • 3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
    •  4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收

     

    this一共有三种使用方法: 

    • 1 this.成员变量    用于访问成员变量
    • 2  this.func    用于访问当前的成员方法
    • 3  this()  用于调用当前类的成员方法 

    7.对象的初始化 

    在java方法内部定义一个局部变量时,必须初始化,否则会报错。

     成员变量不初始化是不会报错的,因为会有一个默认值,那成员变量该怎么去初始化呢?

    对象初始化的几种方式

    默认初始化  

    在创建成员变量的时候不对它进行初始化,这就是默认初始化,系统会根据数据类型给一个默认值。

     就地初始化

    在声明成员变量时,就直接给了初始值。 

    1. public class Date {
    2. public int year = 1900;
    3. public int month = 1;
    4. public int day = 1;
    5. public Date(){
    6. }
    7. public Date(int year, int month, int day) {
    8. }
    9. public static void main(String[] args) {
    10. Date d1 = new Date(2021,6,9);
    11. Date d2 = new Date();
    12. }
    13. }

     使用构造方法初始化

     构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。

    1. public class Date {
    2. public int year;
    3. public int month;
    4. public int day;
    5. public Date(int year ,int month ,int day){
    6. this.year = year;
    7. this.month = month;
    8. this.day = day;
    9. System.out.println("这个构造方法被调用了");
    10. }
    11. public void print(){
    12. System.out.println(year+"年"+month+"月"+day+"日");
    13. }
    14. public static void main(String[] args) {
    15. Date date1 = new Date(1945,9,1); //在执行这条语句的时候,调用构造方法
    16. }
    17. }

     构造方法的特性:

    1. 名字与类名相同,没有返回值类型,设置成void也不行
    2. 一般情况下使用public修饰
    3. 在创建对象的时由编译器自动调用,并且在对象的生命周期内只调用一次

    构造方法是可以构成方法的重载的 

    1. public class Date {
    2. public int year;
    3. public int month;
    4. public int day;
    5. public Date(){
    6. System.out.println("调用了带两个参数的构造方法");
    7. }
    8. public Date(int year ,int month ,int day){
    9. this.year = year;
    10. this.month = month;
    11. this.day = day;
    12. System.out.println("这个构造方法被调用了");
    13. }
    14. public void print(){
    15. System.out.println(year+"年"+month+"月"+day+"日");
    16. }
    17. public static void main(String[] args) {
    18. Date date1 = new Date(1945,9,1);
    19. }
    20. }

    这些构造方法都可以通过编译器生成

    右击屏幕会有一个生成

    点击生成会有一个构造方法

     

     注意事项:

    如果用户没有自定义构造方法,编译器会生成一份默认的构造方法(不带参数)

    如果用户定义了,编译器不在生成。

     构造方法还可以通过this来调用其他的构造方法

     注意:

    1. this()必须是第一条语句
    2. 不能形成环

     

  • 相关阅读:
    性能优化-中间件tomcat调优
    流媒体分析之srt 协议srs 服务器数据收发
    C#控制台程序读取输入按键非阻塞方式
    2018架构真题&案例(四十九)
    用57000字讲解完2022年Java岗面试最常问的100道题,太肝了
    Vue3 + TS 防抖动
    js计时器
    OceanBase 里的 schema 是什么?
    Ansible定义各类变量,引用变量方式介绍及注册变量和vars_prompt的用法示例
    大二Web课程设计:服装网页设计题材——HTML+CSS汉服文化带背景音乐素材带视频(12页)
  • 原文地址:https://blog.csdn.net/weixin_50966738/article/details/134259756