Java基础语法04-面向对象上-类-属性-方法-可变参数-重载-递归-对象数组

面向对象是一种思想,一般指将事务的属性与方法抽出总结为模板(类/class),处理事务时通过类创建/new对象由对象的功能/方法去完成所要计算处理的事情。

面向过程:POP:以过程,步骤为主,考虑怎么做

面向对象:OOP:以对象(谁)为主,考虑谁来做,谁能做

:是一类具有相同特性的事物的抽象描述,是一组相关属性和行为的集合

对象:是一类事物的具体体现。对象是类的一个实例,必然具备该类事物的属性和行为。

属性:事物的状态信息。

行为:事物能够做什么。

[修饰符]class 类名 {//类名首字母大写

  //成员变量
  //成员方法

}

对象的创建

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

如果两个类都在一个.java源文件中,只能有一个类是public的

类、数组都是引用数据类型,引用数据类型的变量中存储的是对象的地址,或者说指向堆中对象的首地址。Java是对程序员隐藏内存地址的,默认提取的是对象的运行时类型@代表对象唯一编码的hashCode值。

成员变量

类变量:有static修饰,也叫类变量,属于整个类的,不是属于某个实例

实例变量:没有static修饰,也叫对象属性,属于某个对象的,通过对象来使用

【修饰符】 class 类名{
【修饰符】 数据类型 属性名; //属性有默认值
【修饰符】 数据类型 属性名 = 值; //属性有初始值
}

说明:属性的类型可以是Java的任意类型,包括基本数据类型、引用数据类型(类、接口、数组等)

如何在类外面访问成员变量

类变量:

类名.静态成员变量 //推荐

对象名.静态成员变量 //不推荐

实例变量:

对象名.静态成员变量 //只能使用这种方式

成员变量的特点

(1)成员变量有默认值

基本类型整数(byte,short,int,long)0
  浮点数(float,double) 0.0
  字符(char) '\u0000'
  布尔(boolean) false
  数据类型 默认值
引用类型 数组,类,接口 null


(2)类变量的值是所有对象共享的,而实例变量的值是每个对象独立的

成员变量的内存图

方法的概念

方法也叫函数,是一个独立功能的定义,是一个类中最基本的功能单元。

把一个功能封装为方法的目的是,可以实现代码重用,从而简少代码量。

方法的使用原则:

(1)必须先声明后使用

  类,变量,方法等都要先声明后使用

(2)不调用不执行,调用一次执行一次。

语法格式

【修饰符】 返回值类型 方法名(【参数列表:参数类型1 参数名1,参数类型2 参数名, ...... 】){
  方法体;
【return 返回值;】
}

return

return 结束方法,并将方法的结果返回去,

如果返回值类型不是void,方法体中必须保证一定有return 返回值语句,并且要求该返回值结果的类型与声明的返回值类型一致或兼容。

如果返回值类型为void时,return 后面不用跟返回值,甚至也可以没有return语句。

return语句后面就不能再写其他代码了,否则会报错:Unreachable code

如何在其他类中调用方法

(1)实例方法

对象名.实例方法(【实参列表】)    //必须通过对象来访问

(2)类方法

类名.类方法(【实参列表】) //推荐

对象名.类方法(【实参列表】) //不推荐

(1)调用时,需要传“实参”,实参的个数、类型、顺序。顺序要与形参列表一一对应

如果方法没有形参,就不需要也不能传实参。

(2)调用时,如果方法有返回值,可以接受或处理返回值结果,当然也可以不接收,那么此时返回值就丢失了。

如果方法的返回值类型是void,不需要也不能接收和处理返回值结果。

在本类中访问本类的成员变量和成员方法

直接用,不需要加“对象名."和"类名."

唯一例外:静态方法中不能直接访问本类的非静态的成员变量和成员方法

方法调用内存分析

方法的调用

方法不调用不执行,调用一次执行一次,每次调用会在栈中有一个入栈动作,即给当前方法开辟一块独立的内存区域,用于存储当前方法的局部变量的值,当方法执行结束后,会释放该内存,称为出栈,如果方法有返回值,就会把结果返回调用处,如果没有返回值,就直接结束,回到调用处继续执行下一条指令。

栈结构:最先进的最后出

方法的参数传递机制

方法的形参是基本数据类型时,形参值的改变不会影响实参;复制一份数据传递

方法的形参是引用数据类型时,形参地址值的改变不会影响实参,但是形参地址值里面的数据的改变会影响实参。传递的是地址值

成员变量与局部变量的区别

(1)声明的位置不同

成员变量:类中方法外

局部变量:方法中

(2)初始值不同

成员变量:有默认值

局部变量:必须手动初始化

(3)内存存储位置不同

成员变量:

类变量:方法区

实例变量:堆

局部变量:

(4)生命周期

成员变量:

类变量:和类的生命周期相同,该类所有对象共享

实例变量:每一个对象的实例变量的生命周期是独立的,随着对象的创建而创建,随着对象的回收而消失

局部变量:随着方法被调用执行在栈中分配,方法调用结束内存就释放,并且还有作用域问题。

(5)修饰符

成员变量:有很多修饰符,例如:public,private,static等

局部变量:不能有修饰符

可变参数

在JDK1.5之后,如果我们定义一个方法时,此时某个形参的类型可以确定,但是形参的个数不确定,那么我们可以使用可变参数。

格式:

【修饰符】 返回值类型 方法名(【非可变参数部分的形参列表,】参数类型... 形参名){ }

要求:

(1)一个方法最多只能有一个可变参数

(2)如果一个方法包含可变参数,那么可变参数必须是形参列表的最后一个

参数类型... 形参名       相当于         参数类型[] 形参名

因为可变参数实参接收值时就是以数组形式处理的

只是后面这种定义,在调用时必须传递数组,而前者更灵活,既可以传递数组,又可以直接传递数组的元素,这样更灵活了。

方法重载

- 方法重载:指在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可,与修饰符和返回值类型无关。
- 参数列表:数据类型个数不同,数据类型不同,数据类型顺序不同。

注意区分方法重写:主要用在子类重写父类的方法,几乎要求返回值类型、方法名、形参列表都相同

注意:(形参类型... 形参名) 与 (形参类型[] 形参名) 不构成重载。即在一个类中创建方法名相同,形参类型相同的数组和可变参数2个方法时编译不通过

通过命令行给main方法的形参传递的实参称为命令行参数

java 运行的类名 参数1 参数2 参数n //中间用空格分开

递归

递归分为两种,直接递归和间接递归

注意事项:

- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
- 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。

对象数组

数组的元素可以是基本数据类型,也可以是引用数据类型。当元素是引用数据类型是,我们称为对象数组。

注意

对象数组,首先要创建数组对象本身,即确定数组的长度,然后再创建每一个元素对象,如果不创建,数组的元素的默值就是

null,所以很容易出现空指针异常NullPointerException。

对象数组的内存图 

posted @ 2019-11-14 19:44  远离颠倒梦想  阅读(176)  评论(0编辑  收藏  举报