1.面向对象和面向过程编程思想及其区别?
面向过程编程是把编程的重心放在方法实现的过程中,由上到下,由高到低的顺序执行,一步一步逐步细化;是一种以事件为中心的编程思想。
面向对象编程编程将整个过程按照功能性划分为不同的对象,然后将过程交给不同的对象去处理,过程由系统进行判断;是一种以事物为中心的编程思想。
举例:
一、把大象装进冰箱
面向过程:
打开冰箱(冰箱) → 装填(冰箱,大象) → 关门(冰箱)
面向对象:
冰箱.开门() → 冰箱.装填(大象) → 冰箱.关门()
2.理解类和对象的概念,以及两者之间的关系?
类是对事物的一种抽象定义,是一组相关的属性和行为的集合;
对象是该类事物的具体表现形式。具体存在的个体。
举例:
由于这两个人具有这些共性的地方,所以我们把它抽象出来,定义为一个类——人类,比如小李和老张都有姓名、年龄、身高、体重等一些属性,并且两人都能够进行聊天、运动等相似的行为对象。
3.java类的成员变量和成员方法
成员变量和成员方法是范围最大的定义,提到成员变量就可以理解成你所定义在一个类体中的各类变量的统称,成员方法亦如是。java类的成员变量包括实例变量和类变量,成员方法包括实例方法和类方法。
成员变量:定义在类中,方法体之外
成员方法包括实例方法和类方法。
4.成员变量和局部变量区别?
成员变量和局部变量的区别
(1)在类中的位置不同
成员变量:类中方法外
局部变量:方法定义中或者方法声明上
(2)在内存中的位置不同
成员变量:在堆中
局部变量:在栈中
(3)生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
(4)初始化值不同
成员变量:有默认值
局部变量:没有默认值,必须定义,赋值,然后才能使用
5.掌握对象的创建过程和内存分析?
- 加载检查(类):检查指令(new、clone、对象序列化等)的参数是否能常量池找到类的符号引用,并检测这个类是否被加载过
- 内存分配:JVM为对象分配内存。对象所需的内存空间大小在类加载完后可以完全确定,其本质是在堆中开辟一块确定的内存空间
6.掌握构造方法的语法、特点及构造方法重载
特点:
构造方法的名字必须和类名一样,且不需什么返回值类型
当没有指定构造方法时,系统会自动添加无参的构造方法。
构造方法可以重载:方法名相同,但参数不同的多个方法,调用时会自动根据不同的参数选择相应的方法。
构造方法是不被继承的
当我们手动的指定了构造方法时,无论是有参的还是无参的,系统都将不会再添加无参的构造方法。
构造方法不但可以给对象的属性赋值,还可以保证给对象的属性赋一个合理的值
构造方法不能被static、final、synchronized、abstract和native修饰。
重载:函数的重载按我的理解就是同一个方法,不同的实现方式。即一个类当中,可定义多个同名的方法,只要他们的参数的个数、参数类型、亦或是仅仅参数的顺序不同
7.掌握基本数据类型传递和引用数据类型传递的区别?
java中的方法可以传递参数,参数的传递方法就是值传递。
参数有形参和实参,定义方法时写的参数叫形参,真正调用方法时,传递的参数叫实参。
调用方法时,会把实参传递给形参,方法内部其实是在使用形参。
所谓值传递就是当参数是基本类型时,传递参数的值,比如传递i=10,真实传参时,把10赋值给了形参。
当参数是对象时,传递的是对象的值,也就是对象的首地址。就是把对象的地址赋值给形参。
基本数据类型和引用数据类型作为参数的区别:
基本数据类型的变量中直接存放数据值本身,所以改的时候改的是数据值本身;
但是引用类型不同的地方在于真正的数据并没有在栈区的变量中保存,而是在堆区里面保存着,所以虽然也拷贝了一份,也是副本,但是二者指向的是同一块堆区。
引用数据类型就好比如说,两位同学使用的是同一份复习资料,其中一人把资料撕毁了,另一人当然也会受到影响。
而基本数据类型就好比复印了一份,其中一人将自己的资料撕了,并不影响别人。
总结:
1).当使用基本数据类型作为方法的形参时,在方法体中对形参的修改不会影响到实参的数值
2).当使用引用数据类型作为方法的形参时,若在方法体中修改形参指向的数据内容,则会
* 对实参变量的数值产生影响,因为形参变量和实参变量共享同一块堆区;*
3).当使用引用数据类型作为方法的形参时,若在方法体中修改形参变量的指向,此时不会
* 对实参变量的数值产生影响,因此形参变量和实参变量分别指向不同的堆区;*
8.理解this的本质
this的本质就只“创建好的对象的地址”
this最常的用法:
1、在程序中产生二义性之处,应使用this来指明当前对象。
1.1普通方法中,this总是指向调用该方法的对象、
1.2构造方法中,this总是指向正要初始化的对象。
2、使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句。
3、this不能用于static方法中。因为内存分析中,Static方法是类方法,先于任何的实例(对象)存在。即Static方法在类加载时就已经存在了,但是对象是在创建时才在内存中生成。而this指代的是当前的对象。
9.理解static修饰属性和方法的作用
static可以用来修饰属性、方法和代码块。static修饰的变量属于这个类所有,既由这个类创建的所有对象共用一个static变量。通常把static修饰的属性和方法称为类属性(类变量)、类方法。不使用static修饰的属性和方法属于单个对象,通常称为实例属性(实例变量)、实例方法。使用static修饰方法的最常见的例子是我们熟悉的main()方法。
静态方法中不能使用this和super关键字
静态方法
静态方法可以直接通过类名调用,任何的实例也都可以调用,
因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。
因为实例成员与特定的对象关联!这个需要去理解,想明白其中的道理,不是记忆!!!
因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
例如为了方便方法的调用,Java API中的Math类中所有的方法都是静态的,而一般类内部的static方法也是方便其它类对该方法的调用。
静态方法是类内部的一类特殊方法,只有在需要时才将对应的方法声明成静态的,一个类内部的方法一般都是非静态的
10.了解局部代码块、构造代码块的执行和作用?
构造代码块:
直接在类中定义且没有加static关键字的代码块称为{}构造代码;
作用:给对象统一初始化数据
局部代码块:
在函数中的代码块、
作用:在方法中,如果要缩短变量的寿命,可以使用
方法中,某段代码之后,都不再使用某个变量(这个变量有可能是一个很大的Map集合,很占内存),则可以将其定义到局部代码块中,及时结束其生命周期,释放空间!
静态代码块:
在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。
由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行
执行顺序:
- 类的加载
- 类中的静态代码块(只执行一次)
- 实例化类
- 实例化类中的静态代码块(只执行一次)
- 构造代码块(实例化一次执行一次,执行n次)
- 构造器(实例化一次执行一次,执行n次)