java对象

封装、继承、多态

  • 1.对象
    • 1.1 概念的介绍
    • 1.2 什么是成员变量
    • 1.3 对象的创建语法
    • 1.4 类加载的时机
    • 1.5 成员变量的赋值的方式
      • 1.5.1 静态成员变量的赋值
    • 1.6 局部变量和成员变量
    • 1.7 this关键字
  • 2.构造器
    • 2.1 this关键字在构造器的中的作用
  • 3. static关键字
    • 3.1 静态成员变量:
    • 3.2 static成员方法(静态成员方法可不是在类加载过程中,会自动被调用的方法!!!)
    • 3.3 static与非static的比较
    • 3.4 代码块

1.对象

1.1 概念的介绍

(1)什么是对象?
Java 是面向对象的编程语言,独立的个体就是对象(Object),对象就是面向对象程序设计的核心。对象之间相互协作,共同实现程序的功能。

程序世界中的对象也类似,具有以下特点:
1.属性:个体的状态信息(对象中的数据)
2.行为:个体能够做什么(操作,对象的功能)
对象的状态: 指的是对象中属性/元素的取值对象的状态(属性)可以改变。
(2)类的概念

在Java中把创建对象的"模板",称之为类(class)。

类和对象的关系

类和对象的关系:类描述了,同种类型的对象,在属性和行为上的共性特征。

a.类是抽象的,而对象是具体的,所以对象(object)也称为实例(instance)。
b.类只规定了共性,只是描述对象该有什么属性,该有什么行为。
但是:具体对象属性的取值,即便是同类型对象也可能有差异。一个类可以创建出千千万万个不同的对象。

对象和对象的关系:
a.不同类创建的对象,属性和行为往往都具有差异,不是同种类型的对象基本没有可比性。
b.相同类创建的对象,属性和行为具有相似性,但具体属性取值也可能完全不同。

类定义的格式

[类修饰符列表] class 类名{
   类体
}

常见的类修饰符就是public和缺省的(什么都没有),还有的在后边会介绍。

1.2 什么是成员变量

什么是成员变量? 与之相对应就是局部变量的概念

局部变量: 定义在方法体,代码块等作用域内部的变量,是一个局部变量
局部位置: 指的是方法体,代码块等作用域内部,定义在局部位置的变量就是一个局部变量.

成员变量: 定义在成员位置的变量,就是一个成员变量
成员位置: 在类体当中,局部位置之外的其他位置,都是成员位置

1.3 对象的创建语法

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

注意的事项

1.左右的类名一般是需要保持一致的
2.以上语句可以类比于数组的初始化
    数据类型[] 数组名 = new 数据类型[长度];
3.其中:
  类名 对象名 是创建对象的声明部分
   声明了这个对象的数据类型,以及它的对象名
   它是一个引用,是一个局部变量,存储在方法的栈帧中
    右边 new 类名();
 new关键字表示在堆上开辟空间,创建对象

引用数据类型和基本数据类型的不同点

当我们在程序中使用一个基本数据类型时,由于基本数据类型是JVM当中已经预
先定义好的数据类型(所以基本数据类型叫"内置数据类型")

JVM可以清楚的知道这个基本数据类型变量在内存中的存储方式
(占用空间大小、结构等等),JVM能够正常开辟空间,正常给变量初始化赋值。
但是类这种引用数据类型,并不是内置数据类型,而是我们自定义的数据类型。

类加载是通过I/O的形式读取硬盘文件实现的
类加载最重要的特点是,在一次程序的运行期间,某个类最多类加载一次

1.4 类加载的时机

(1)new对象,一旦想创建某个类的对象,就必须先类加载该类
(2)启动main方法.在某个类的main方法启动之前,必须先类加载这个类.
(3)访问类的静态成员

1.5 成员变量的赋值的方式

(1)默认初始化
(2)显式赋值
(3)构造代码器赋值(显式赋值和构造代码块赋值谁在亲谁先执行)
(4)构造器赋值

1.5.1 静态成员变量的赋值

(1)默认初始化
(2)显式赋值
(3)静态构造代码块赋值

1.6 局部变量和成员变量

1.在类中定义的位置不同
成员变量: 定义在类中的成员位置
成员位置: 类体中,局部位置之外(方法体,代码块之外)
局部变量:  定义在方法体,代码块等局部位置

2.在内存中的位置不同
成员变量: 存储在堆上的对象里
局部变量: 存储在方法的栈帧,属于方法中的局部变量

3.生命周期不同
成员变量: 和对象"同生共死" 对象只要成为垃圾,成员变量就无法访问了
局部变量: 和方法调用同生共死

4.有无默认初始化不同
成员变量: 有默认初始化,无需手动初始化,它也有默认值.
局部变量: 没有默认初始化,没有默认值,必须手动初始化它,必须手动赋值

5.作用范围
成员变量: 在整个类的内部都可以生效
但是类中的成员方法可以直接访问
static方法并不能直接访问
但是可以通过创建对象,然后再用对象名点去访问

局部变量: 仅在大括号内部生效.

1.7 this关键字

什么是this关键字

在Java的一个类中,任意的一个成员方法中 它的形参列表中,都会隐含一个传参 传入的是当前对象,这个当前对象用this关键字指向 this指向当前对象,this是一个引用

当前的对象:

 什么是当前对象?
 
 对于成员方法而言,它的调用必然需要一个对象来调用它
 这时,谁来调用该成员方法,对于该成员方法而言,它就是当前对象.
 以上,要想在成员方法中访问同名的成员变量,应该使用this关键字做区分,因为它指向当前对象,是一个引用
 具体来说,就是:
     this.成员变量名访问

