Java面向对象 Main函数 静态的应用与单例设计模式java
知识概要设计模式
(1)Main函数的细解数组
(2)静态的应用,静态变量,静态代码块,静态函数jvm
(3)单例设计模式函数
1.Main函数的细解this
public static void main(String[] args)spa
主函数:是一个特殊的函数。做为程序的入口,能够被jvm调用。设计
主函数的定义:
public:表明着该函数访问权限是最大的。
static:表明主函数随着类的加载就已经存在了。
void:主函数没有具体的返回值。
main:不是关键字,可是是一个特殊的单词,能够被jvm识别。
(String[] args):函数的参数,参数类型是一个String数组,该数组中的元素是字符串。字符串类型的数组。code
主函数是固定格式的:jvm识别。对象
jvm在调用主函数时,传入的是new String[0];
将main函数中传入的字符串依次打印出来。
class MainDemo { public static void main(String[] args)//new String[] { String[] arr = {"hah","hhe","heihei","xixi","hiahia"}; MainTest.main(arr); } } //String[] args = new String[3]; //String[] args = null; class MainTest { public static void main(String[] args) { for(int x=0; x<args.length; x++) System.out.println(args[x]); } }
2.什么使用静态?
静态:static。
用法:是一个修饰符,用于修饰成员(成员变量,成员函数).
当成员被静态修饰后,就多了一个调用方式,除了能够被对象调用外,
还能够直接被类名调用。类名.静态成员。
static特色:
1,随着类的加载而加载。
也就说:静态会随着类的消失而消失。说明它的生命周期最长。
2,优先于的对象存在
明确一点:静态是先存在。对象是后存在的。
3,被全部对象所共享
4,能够直接被类名所调用。
实例变量和类变量的区别:
1,存放位置。
类变量随着类的加载而存在于方法区中。
实例变量随着对象的创建而存在于堆内存中。
2,生命周期:
类变量生命周期最长,随着类的消失而消失。
实例变量生命周期随着对象的消失而消失。
静态使用注意事项:
1,静态方法只能访问静态成员。
非静态方法既能够访问静态也能够访问非静态。
2,静态方法中不能够定义this,super关键字。
由于静态优先于对象存在。因此静态方法中不能够出现this。
3,主函数是静态的。
静态有利有弊
利处:对对象的共享数据进行单独空间的存储,节省空间。没有必要每个对象中都存储一份。
能够直接被类名调用。
弊端:生命周期过长。访问出现局限性。(静态虽好,只能访问静态。)
由于静态修饰的内容有成员变量和函数。
何时定义静态变量(类变量)呢?
当对象中出现共享数据时,该数据被静态所修饰。
对象中的特有数据要定义成非静态存在于堆内存中。
何时定义静态函数呢?
当功能内部没有访问到肺静态数据(对象的特有数据),
那么该功能能够定义成静态的。
static特色:
1,随着类的加载而加载。
也就说:静态会随着类的消失而消失。说明它的生命周期最长。
2,优先于的对象存在
明确一点:静态是先存在。对象是后存在的。
3,被全部对象所共享
4,能够直接被类名所调用。
class Person { String name; static String country = "cn"; public static void show() { System.out.println(contry+"haha"); } } class { public static void main(String[] args) { Person p = new Person(); p.show(); //Person .show(); } }
静态代码块------示例
/* 静态代码块。 格式: static { 静态代码块中的执行语句。 } 特色:随着类的加载而执行,只执行一次,并优先于主函数。 用于给类进行初始化的。 */ class StaticCode { int num = 9; StaticCode() { System.out.println("b"); } static { System.out.println("a"); } { System.out.println("c"+this.num); } StaticCode(int x) { System.out.println("d"); } public static void show() { System.out.println("show run"); } } class StaticCodeDemo { static { System.out.println("b"); } public static void main(String[] args) { new StaticCode(4); } static { System.out.println("c"); } }
这三部怎么用代码体现呢?
1,将构造函数私有化。
2,在类中建立一个本类对象。
3,提供一个方法能够获取到该对象。
对于事物该怎么描述,还怎么描述。
当须要将该事物的对象保证在内存中惟一时,就将以上的三步加上便可。
<strong>/* 这个是先初始化对象。 称为:饿汉式。 Single类一进内存,就已经建立好了对象。 class Single { private static Single s = new Single(); private Single(){} public static Single getInstance() { return s; } } */ //对象是方法被调用时,才初始化,也叫作对象的延时加载。成为:懒汉式。 //Single类进内存,对象尚未存在,只有调用了getInstance方法时,才创建对象。 class Single { private static Single s = null; private Single(){} public static Single getInstance() { if(s==null) { synchronized(Single.class) { if(s==null) s = new Single(); } } return s; } } //记录原则:定义单例,建议使用饿汉式。 class { public static void main(String[] args) { System.out.println("Hello World!"); } } </strong>