09_星仔带你学Java之类和对象、构造器、static修饰符

大家好,我是💖星仔💖。一个致力于为大家分享各种Java知识的博主。

✨专栏汇总✨

        🍋《星仔带你部署银河麒麟RAM架构服务器》

        🍋《星仔带你学消息队列(RebbitMQ)》

        🍋《星仔带你学Java》

        🍋《星仔带你学Elasticsearch》

        🍋《星仔带你搞定Java开发小技巧》

        🍋《星仔带你学Java设计模式》

        🍋《星仔带你搞定【软考-系统架构设计师】》

        🍋《星仔带你玩转Java面试》

    本博客收录于《华星详谈-学习中心》。本学习中心收集了Java整个技术体系的所有技术要点。每篇博客后面或者知识点结尾都附带有面试题,提供给大家巩固本章内容。

为各位同胞们能够系统性的掌握整个Java技术体系而建立的学习中心。星仔正在努力的更新学习中心中的内容。望诸君共勉!!!

🍋一、类和对象

🍒1.1  什么是抽象

什么是抽象:从特定的角度出发,从已经存在的一些事物中抽取我们所关注特性、行为,从而形成一个新的事物的思维过程,是一种从复杂到简洁的思维方式。如下图: 

抽象这一说法在美术以及我们日常生活中也能够经常看到,比如下面这个《呐喊》图。

《呐喊》是挪威印象派画家 爱德华·蒙克(Edvard Munch)的代表作之一。

画面的主体是在血红色映衬下一个极其痛苦的表情,红色的背景源于1883年印尼喀拉喀托火山爆发,火山灰把天空染红了。

画中的地点是从厄克贝里山上俯视的奥斯陆峡湾,有人认为该作品反映了现代人被存在主义的焦虑侵扰的意境表现的主题:惊恐。

🍒1.2  对象和类的关系

举一个很简单易懂的例子:

你在街上看到一个美女,就可以把这个美女看成一个对象。

 那么该对象有两方面的定义状态和行为

美女有状态:如身高,年龄,皮肤颜色等;

美女还有行为:如走路,说话,抛媚眼等。

不难发现对象可以定义成包含状态和行为的一个实体,对象(object)也称为实例(instance)。

实体:存在于现实世界中并且可以与其他物体区分开来的物体,实际存在的个体

对象:对象是人们要进行研究任何事物,一切事物都可以认为是对象。对象具有状态和行为

对象具有状态,比如姓名,年龄,性别等;对象还有操作,比如吃饭,睡觉,写代码等。

此时,通过对多个同类型的对象分析,我们可以把对象抽象成类

类:具有相同特性(状态)和行为(功能)的对象的抽象就是类。因此对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型对象是类的实例,类是对象的模板

类具有特性:对应对象的状态,用成员变量来描述,封装数据

类具有功能:对象的行为,用方法来描述。

什么是类:类是对象的类型/模板。创建一个对象就是使用一个类作为构建该对象的基础。实际上,解释类和对象的关系确实存在着“先有蛋还是先有鸡”的问题,描述类少不了对象,相反,描述对象也少不了类。

不过在面向对象编程里,我们肯定是先有类的。如果没有类,对象就没法实例化

🍒1.3  类的定义

1.3.1   类的定义语法

[修饰符]  class   类名

{

       0~N个成员变量(字段/Field),不要叫属性(JavaBean中特殊的一种成员).

       0~N个方法

}

1.3.2   定义类的注意

    1):如果类使用了public修饰符,必须保证当前文件名称和当前类名相同;

    2):类名使用名称表示,类表示某一类事物,其首字母大写,如果是多个单词组成使用驼峰表示法;如: EmployeeAdvanceSetting;

    3):在面向对象的过程中,各位定义类的时候专门为描述对象提供一个类,该类不需要main方法,我们专门再定义一个测试类/演示类来运行程序;

1.3.3   如何定义类

沿用上面的案例,接下来我们分析出对象和类,以及对象具备的状态和行为。

找多个对象共同的状态和行为:

状态:

     姓名:

     年龄:

     身高:

     体重:

行为:

     唱歌

     跳舞

然后把对象的状态使用成员变量表示,把对象的行为使用方法表示,转换成类如下

class    Person
{
      String  name;
      int        age;
      int        height;
      int        weight;

       void  sing(){}
       void    dance(){}
}

🍒1.4  对象的创建和操作

1):根据类来创建对象的语法:

      类名  变量  =  new  类名();

2):给字段设置值:

     对象变量  字段名 = 该类型的值;

3):获取字段的值:

     该字段类型  变量 = 对象变量.字段值;

4):通过对象调用方法.

     对象变量.方法(实参);

 

不同类型的成员变量初始值

 

对象的实例化过程(画图分析)

🍒1.5 对象的打印和比较对象以及匿名对象和对象的生命周期

1.5.1 对象的打印操作

     打印对象的时候打印出来的效果如:Servant@3294e4f4(类的名称@十六进制的hashCode)

     其实我们打印对象往往关心的是该对象中的数据是多少,在后续的文档中我会在ObejcttoString方法讲解到。

1.5.2 对象比较操作

  •      ==号:对于基本数据类型来说比较的是值;对于引用数据类型来说比较的是在内存中的地址值。

每次使用new关键字都表示在堆值新开辟一块内存空间,不同的内存空间地址值不同。如果对象拥有完全相同的数据,我就想让他们相等,这个在我后续的Objectequals方法中会江街道。

1.5.3 对象的生命周期

     对象什么时候出生:每次使用new关键字的时候就会在内存开辟新的空间,此时对象开始存在。

     对象的结束:当堆中的对象没有被任何变量所引用,此时该对象就成了垃圾,就等着垃圾回收器(GC)来回收该垃圾。当被回收的时候对象就被销毁了,回收垃圾的目的就是释放更多的内存空间。

