java如何支持面向对象的?
类用来描述客观世界里某一类对象的共同特征,而对象则是类的具体存在,
java是如何支持面向对象的三大特征的?继承?封装?多态?
java提供了private/protected/public三个访问修饰符来实现封装
提供了extends关键字来让子类继承父类,子类继承到父类的成员变量和方法,如果访问控制允许,子类实例可以直接调到父类里定义的方法,继承是实现类复用的手段,也可以通过组合关系来实现这种复用,
使用继承关系实现复用时,子类对象可以直接赋值给父类变量,这个变量具有多态性,在运行时方可确定指向某一具体子类对象
类的初始化和实例的初始化?(加载到内存,分配内存,存入数据)
初始化=加载到内存+分配内存+存入数据
类先初始化,其后才存在实例的初始化
类/实例的初始化工作都是jvm将类/实例加载到内存,为类/实例分配内存,对类和实例所在的内存区存入数据的过程
其中jvm负责将类/实例加载到内存,为类/实例分配内存
而对类和实例所在的内存区存入数据的过程由静态初始化块和初始化/构造器完成
对实例进行所在的内存区存入数据的过程由初始化块和构造器完成,初始化块先于构造器对实例进行初始化,
对类进行所在的内存区存入数据的过程由静态初始化块完成
如果继承树里的某一个类需要被初始化,系统会先初始化该类的所有父类==会先加载该类的所有父类到内存中,并未所有父类分配内存,存入数据,随后在加载这个类,分配内存,存入数据
java编译器识别怎样的类?
【修饰符public|abstract|final】class 类名
{
静态初始化块-------jvm负责加载类,为类分配内存,静态初始化块负责向内存存入数据---在内存中生成该类
初始化块--------------jvm负责加载实例,为实例分配内存,初始化块负责像内存存入数据---在内存中生成该实例
0-n个构造器的定义--------------jvm负责加载实例,为实例分配内存,构造器负责像内存存入数据---在内存中生成该实例
0-n个成员变量的定义-----实例的状态数据
0-n个成员方法的定义------实例的行为特征
}
java编译器识别怎样的构造器?
【修饰符public|protected|private】构造器名 (形参列表)
{
}
构造器不能定义返回值类型,这是java的语法规定,至于执行完构造器方法之后有没有返回值,我的答案是返回的是对象在内存中分配的地址,
java编译器识别怎样的成员变量?
【修饰符 public|private|protected|static|final】 类型 成员变量名 默认值
java编译器识别怎样的成员方法?
【修饰符public|priivate |protected|abstract|final|static】方法返回值类型 方法名 (形参列表)
{
}
用void来声明没有返回值
关于构造器?
构造器用于构造该类的实例,java语言通过new来调用构造器,从而返回该类的实例,
java编译器只识别new,识别到new之后就会为实例分配内存,再通过初始化块/构造器存入数据,
如果一个类没有构造器,那么这个类的实例便无法创建,因此类由默认的构造器
关于static?你有没有想过,类为什么要初始化啊?
因为类他有自己的类成员和类方法啊,因此呀,必须对类加载,为类分配内存空间,并且给该类的成员存入数据呀
只要是存在static修饰的,都是为这个类进行服务的,static的作用就是区分方法/变量/内部类/初始化块是属于类的还是属于实例
关于类和内存的关系?
通过类的引用变量去访问内存中的数据,也可以直接通过类自己去访问内存中的数据
引用变量里存的是什么啊?
引用变量里存的是一个地址值,通过这个地址值可以找到内存中的数据的存放位置
java程序不允许直接访问堆内存中的数据,只允许通过引用变量访问堆内存中的数据
将引用变量的值设为null,那么这个引用变量不再指向任何的堆内存中的数据,堆内存中的数据自然变成了垃圾数据/
关于对象的this引用?
这是一个特殊的引用,在对象方法中这个引用变量的值总是等于当前操控的对象的地址值。在类方法中,this无法指向有效的对象
this关键字的最大作用是:让类中的一个方法,访问该类里的另一个方法或实例变量
java中方法不是单独存在的,必须通过对象/类调用,this.jump();=jump();java允许对象的一个成员方法调用另一个成员方法,可省略this前缀
类方法和对象方法能不能直接相互调用,取决于方法中是否缺省的this引用指向的当前对象
由于static修饰的方法中不能使用this引用,因此static修饰的方法不能直接访问非static修饰的普通成员