一、面向对象
1.特点:
A:是一种更符合我们思考习惯的思想
B:把复杂的事情简单化
C:让我们从执行者变成了指挥者
2.使用:
a:创建对象格式
类名 对象名 = new 类名();
b:如何使用成员变量和成员方法
对象名.成员变量
对象名.成员方法()
3.对象内存图
注意:
对象的方法在类的定义时就在方法区生成了,创建具体对象时再通过地址(0x001)调用该方法,不同的对象都是调用同一个方法。
4.Java面向对象开发、设计、特征
A:开发:就是不断的创建对象,通过对象调用功能
B:设计:就是管理和维护对象间的关系
C:特征:
a:封装:通过private隐藏对象的属性和和实现细节,仅对外提供公共访问方法(public)
b:继承:把多个类中相同的内容提取出来定义到一个类中。
c:多态
5.注意事项:
(1)成员变量和局部变量的区别
类中的位置不同:类中的方法外;方法定义中或方法声明上
内存的位置不同:在堆内存;在栈内存
生命周期不同:跟对象的创建和消失一致;跟方法的调用和调用完毕一致
初始化值不同:有默认初始值;没有默认初始值,必须在定义时赋值
(2)匿名对象的使用场景(匿名对象:new 类名(),即直接new一个对象,不给它取名字):
A:调用方法,仅仅调用一次的时候,调用多次就不适合用匿名对象了。好处:调用完毕后匿名对象就可以被当成垃圾回收
B:匿名对象可以作为实际参数传递
6.private概述
被private修饰的成员变量或方法只能在本类中访问。
7.this概述
A:代表对象,即所在函数所属的对象的引用;简单来说,哪个对象调用了this所在的函数,this就是哪个对象的引用。
B:this(实际参数)可以用来调用本类中对应参数的构造方法。
8.构造方法 (一般格式:public 类名(){ })
(1)定义:用于给对象初始化的方法
(2)特点:方法名和类名相同;不需要定义返回值类型;没有具体的返回值;所有对象都需要初始化才可以使用
(3)注意事项:
A:一个类中没有定义过构造方法,会自动生成一个默认的构造方法;相反,若自定义过构造方法,默认的构造方法就没有了。
B:一个类中可以有多个构造方法,以不同参数列表区分,即重载的形式。
9.创建对象在内存中的步骤:(例:Person person = new Person();)
(1)将person.class文件加载到内存
(2)执行到main方法时,在栈内存中开辟了main方法的空间,然后在main方法的栈区中分配了一个变量person
(3)在堆内存中开辟一块实体空间,分配了一个内存首地址。new
(4)在该实体空间中进行成员变量的空间分配,并进行默认初始化
(5)进行成员变量的显式初始化
(6)对对象实体进行构造代码块的初始化
(7)调用该对象实体对应的构造方法进行初始化
(8)将内存首地址赋值给person,person就引用了该实体(指向该对象)。
10.static,是一个修饰符,用于修饰成员(成员变量或成员方法)
(1)特点:
A:被类的所有对象共享
B:静态成员随类的加载而加载,优先于对象存在
C:静态成员可以被类名所调用
(2)注意事项:
A:静态方法只能访问静态成员,不可以访问非静态成员
B:静态方法中不能使用this、super关键字,因为可能没有对象。
C:main函数是静态的
(3)成员变量和静态变量的区别
A:属于对象,也称实例变量;属于类,也称类变量
B:存在于堆内存中;存在于方法区中
C:随对象的创建而存在,随对象被回收而消失;随类的加载而存在,随类的消失而消失
D:只能被对象调用;可以被对象调用(不推荐),也可以被类调用(推荐)
11.代码块:用{ }括起来的代码段称为代码块,根据位置和声明的不同,可以分为局部代码块、、构造代码块和静态代码块。
(1)局部代码块:声明在方法中,用于限定变量的生存周期,提高内存利用率
(2)构造代码块:声明在类中的成员位置,每次调用构造方法前,都会先执行构造代码块。
作用:可以把多个构造方法的共同代码放在构造代码块中。
(3)静态代码块:声明在类中的成员位置,用static修饰。
作用:可以对类进行初始化,随类的加载而执行,而且只执行一次,优先于main函数执行。
(4)面试题:静态代码块,构造代码块,构造方法的执行顺序?
静态代码块 —— 构造代码块 —— 构造方法
只执行一次 每次调用构造方法都执行
12.JDK5.0新特性之可变个数的形参的方法
(1).格式:对于方法的形参: 数据类型 ... 形参名
(2).特点
A:可变个数的形参的方法和同名的方法构成重载
B:可变个数的形参在调用时,参数个数从0到无穷多个都可以。
C:使用可变个数的形参的方法与使用数组的形参的方法是一致的,如String[] args相当于String ... args。
D:若方法中存在可变个数的形参,那么一定要声明在形参列表的最后,如
public void say(int i , String ... args){} 不能写成: public void say(String ... args , int i){},因为无法确定i的位置。
(3).代码案例
//下面三个方法构成重载
public int getSum(int i, int j){ return i+j; } public int getSum(int i,int j, int k){ return i+j+k; } public int getSum(int ... args){//可变个数的形参的方法定义后,上面两个方法都可以不写,它们的功能已经包含进来了,这就是可变个数形参的方法的好处。 int sum = 0; for (int i=0;i<args.length;i++){ sum += args[i]; } return sum; }