(1)什么是对象?
Java 是面向对象的编程语言,独立的个体就是对象(Object),对象就是面向对象程序设计的核心。对象之间相互协作,共同实现程序的功能。
程序世界中的对象也类似,具有以下特点:
1.属性:个体的状态信息(对象中的数据)
2.行为:个体能够做什么(操作,对象的功能)
对象的状态: 指的是对象中属性/元素的取值对象的状态(属性)可以改变。
(2)类的概念
在Java中把创建对象的"模板",称之为类(class)。
类和对象的关系
类和对象的关系:类描述了,同种类型的对象,在属性和行为上的共性特征。
a.类是抽象的,而对象是具体的,所以对象(object)也称为实例(instance)。
b.类只规定了共性,只是描述对象该有什么属性,该有什么行为。
但是:具体对象属性的取值,即便是同类型对象也可能有差异。一个类可以创建出千千万万个不同的对象。
对象和对象的关系:
a.不同类创建的对象,属性和行为往往都具有差异,不是同种类型的对象基本没有可比性。
b.相同类创建的对象,属性和行为具有相似性,但具体属性取值也可能完全不同。
类定义的格式
[类修饰符列表] class 类名{
类体
}
常见的类修饰符就是public和缺省的(什么都没有),还有的在后边会介绍。
什么是成员变量? 与之相对应就是局部变量的概念
局部变量: 定义在方法体,代码块等作用域内部的变量,是一个局部变量
局部位置: 指的是方法体,代码块等作用域内部,定义在局部位置的变量就是一个局部变量.
成员变量: 定义在成员位置的变量,就是一个成员变量
成员位置: 在类体当中,局部位置之外的其他位置,都是成员位置
类名 对象名 = new 类名();
注意的事项
1.左右的类名一般是需要保持一致的
2.以上语句可以类比于数组的初始化
数据类型[] 数组名 = new 数据类型[长度];
3.其中:
类名 对象名 是创建对象的声明部分
声明了这个对象的数据类型,以及它的对象名
它是一个引用,是一个局部变量,存储在方法的栈帧中
右边 new 类名();
new关键字表示在堆上开辟空间,创建对象
引用数据类型和基本数据类型的不同点
当我们在程序中使用一个基本数据类型时,由于基本数据类型是JVM当中已经预
先定义好的数据类型(所以基本数据类型叫"内置数据类型")
JVM可以清楚的知道这个基本数据类型变量在内存中的存储方式
(占用空间大小、结构等等),JVM能够正常开辟空间,正常给变量初始化赋值。
但是类这种引用数据类型,并不是内置数据类型,而是我们自定义的数据类型。
类加载是通过I/O的形式读取硬盘文件实现的
类加载最重要的特点是,在一次程序的运行期间,某个类最多类加载一次
(1)new对象,一旦想创建某个类的对象,就必须先类加载该类
(2)启动main方法.在某个类的main方法启动之前,必须先类加载这个类.
(3)访问类的静态成员
(1)默认初始化
(2)显式赋值
(3)构造代码器赋值(显式赋值和构造代码块赋值谁在亲谁先执行)
(4)构造器赋值
(1)默认初始化
(2)显式赋值
(3)静态构造代码块赋值
1.在类中定义的位置不同
成员变量: 定义在类中的成员位置
成员位置: 类体中,局部位置之外(方法体,代码块之外)
局部变量: 定义在方法体,代码块等局部位置
2.在内存中的位置不同
成员变量: 存储在堆上的对象里
局部变量: 存储在方法的栈帧,属于方法中的局部变量
3.生命周期不同
成员变量: 和对象"同生共死" 对象只要成为垃圾,成员变量就无法访问了
局部变量: 和方法调用同生共死
4.有无默认初始化不同
成员变量: 有默认初始化,无需手动初始化,它也有默认值.
局部变量: 没有默认初始化,没有默认值,必须手动初始化它,必须手动赋值
5.作用范围
成员变量: 在整个类的内部都可以生效
但是类中的成员方法可以直接访问
static方法并不能直接访问
但是可以通过创建对象,然后再用对象名点去访问
局部变量: 仅在大括号内部生效.
什么是this关键字
在Java的一个类中,任意的一个成员方法中 它的形参列表中,都会隐含一个传参 传入的是当前对象,这个当前对象用this关键字指向 this指向当前对象,this是一个引用
当前的对象:
什么是当前对象?
对于成员方法而言,它的调用必然需要一个对象来调用它
这时,谁来调用该成员方法,对于该成员方法而言,它就是当前对象.
以上,要想在成员方法中访问同名的成员变量,应该使用this关键字做区分,因为它指向当前对象,是一个引用
具体来说,就是:
this.成员变量名访问
总结this关键字:
1.this关键字指向当前对象,是类中成员方法的一个隐式传参
这实际上,也是为什么成员方法可以直接访问类中成员变量的原因
与之相对应的,static修饰的方法,这种方法中是没有this传参的,
所以它是不能直接访问类中成员变量和方法的.
2.特殊情况下,当成员方法中的局部变量和成员变量同名时,可以用
"this."访问 来表示访问同名成员变量,来和同名局部变量做区分。
这种情况,this是不能省略的。但是如果仅在成员方法中访问不同
名的成员变量,或者访问方法是没有必要加上this的,加了反而画蛇添足.
3.当然this关键字的作用远不止此,我们在后面还会学习.
当this关键字在成员方法中的时候
this关键字在成员方法中是一个隐含传指向当前对象
所以当成员方法中出现同名的局部变量以及成员变量时,可以用"this."访问成员变量以示区分。
构造器的语法:
构造器(constructor,也叫构造方法)需要写在一个类的类体中,它是一个特殊的方法
[访问权限修饰符] 类名(形参列表){
// 构造方法体
}
构造器的作用
类中构造器的作用:
1,构造器的作用是创建对象过程中,给成员变量赋值.
2.在Java代码中使用new关键字创建对象,必然调用该类构造方法。构造器的作用是用来给成员变量赋值的。
构造器的调用不是程序员去完成的,而是在创建对象过程中,由JVM自动调用该方法
实际上程序员也没有办法直接调用该方法
但是程序员仍然能够指定,JVM调用哪个构造方法,来完成成员变量的赋值.
语法:
new 类名(实参列表);
由于类中构造器可能存在方法重载,所以根据实参列表来具体决定调用哪个方法
默认调用的就是无参数的构造器,一但提供了有参数的构造器,无参数的就会失效,所以写代码的时候最好把无参数的构构造器写在前面。一个类中可以出现多个构造器,组成方法的重载。
构造器的快速生成的快捷键:alt + insert
构造器中的this和成员方法中的this类似,指向当前对象
可以用"this."访问同类中的成员变量/方法 这一点使用和成员方法中的this没有区别
但是构造器中的this有自身独有的用法:
在一个类的构造器的第一行,可以使用以下语法:
this(实参列表);
用于表示调用同类中的某个构造器!
注: this关键字在构造器中表示调用自身其他构造器时,
该语句必须写在构造器代码的第一行
构造器中一旦存在this调用其他构造器,执行顺序是:
1.new对象的构造器,首先被调用.它的方法栈帧首先进栈
2.new对象的构造器中,存在this调用自身其他构造器
于是会去调用this构造器,this构造器方法栈帧进栈
3.如果代码中有显式赋值,就执行显式赋值,如果没有那就不执行
4.接下来,执行this构造器代码
因为this构造器方法栈帧后进栈,处在栈顶,是当前正在执行的方法
5.接下来,再执行new对象的构造器代码
new对象的构造器执行完毕,创建对象过程的赋值手段就执行完了
以上构造器的执行顺序,是方法栈帧"先进后出"保证的
构造器是,new一次对象,就执行相应的构造器一次。new几次对象,就执行几次构造器!
在Java中,使用static修饰成员变量,称之为静态成员变量,它是一种属于类的变量
是一种被全体对象共享,属于类的变量,存储在一片能够被全体对象所共享的内存区域。
而不像成员变量一样,存储在对象当中!!
static修饰成员变量
[访问权限修饰符] static 数据类型 变量名;
静态成员变量的访问应该通过“类名.”去访问,不应该通过“对象名.”去访问,静态成员变量的创建和使用与对象没有任何的关系。
[访问权限修饰符] static 返回值类型 方法名(形参列表){
方法体
}
特点:
1.属于类,属于全体对象所共享.不再像成员方法,属于对象.
2.应该使用"类名."调用,不需要创建对象,就可以调用静态成员方法.禁止使用"对象名."调用它
3.特殊的,静态成员变量,静态成员方法,它们的调用是在同类中时,可以省略"类名"
1.成员的所属
成员变量: 属于对象,必须创建对象才能够使用它.
静态成员变量: 属于类,无需创建对象,只要类加载后,就可以使用它
类加载的触发方式很多,不仅仅有new对象
即便内存中不存在任何对象,静态成员变量也可能存在
2.在内存中的位置
成员变量: 存储在堆上的对象中
静态成员变量: 存储在堆上被共享的区域
3.在内存中出现的时间
成员变量: 必须在创建对象之后才存在
静态成员变量: 类加载之后就存在
静态成员变量一定出现的更早,在它出现的时候,还没有成员变量
4.调用方式
成员变量: 对象名点
静态成员变量: 类名点,从语法上来说,可以用"对象名点",但是不要这么做
代码块的分类,根据其位置和声明方式的不同,可以分为:
1.局部代码块(完全没用,可以不学它,知道有这个东西就行了)
方法体等局部位置当中定义的代码块就是局部代码块
比如方法中的if/for,它们其实都是局部代码块
2.构造代码块(重点)
它和构造器是有关联的
3.静态代码块
它和static有关系,和类加载有关系.
4.同步代码块
同步是多线程中的概念,这个代码块以后再讲.
注:同步代码块,涉及多线程知识,后面再学习,今天略过它。