总结this关键字:
1.this关键字指向当前对象,是类中成员方法的一个隐式传参
这实际上,也是为什么成员方法可以直接访问类中成员变量的原因
与之相对应的,static修饰的方法,这种方法中是没有this传参的,
所以它是不能直接访问类中成员变量和方法的.

2.特殊情况下,当成员方法中的局部变量和成员变量同名时,可以用
 "this."访问 来表示访问同名成员变量,来和同名局部变量做区分。
 这种情况,this是不能省略的。但是如果仅在成员方法中访问不同
 名的成员变量,或者访问方法是没有必要加上this,加了反而画蛇添足.

3.当然this关键字的作用远不止此,我们在后面还会学习.

当this关键字在成员方法中的时候

this关键字在成员方法中是一个隐含传指向当前对象
所以当成员方法中出现同名的局部变量以及成员变量时,可以用"this."访问成员变量以示区分。

2.构造器

构造器的语法:

构造器(constructor,也叫构造方法)需要写在一个类的类体中,它是一个特殊的方法
[访问权限修饰符] 类名(形参列表){
	// 构造方法体
}

构造器的作用

类中构造器的作用:
1,构造器的作用是创建对象过程中,给成员变量赋值.
2.Java代码中使用new关键字创建对象,必然调用该类构造方法。构造器的作用是用来给成员变量赋值的。
构造器的调用不是程序员去完成的,而是在创建对象过程中,由JVM自动调用该方法
实际上程序员也没有办法直接调用该方法
但是程序员仍然能够指定,JVM调用哪个构造方法,来完成成员变量的赋值.
语法:
 new 类名(实参列表);
由于类中构造器可能存在方法重载,所以根据实参列表来具体决定调用哪个方法

默认调用的就是无参数的构造器,一但提供了有参数的构造器,无参数的就会失效,所以写代码的时候最好把无参数的构构造器写在前面。一个类中可以出现多个构造器,组成方法的重载。

构造器的快速生成的快捷键:alt + insert

2.1 this关键字在构造器的中的作用

构造器中的this和成员方法中的this类似,指向当前对象
可以用"this."访问同类中的成员变量/方法 这一点使用和成员方法中的this没有区别

但是构造器中的this有自身独有的用法:
在一个类的构造器的第一行,可以使用以下语法:
this(实参列表);
用于表示调用同类中的某个构造器!: this关键字在构造器中表示调用自身其他构造器时,
该语句必须写在构造器代码的第一行

构造器中一旦存在this调用其他构造器,执行顺序是:
1.new对象的构造器,首先被调用.它的方法栈帧首先进栈
2.new对象的构造器中,存在this调用自身其他构造器
    于是会去调用this构造器,this构造器方法栈帧进栈
3.如果代码中有显式赋值,就执行显式赋值,如果没有那就不执行
4.接下来,执行this构造器代码
   因为this构造器方法栈帧后进栈,处在栈顶,是当前正在执行的方法
5.接下来,再执行new对象的构造器代码
    new对象的构造器执行完毕,创建对象过程的赋值手段就执行完了
以上构造器的执行顺序,是方法栈帧"先进后出"保证的

构造器是,new一次对象,就执行相应的构造器一次。new几次对象,就执行几次构造器!

3. static关键字

在Java中,使用static修饰成员变量,称之为静态成员变量,它是一种属于类的变量

3.1 静态成员变量:

是一种被全体对象共享,属于类的变量,存储在一片能够被全体对象所共享的内存区域。
而不像成员变量一样,存储在对象当中!!

static修饰成员变量

[访问权限修饰符] static 数据类型 变量名;

静态成员变量的访问应该通过“类名.”去访问,不应该通过“对象名.”去访问,静态成员变量的创建和使用与对象没有任何的关系。

3.2 static成员方法(静态成员方法可不是在类加载过程中,会自动被调用的方法!!!)

[访问权限修饰符] static 返回值类型 方法名(形参列表){
      方法体
 }

特点:

1.属于类,属于全体对象所共享.不再像成员方法,属于对象.
2.应该使用"类名."调用,不需要创建对象,就可以调用静态成员方法.禁止使用"对象名."调用它
3.特殊的,静态成员变量,静态成员方法,它们的调用是在同类中时,可以省略"类名"

3.3 static与非static的比较

1.成员的所属
成员变量: 属于对象,必须创建对象才能够使用它.
静态成员变量: 属于类,无需创建对象,只要类加载后,就可以使用它
类加载的触发方式很多,不仅仅有new对象
即便内存中不存在任何对象,静态成员变量也可能存在

2.在内存中的位置
成员变量: 存储在堆上的对象中
静态成员变量: 存储在堆上被共享的区域

3.在内存中出现的时间
成员变量: 必须在创建对象之后才存在
静态成员变量: 类加载之后就存在
静态成员变量一定出现的更早,在它出现的时候,还没有成员变量

4.调用方式
成员变量: 对象名点
静态成员变量: 类名点,从语法上来说,可以用"对象名点",但是不要这么做

3.4 代码块

代码块的分类,根据其位置和声明方式的不同,可以分为:
1.局部代码块(完全没用,可以不学它,知道有这个东西就行了)
方法体等局部位置当中定义的代码块就是局部代码块
比如方法中的if/for,它们其实都是局部代码块

2.构造代码块(重点)
它和构造器是有关联的

3.静态代码块
它和static有关系,和类加载有关系.

4.同步代码块
同步是多线程中的概念,这个代码块以后再讲.
注:同步代码块,涉及多线程知识,后面再学习,今天略过它。

你可能感兴趣的:(java,java,开发语言)