1.类和对象的认识
首先先来说一下什么是类和对象?
类就是一些事物的统称,比如猫和狗都可以叫做动物,对象就是将类给具体化成一个实物。
比如,人都有两个眼睛,一个鼻子,一张嘴巴,两个手,两个胳膊等等很多属性,以及吃饭睡觉这些行为,那张三这个人就是人这个类实例化出的一个对象。
类是一个比较抽象的概念,没有具体的事物,对象就是将这个抽象的类给具体化成一个具体的实物。又或者说类是用来对一个实体来进行描述的,相当于创建对象时的模板和蓝图,上面有这个对象的属性,行为以及一些信息。
2.类的定义和实例化
这里用一个学生类来做例子:
一个类是由属性和行为组成,class为定义类的关键字,Student为类的名字(用大驼峰),{}中为类的主体.
属性一般是用来描述一个类的,比如像是名字,年龄,升高体重这些都是用来描述一个学生的,而行为则是描述这个类的动作,比如考试是一个学生会做的动作。从一个类中提取这些信息的过程叫做抽象,不同人的抽象能力可能会不一样。
定义类的其实就是定义了一个新的计算机类型,就和int char float double这些差不多(和c语言中的struct有点像),既然有了一个类型那么就可以创建这个类型所对应的变量(对象),这个就是把一个类实例化成一个对象的过程。
实例化对象要用到new关键字来创建对象,而且一个类可以实例化出多个对象,每个对象都会占用实际的物理内存。
用到类中的属性和方法时用"."进行访问
3.this关键字
先来看一下这个代码:
在这里,形参和成员变量的名字一样,那么会输出一个呢?答案是会输出100,编译器会遵循就近原则打印形参,但是我们想让他打印成员变量怎么办?
这个又是怎么回事,这里的变量究竟是形参,还是成员变量,编译器怎么分的清?
这时就要用到this关键字了
看这里是不是就打印出来了成员变量了
3.1this的用处
区分成员变量和方法的形参:当成员变量的形参的名字一样的时候,使用this就可以明确的指出当前的名字代表的是当前类的成员变量。
this指向当前对象:我们可以使用this来引用就可以访问到当前对象的成员和方法。
this调用当前类中的其他构造方法(必须放在第一行)//构造方法在之后会在讲解
3.2this的特性
1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this只能在"成员方法"中使用
3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
4.在静态方法中无法使用this//之后会提到
4.对象的构造和初始化
4.1构造方法
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,没有返回值(是没有返回值,不是返回值是void)在创建对象时,由编译器自动调用,并且 在整个对象的生命周期内只调用一次。如下:
构造方法的特点:
- 名字必须和类名一样。
- 没有返回值。
- 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(是真正意义上的只调用一次)
- 构造方法可以重载
- 当类中没有任何一个构造方法时Java会自动帮助你添加一个没有参数的构造方法,让你可以调用没有参数的类(这就是为什么我们没有主动初始化时也可以编译通过的原因)//当我们编译了任何一个其他的构造方法编译器就不会再默认生成构造方法了。
- 在一个构造方法中调用另一个构造方法(根据this传进去的参数的类型决定调用那个)并且只能在第一行(不能两个构造方法互相调用)
构造方法的作用就是初始化成员变量
4.2对象的初始化
1.直接初始化
在定义成员变量时就直接给成员初始化
注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中
2.通过对象名访问成员变量初始化
3.用构造方法初始化
4.默认初始化
这个就是当用户没有主动初始化时编译器会自己生成一个无参构造方法来对成员初始化(这也是为什么局部变量必须初始化而,成员变量不用主动初始化)
5.封装
面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性
封装顾名思义,就是把一些复杂的东西给包装一下只留下一些使用的接口来简化设备。就像电脑一样,用户在使用的时候不用在意电脑内部的一些复杂原件是怎样工作的,只需要知道怎么使用就行,所以就要将电脑封装一下只留下一些USB接口供用户使用。
封装有助于实现数据的安全性和灵活性,并支持代码的可维护性和扩展性。
5.1访问限定符
Java语法中提供了有四种访问限定符,访问范围从大到小依次是private(私有),default(默认),protected(受保护的),public(公共)。这里主要讲private,protected会在继承中在提到。
- 同一包中的同一类:private(私有),default(默认),protected(受保护的),public(公共)
- 同一包中的不同类:,default(默认),protected(受保护的),public(公共)
- 不同包中的子类:protected(受保护的),public(公共)
- 不同包中的非子类:public(公共)
访问限定符不止可以修饰成员变量,还可以修饰类,一个类可以有public,default两种访问级别,使用恰当的限定符可以有效地提高代码的安全性和可维护性。
5.2private
就像这样用private限定符修饰成员变量,就将成员变量封装了起来,使得他们只能在该类下使用。如果在类外被访问编译器就会报错。
那么虽然封装起来了可是我们,还是想在类外获得成员变量的值又或者设置他们的值怎么办?
1.构造方法来实现封装的对外接口
这样就可以不引用成员变量就给成员变量赋值了。
2.Set和Get方法实现封装的对外接口。
看这样是不是就可以轻松实现封装的对外接口了,不过贴心的IDEA给我们提供了set和get快捷键点击鼠标右键(要在该类下点击),然后找到Generate选项然后点击(也可以直接Alt+Insert),再选择Setter and Getter选项点击,最后选择要创建的变量(按住Ctrl建可以选择多个创建)就可以快速创建方法。其中还有很多快捷键比如Consturctor就是创建构造方法的快捷键用法和上面一样,是不是感觉到了一种动动鼠标就能敲代码的感觉。
6.包
6.1包的概念和创建
之前在访问限定符中我们有提到包,那么包(Package)是一个什么东西?
在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件包。有点类似于目录。比如:为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件 下,也可以对某个文件夹下的音乐进行更详细的分类。
在Java中也引入了包,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一 个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。
创建包
- 在文件的最上方加上一个 package 语句指定该代码在哪个包中。
- 如果一个类没有 package 语句, 则该类被放到一个默认包中.
- 在创建包时包的名字一般使用反的域名比如com.yangleduo.www。
6.2导入包中的类
当需要使用其他包中的类时,就要导入到现在的包中,导入包要用到import关键字,就比如我们在输入值的时候IDEA会自动帮我们导入一个包。
其实在Java中已经给我们提供了很多现成的类来供我们使用,java.util.Scanner的意思就是导入util包下的Scanner类,还有一种写法是java.util.*,这个意思是导入uilt包下的所有类(不过不推荐这写,因为刚刚有提到在不同包中可以定义相同名字的类,所以当同时导入了多个包中的所有类就可能会有相同名字但是不同功能的类,那么当你调用这个名字的类时,就会起冲突编译器无法识别究竟是那个就会报错)。//java.uilt这种写法是不和法的。
常见的包
- java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入。
- java.lang.reflect:java 反射编程包;
- java.net:进行网络编程开发包。
- java.sql:进行数据库开发的支持包。
- java.util:是java提供的工具程序包。(集合类等) 非常重要
- java.io:I/O编程开发包。
//注意:import和c++的include有点像,但是import 和 C++ 的 #include 差别还是很大, C++ 必须 #include 来引入其他文件内容, 但是 Java 不需要. import 只是为了写代码的时候更方便. import 更类似于 C++ 的 namespace 和 using
6.3包访问权限
1.同一包中的同一类访问
2.同一包中的不同类访问
这里的a和b是在同一个包中的不同类(a和b都是默认default)
3.不同包之间访问
可以看见在testdemo4中可以使用public修饰的c,不可以使用private修饰的d和默认的e
7.static关键字
我们先来看一下一个问题,我们如何描述同一个考场里的学生,我们需要抽象一些信息比如姓名,考号,考场,分数等姓名,和考号每个学生都是不同的但是,考场确是相同的,我们不能在创建一个成员变量来储存考场信息,因为考场属性不需要每一个学生对象都存储一份,而是所有学生都具有的属性。在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对 象,是所有对象所共享的。考号是每个学生都不同的所以它属于具体学生这个对象,而考场是每个学生都一样的所以它属于考试学生这个类。
7.1static修饰成员变量
被static修饰的成员变量,称为静态成员变量,静态成员变量不属于某个具体的对象,是所有对象所共享的,属于这个类。
访问静态成员变量
- 静态成员变量既可以通过对象名访问,也可以通过类名访问不过一般推荐使用类名更好
- 静态成员变量是类的属性,不存储在某个对象空间中,随类的加载而创建,随类的卸载而销毁
- 类变量存储在方法区
7.2static修饰成员方法
Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的。和静态成员变量一样不属于某个具体的对象,是类方法
和静态成员变量一样可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者。(因为静态成员是属于类的所以不实例化也可以直接访问)
不能在静态方法中访问任何非静态成员变量,静态成员一般是通过静态方法来访问的。
静态方法中不能调用任何非静态方法,因为非静态方法要用this,在静态方法中调用时候无法传递this引用(this是代指对象而静态方法是类方法自然就无法使用)。
静态方法可以重写
7.4 static成员变量初始化
静态成员变量的生命周期和类相同,他们会在类实例化之前初始化,并且只会初始化一次。
直接初始化
在定义时直接初始化
静态代码块初始化
代码块之后会提
静态方法初始化
//静态成员变量的初始化顺序是按照声明的顺序进行的
8.代码块
8.1代码块的概念和分类
使用 {} 定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为四种,普通代码块 构造块 静态块 同步代码块(后续讲解多线程部分再谈)。
普通代码块
普通代码块是定义在方法中的代码块,定义在这块代码块中的变量的生命周期只在代码块中,这种代码块用到的不多,普通代码块的是按顺序执行的。
构造块
定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。
静态块
使用static定义的代码块称为静态代码块 一 般用于初始化静态成员变量 。
静态代码块不管生成多少个对象,其只会执行一次,如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并),实例代码块只有在创建对象时才会执行,静态代码块在生成类时一起被执行。
8.2代码块执行顺序
先看看下面这串代码
可见执行顺序是,构造代码块 > 构造方法 > 普通代码块
再来看看下面这个
可见静态代码块>构造代码块>构造方法>普通代码块,但是再创建第二个对象时却没有静态代码块,这就可以证明静态代码块只执行依次,并且因为静态代码块和类绑定所以再创建类时就会创建静态代码块。
结语
以上是小编对Java中类和对象的总结,如果有不正确或者哪里没有讲到位的还请在地下留言告诉小编,制作不易还请给个三连(*^_^*)!!