1.5.4 匿名对象

没有名称的对象,即创建对象之后没有赋给某一个变量。比如说new Servant()。这就是个匿名对象。匿名对象只是在堆中开辟一块新的内存空间,但是没有把该空间地址赋给任何变量。因为没有名称,匿名对象仅仅只能使用一次,一般的把匿名对象作为方法的实参传递。

🍒1.6 案例分析(学生缴学费案例)

        学生类(Student)有两个字段:name(名字)和isFee(是否交学费的状态),有一个方法:交学费(fees)。每一个学生都是通过Student类new出来的一个对象,现在创建一个数组存放多个学生对象,再判断数组中的学生是否已经缴费,如果没有,则学生的交学费方法。

🍋二、构造器

🍒2.1 什么是构造器

创建一个学生对象的时候代码如下:

Student s1  = new     Student();

这个代码特别像在调用一个方法名称为Student的无参数方法。我们把这种特殊的方法称之为构造方法,也就是构造器构造函数、构造子:Constructor)

但是我们发现在Student类中却找不到该构造方法,在找不到的同事却又没有报错。这是由于编译器在编译源文件的时候,会给我们创建一个缺省的构造器。

🍒2.2 构造器的作用

  1.            1)创建对象,必须和 new 一起使用。

           2)完成对象的初始化操作。

🍒2.3 构造器的特点

          1):构造器的名称和当前所在类的名称相同

                  如果构造器名称叫XXX,  new  XXX();你看出来创建的是什么类型的对象吗?

          2):禁止定义返回类型,千万不要使用void作为返回类型

                   void  Student(){}这是普通方法,假设需要写返回类型也应该这样写:Student   Student(); 既然所有的返回类型都和所在类名相同何必再写。

          3):在构造器中不需要使用return语句

                  其实构造器是有返回值的,返回的是当前创建对象的引用。

🍒2.4 编译器创建的默认构造器的特点

         1):符合构造器特点.

         2):无参数的.

         3):无方法体.

         4):如果类A没有使用public修饰,则编译器创建的构造器也没有public修饰;

                如果使用了public修饰,则编译器创建的构造器也使用public修饰;

        如果我们没有显示提供构造器,则编译器在编译时创建一个缺省的构造器。但是如果我们显示定义了一个构造器,则编译器不再创建默认构造器。推论:在一个类中至少存在一个构造器

 

🍋三、static修饰符

🍒3.1 什么是static修饰符

对象都有nameage两个状态,但是不同对象的name的值和age的值是不一样的。也就是说不同对象的nameage是不一样的。

Person  p1  = new  Person();

p1.name=”春哥”;

p1.age = 31;

Person p2  = new Person();

p2.name = “凤姐”;

p2.age = 30;

System.out.println(p1.name +”, ” + p2.name);//春哥,凤姐

也就说nameage是属于对象的,不同对象的nameage是不一样的。但是在生活中有些东西不是属于某一个具体对象的,而是属于整个事物的类型。比如:全世界人的总数,人的毁灭的行为。

毁灭的行为应该属于人类,而不属于某一个人。

 从上面的逻辑我们可以知道状态和行为应该有对象和类型之分有的状态和行为应该属于对象,不同的对象状态和行为可以不一样;有的状态和行为应该属于类型不属于对象。

这就衍生出一个问题:现在如何表示人类毁灭这个行为(destory)?要解决该问题得学习static修饰符

static修饰符表示静态的,可修饰字段、方法、内部类,其修饰的成员属于类,也就是说static修饰的资源属于类级别,而不是对象级别

static的真正作用:用来区别字段,方法,内部类,初始化代码块是属于对象还是属于类本身

🍒3.2 static修饰符的特点

       1):static修饰的成员(字段/方法),随着所在类的加载而加载;

                JVM把字节码加载进JVM的时候,static修饰的成员已经在内存中存在了。

       2):优先于对象的存在;

               对象是我们手动通过new关键字创建出来的。

       3):satic修饰的成员被该类型的所有对象所共享;

                根据该类创建出来的任何对象,都可以访问static成员(比如狗天生就吃屎.)

                剧透:表面上通过对象去访问static成员,其本质依然使用类名访问,和对象没有任何关系(通过反编译看到的)

       4):直接使用类名访问static成员;

             因为static修饰的成员直接属于类,不属于对象,所以可以直接使用类名访问static成员。

🍒3.3 类成员和实例成员的访问 

类中的成员:字段,方法,内部类

类成员:      使用static修饰的成员

实例成员没有使用static修饰的成员

  1. 1):类成员只能访问类成员,实例成员只能访问实例成员。

2):类成员直接属于类, 可以通过类来访问static字段和static方法。

3):实例成员只属于对象, 通过对象来访问非static字段和非static方法。(对象其实可以访问类成员,但是底层依然使用类名访问的)。

4):static方法中,只能调用static成员。非static方法,可以访问静态成员,也可以访问实例成员。

🍒3.4 什么时候定义成static的字段和方法

        如果这个一个状态/行为属于整个事物(),就直接使用static修饰,被所有对象所共享.。在开发中,往往把工具方法使用static修饰。

        如果不使用static修饰,则这些方法属于该类的对象。我们得先创建对象再调用方法,在开发中工具对象只需要一份即可。可能创建N个对象,此时我们往往把该类设计为单例的,但是还是有点麻烦。所以一般的在开发中设计工具方法,为了调用简单我们使用static修饰。

🍒3.5 使用类成员的好处和坏处

利处:对对象的共享数据进行单独空间的存储,节省空间。没有必要每一个对象中都存储一份,可以直接被类名调用。

弊端:生命周期过长。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华星详谈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值