adfasd

121 阅读5分钟
面向对象:
通过类来直接描述现实世界中客观存在的事物
基本特征:封装,继承,多态
在Java语言中,除了8个基本数据类型值之外,一切都是对象。
初始化块总在构造器执行之前被调用,静态初始化块用于初始化类 。

构造器是一个类创建对象的根本途径,如果一个类没有构造器,这个类通常无法创建实例。如果类没有编写构造器,系统会为该类提供一个默认的构造器。一旦程序员为一个类提供了构造器,系统将不再为该类提供构造器。

构造器之间调用只能用this调用,并且调用必须作为构造器执行体的第一条语句。

参数传递机制
Java参数传递方式只有一种:
值传递
,将实际参数值的副本传入方法内,
参数本身不会受到任何影响

形参个数可变方法:

public void mainMethod() {    this.test(new String[]{"111", "222"});}public void test(String... names) {    for (String name : names) {        System.out.println(name);    }}
方法可接受任意多个参数值,多个参数值被当成数组传入。可变形参只能放在方法参数最后一个,所以一个方法最多只能有一个可变形参。

方法重载
同一个类里定义多个同名方法,
形参列表不同即可

成员变量和局部变量

成员变量:(
不需显示初始化,在类的准备阶段或创建类实例的时候进行默认初始化
  • 实例变量
  • 类成员变量(static修饰)
局部变量:(
除了形参外都必须显示初始化
  • 方法形参(方法签名中定义的变量)
  • 方法内局部变量(方法内部定义的变量)
  • 代码块局部变量(在代码块中定义的局部变量)
形参初始化:
当在类或实例对象调用方法时,系统会在该方法栈区内为所有的形参分配内存空间,并将实参值赋给形参。
成员变量初始化及内存中运行机制
class Person{
public String name;
public static int age;
}

class PersonTest{
public static void main(String[] args){
Person p1 = new Person();
Person p2 = new Person();
p1.name = "zhangsan";
}
}
1.第一次使用Person,先加载Person.class类并进行初始化,系统会在堆中为该类分配空间,并创建Class对象
2.创建实例对象
Person p1 = new Person()
,实例变量 name在创建实例时分配内存空间并初始化值的
p1.name = "zhangsan"


局部变量的初始化和内存中的运行机制
局部变量定义后必须经过显示初始化后才能使用,定义局部变量后,系统并未为这个变量分配内存空间,直到等到程序为这个变量赋初始值时,系统才会为局部变量分配内存,并将初始化值保存早这块内存中
局部变量不属于任何类或实例,它总是保存在方法的栈内存中
栈内存中的变量无须系统垃圾回收,往往随方法或代码块的运行结束而结束,局部变量的作用域从初始化该变量开始,直到方法或代码块运行结束。因为局部变量只保存基本类型的值或对象引用,因此局部变量所占的内存比较小。
封装


将对象的成员变量和实现细节隐藏起来,不允许外部直接访问。
将方法暴露出来,让方法来控制对这些成员变量进行安全的访问和操作
访问控制级别 由小到大: private --> default --> protected --> public

private
default
protected
public
同一个类中
同一个包中

子类中


全局范围



Java默认为所有源文件导入java.lang包下的所有类,所以在Java程序中使用String,System类时都无须使用import语句来导入这些类。

继承
每个子类只有一个直接父类。
方法重写要遵循“两同两小一大”规则
两同:方法名和形参列表相同
两小:返回值类型,子类比父类更小或相等,抛出异常,子类比父类更小或相等
一大:方法访问权限,子类的访问权限应比父类的访问权限大或相等

创建子类对象时,不仅会为子类对象的实例变量分配内存,也会为从
父类继承的实例变量分配内存

当调用子类构造器初始化子类对象时,父类构造器总会在子类构造器之前执行,以此类推。创建任何Java对象,
最先执行的总是java.lang.Object类的构造器

创建任何对象总是
从该类所在继承树最顶层类的构造器开始执行
,然后依次向下执行,最后才执行本类的构造器。

多态
父类引用指向子类对象。在进行对象转换前,使用
instanceof 进行判断来避免异常
初始化块
一个类里可以有多个初始化块,前面定义的初始化块先执行,后面定义的初始化块后执行。
初始化块的修饰符只能是static,使用static修饰的初始化块被称为静态初始化块。
创建Java对象时,总是先调用初始化块,在执行构造器方法之前执行。
public class Test{
{
a = 6
;
}
int a
= 9
;
public static void main(String[] args){
System.out.println(new Test().a); // 9
}
}
int a = 9 ;比 代码块a=6后执行。
Java在创建对象时,
系统会
先为该对象的所有
实例变量
分配内存
接着对
这些实例变量进行初始化,顺序为: 初始化块或声明时指定的初始值(按源代码中出现顺序执行),再执行构造器里指定的初始值。
注意:实际上初始化块只是一个假象,编译后的class类中,初始化块的代码会被编译到每个构造器中,且位于构造器的所有代码之前。

静态初始化块
JVM第一次主动使用某个类时,在类
准备阶段
为所有
静态成员变量分配内存空间
,在
初始化阶段
初始化成员变量,静态代码块与声明初始化按照源代码顺序执行