对象的建立以及初始化过程:
Person p = new Person(); //到底在内存中做了什么事情?
1.将Person.class文件加载进内存
2.如果p定义在函数中,那么在栈内存中开辟一个变量空间
3.在堆内存中给对象分配空间
4.给对象中的属性进行默认初始化
5.给对象中的属性进行显示初始化
6.调用构造代码块对所有对象进行初始化。(执行类中的构造代码块)
7.调用对应的构造函数进行对象初始化。对象初始化完毕。
8.将对象内存地址赋值给p变量。让p变量指向该对象。
Static关键字:用于修饰成员(成员变量和成员函数)
静态成员特点:
1.随着类的加载而加载
2.优先于对象存在
3.被所有对象所共享
4.可以直接被类名调用
使用注意:
1.静态方法只能访问静态成员
非静态方法既可以访问静态又可以访问非静态
2.静态方法中不能写this、super关键字。
this代表对象。而静态存在时,有可能没有对象。所以静态方法运行时,this是没有任何对象代表的。简单说,先进内存的数据不可以访问后进
内存的数据,可是后进内存的数据可以访问先进内存的数据。
3.主函数是静态的
静态:
好处:静态成员多了一种调用方式,可以直接被类名调用。
格式:类名.静态成员,也可以被对象调用。
弊端:静态方法只能访问静态成员,出现了访问局限性。
静态修饰的数据(对象共享的数据),存放在方法区的静态区中。
非静态的数据,是每一个对象的特有数据。存放在对象所属的堆内存中。
成员变量被static修饰后和非静态成员变量的区别:
1.静态变量也成为类变量,也就是可以直接被类名调用的变量。
这个变量所属于类。
(类型性变量:用类名定义的变量)
非静态变量称为成员变量或者实例变量,是被对象调用的。
所属于类。
2.静态变量随着类的加载而加载,也意味着随着类的消失而消失,
生命周期最长。
实例变量随着对象的创建而加载,随着对象的消失而消失。
按照对象的生命周期而存在。
3.静态变量存储在方法区的静态区中。
实例变量存在于对象所属的对内存中。
4.静态变量数据,被所有对象所共享。
java单例模式懒汉和饿汉实例变量是对象中的特有数据。
栈内存:给方法的局部变量提供运行的空间。
方法区:存储方法的数据。
静态变量在静态区中也会进行默认初始化。
什么时候使用static呢?
对于成员变量:
当该成员变量所存储的数据,每一个对象都是一样的,这时没有必要把数据存储到每一个对象中。只要让所有对象共享该数据即,这时成员就需要被static修饰。当数据需要被对象共享时,就使用static修饰。这样可以对共享的数据节约内存。
对于成员函数:
当成员函数内并没有访问对象中的特有数据时,就将该方法定义为静态的。
简单说:该函数如果访问了成员变量,该函数就是非静态的。
该函数没有访问过成员变量,或者访问过静态的成员变量,那么为了
程序的严谨性,将该方法定义成静态的。
(静态成员生命周期过长)
主函数是静态的,说明主函数只能直接访问静态的成员。
Public static void main(String[ ] args)
public : jvm调用的函数必须权限足够大,所以被public 修饰。
satic : 主函数随着类的加载而加载,jvm不需要创建该类对象即可完成对该函数的调用,所以是静态的。
void : 主函数没有返回值。
(String[ ] args): 主函数的参数列表,参数类型是:一个字符串数组类型的参数。
args : 参数名称。
主函数有参数,jvm调用主函数的时候就需要传入相对应的实际参数。
问:jvm调用主函数时,到底传入了什么?
new String[0];
静态代码块
static
{
<;
}
作用: 当类在加载进内存时,如果需要进行一些内容的执行,完成一个类的初始化。
就需要使用静态代码块来完成,给类进行初始化。
执行特点:当类被加载时,静态代码块就执行了,而且只执行一次。
而且优先于main函数执行。
设计模式:就是解决某类问题最行之有效的解决方案,设计模式是一种思想。
java中总结出来23中设计模式。
单例设计模式:饿汉式,懒汉式(延迟加载)
解决的问题:保证一个类在内存中的只存在一个对象。
简单说。保证一类在内存中的对象唯一性。
应用场景:比如配置文件。A要使用配置文件对象。B程序也要使用配置文件对象。
希望A程序对配置数据修改后,B程序可以直接使用,那么就需要A程序,和B 程序使用的同一个对象.
如何保证一个类在内存中的对象唯一性呢?
1,为了控制该类的对象建立,不让其他程序建立该类的对象。
2,在本类中自定义一个本类对象。
3,对外提供获取该对象的方式即可。
代码如何实现呢?
1,可以将构造函数私有化。这样对方程序创建就无法初始化。已达到不允许其他程序创建对象的目的。
2,在本类中,通过new创建一个本类对象。
3,提供一个公共的方法返回该对象,方便于其他程序获取该对象。
代码体现具体:
1,私有化构造函数。
2,创建一个私有并静态的本类的对象。
3,创建一个公共的static方法返回该对象。
关键字: extends
继承
好处:1.继承的出现,提高了代码的复用性。
2.继承的出现,让类与与类之间产生了关系。而这个关系的出现,就导致面向
对象的第三个特征---多态的出现。简单说:继承是多态的前提。
Java中支持单继承,不支持多继承(Java将多继承进行改良,避免了安全隐患的产生)
class A{void show(){sop("a");}}
class B{void show(){sop("b");}}
class C extends A,B{}//这就是多继承,一个子类同时继承多个父类。在Java中是不允许的。
C c = new C();
c.show();//到底是运行a,还是运行b?这就是安全隐患。为了避免,所以Java不允许这样继承。
简单说:一个儿子只能有一个爹,不能有多个爹。
Java中可以存在多层(多重)继承。
class A{}
class B extends A{}
class C extends B{}
这时就出现了继承体系
记住一个原则:
1. A类中定义的是这个体系中最共性的内容。
2. 要使用这个体系的功能,建议建立最子类的对象来完成调用。
父类的由来都是子类不断向上抽取而来的。就代表着,A类中定义的功能是该体系中最共性的功能。
所以要了解这个体系的功能,只要参考A类中的功能即可。
了解后,需要建立对象来调用这些功能,那么建立哪个类的对象好呢?
建议建立C类的对象,因为C类中可以使用A类中的共性功能,也可以使用C类中的特有功能。
简单说:要使用一个集成体系,原则:
1.参阅父类功能
2.建立最子类对象
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论