一、static关键字

1.1、static关键字

静态:static
用法:是一个修饰符,用于修饰成员(成员变量,成员函数)
static 修饰的内容,所有对象共享
当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以被类名.静态成员


package com.day06;
/**
* 人类
* @author Administrator
*静态:static
*用法:是一个修饰符,用于修饰成员(成员变量,成员函数)
*static 修饰的内容,所有对象共享
*当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,
*还可以被类名.静态成员
*/
public class Person {
//属性
static String country="CN"; String name;
public void show(){
System.out.println(this.name+" "+this.country);
} public static void main(String[] args) {
//多个对象使用同一个属性国家
Person p=new Person();
Person p1=new Person();
p.name="张三";
p1.name="李四";
p.show();
p1.show();
System.out.println(Person.country); //类名.静态成员变量
}
}

特点:

1.随着类的加载而加载--也就是:静态会随着类的消失而消失,它的生命周期最长。

2.优先于对象存在---

静态是先存在,对象是后存在。

3.被所有对象共享

4.可以直接被类名所调用

1.2、实例变量和类变量的区别

1.存放位置

类变量随着类的加载而加载存在方法区中。

实例变量随着对象的建立而存在于堆内存中。

2.生命周期

类变量生命周期最长,随着类的消失而消失

实例变量生命周期随着对象的消失而消失

1.3、使用注意事项

静态方法只能访问静态成员(静态成员和静态方法)

非静态方法既可以访问静态也可以访问非静态

静态方法中不可以定义this. super关键字

因为静态优先于对象存在,所以静态中不可以出现this

主函数是静态的

静态有利有弊

利处:对对象共享数据进行单独空间的存储,节省内存空间,没有必要每个对象都存储一份

可以直接被类名调用。

弊端:生命周期过长

访问出现局限性。(静态虽好,只能访问静态。)

1.4、主函数是静态的

主 函数:是一个特殊的函数,作为程序的入口,可以被JVM调用

定义:

public :代表差该该函数访问权限是最大的

static:代表主函数随着类的加载就已经存在了。

void:主函数没有具体的返回值。

main():不是关键字,但是是一个特殊的单词,可以被JVM识别。

函数的参数:String[] args--是一个数组,数组中的元素是字符串,字符串类型的数组

主函数是固定格式的,JVM识别。

args:arguments

JVM在调用主函数时,传入的是new String[0]


package com.day06;

public class MainTest {

    public static void main(String[] args) {
//遍历主函数
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
} } } package com.day06; public class MainDemo { public static void main(String[] args) {
String [] arr={"张三","李四","王五","赵六","钱七"};
MainTest.main(arr);
} }

结果:

张三
李四
王五
赵六
钱七

1.5、什么时候使用静态

2个方面:

静态修饰的内容有成员变量和函数

什么时候定义静态变量?

当对象在出现共享数据时,该数据被static修饰

对象中的特有数据要定义成非静态,存在于堆内存,对象内部

什么时候定义静态函数
当功能内部没有访问到非静态数据(对象的特有数据)

那么该 功能可以定义成静态

1.6、静态工具类

package com.day06;

/**
* 建立一个用于操作数组的工具类, 其中包含着常见的对数组操作的函数, 如:最值,排序等。
*
* @author Denny
* @version v1.0
*/
public class ArrayTool {
/**
* 为了不让外界创建对象,将构造方法私有化
* @author Denny
*
* @version v1.0
*/
private ArrayTool() {
} /**
* 获取整型数组的最大值
*
* @param arr
* 接收一个元素为int 类型的数组
* @Return 该数组的最大的元素值
*/
public static int getMax(int[] arr) {
int maxIndex = 0;
for (int x = 1; x < arr.length; x++) {
if (arr[x] > arr[maxIndex])
maxIndex = x;
}
return arr[maxIndex];
} /**
* 对数组进行选择排序
*
* @param arr
* 接收一个元素为int 的数组
*/
public static void selectSort(int[] arr) {
for (int x = 0; x < arr.length - 1; x++) {
for (int y = x + 1; y < arr.length; y++) {
if (arr[x] > arr[y])
swap(arr, x, y);
}
}
} // 用于给数组进行元素的位置置换。
private static void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
} /**
* 获取指定的元素在指定数组中的索引
*
* @param arr
* 接收一个元素为int 类型的数组
* @param key
* 要找的元素
* @return 返回该元素第一次出现的位置,如果不存在则返回 -1
*/
public static int getIndex(int[] arr, int key) {
for (int x = 0; x < arr.length; x++) {
if (arr[x] == key)
return x;
}
return -1;
}
    /**
* 将int数组转换成字符串,格式是:[e1,e2,...]
*
* @param arr
* 接收一个元素为int类型的数组
* @return 返回该数组的字符串表现形式
*/
public static String arrayToString(int[] arr) {
String str = "["; for (int x = 0; x < arr.length; x++) {
if (x != arr.length - 1)
str = str + arr[x] + ",";
else
str = str + arr[x] + "]";
}
return str;
}
}

使用类名.静态方法

二、静态代码块

2.1、静态代码块

static{

代码块;

}


package com.day06;

/**
* 静态代码块
*
* @author Denny static{ 静态代码块中的语句 }
* 特点:随着类的加载而执行, 只执行一次 用于给类进行初始化
* 并优先于主函数
*/
class StaticDemo { static {
System.out.println("static code A");
} }
public class StaticCode{
static {
System.out.println("static code B");
} static {
System.out.println("static code C");
}
public static void main(String[] args) { //2个匿名对象
new StaticDemo();
new StaticCode(); }
}

结果:

static code B
static code C
static code A

只执行一次就不在执行了

三、对象初始化过程

3.1、初始化过程

package com.day06;

/**
* 静态代码块
*
* @author Denny
* static{ 静态代码块中的语句 }
* 特点:随着类的加载而执行, 只执行一次 用于给类进行初始化 并优先于主函数
*/
public class StaticCode {
int num=9;
public StaticCode() {
System.out.println("static code A");
} static {
System.out.println("static code B");
} {
System.out.println("con code C "+this.num);
} public StaticCode(int num) {
System.out.println("con code D");
}
public static void show(){
System.out.println("E");
} public static void main(String[] args) { new StaticCode(4); }
}
 

结果:

static code B
con code C  9
con code D

四、对象调用成员过程

4.1、初始化过程

1.因为new 用到了类.class,所以会先找到类.class

2.执行该类中的static代码块,如果有的话,给类.class进行初始化

3.堆内存中开辟空间,分配内存地址,

4.在堆内存中建立对象的特有属性,并默认初化成员变量

5.对对象进行显示初始化

6.对对象进行构造代码块初始化

7.对对象进行对应的构造函数初始化。

8.将内存地址赋给内存中的对象变量

五、单例模式

设计模式:对问题行之有效的解决方式,其实,它是一种思想。

单例设计模式解决的问题:就是可以保证一个类在内存中的对象唯一性。
    比如多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。

    如何保证对象唯一性呢?
    1、不允许其他程序用new创建该类对象。
    2、在该类创建一个本类实例。
    3、对外提供一个方法让其他程序可以获取该对象。

步骤:
    1、私有化该类构造函数。
    2、通过new在本类中创建一个本类对象。
    3、定义一个公有的方法,将创建的对象返回。

5.1、饿汉式


package com.day06;
/**
* 饿汉式
* @author denny
*
*/
public class SingleDemo {
private String name;
private int age;
private static SingleDemo singleDemo=new SingleDemo(); //私有 构造方法
private SingleDemo(){ }
//提供公有的访问
public static SingleDemo getNewIntance(){
return singleDemo;
} public static void main(String[] args) {
SingleDemo s1=SingleDemo.getNewIntance();
SingleDemo s2=SingleDemo.getNewIntance();
System.out.println(s1==s2); } }
 

结果:true

5.2、懒汉式


package com.day06;
/**
* 饿汉式
* @author denny
*
*/
public class SingleDemo2 {
private String name;
private int age;
private static SingleDemo2 singleDemo2; //私有 构造方法
private SingleDemo2(){ }
//提供公有的访问
public static SingleDemo2 getNewIntance(){
if(singleDemo2==null){
singleDemo2=new SingleDemo2();
}
return singleDemo2;
} public static void main(String[] args) {
SingleDemo2 s1=SingleDemo2.getNewIntance();
SingleDemo2 s2=SingleDemo2.getNewIntance();
System.out.println(s1==s2); } }

结果:true

基础学习day06---面向对象二---static,类的初始化和调用顺序、单例模式的更多相关文章

  1. jvm的学习笔记:二、类的初始化,代码实战(3)

    首次主动此用导致类的初始化 MyParent4 myParent4 = new MyParent4(); MyParent4 myParent5 = new MyParent4(); 输出: MyPa ...

  2. jvm的学习笔记:二、类的初始化,代码实战(1)

    对于静态字段来说,直接定义该字段的类才会被初始化 System.out.println(MyChild1.str); 输出: myParent1 static block hello myParent ...

  3. jvm的学习笔记:二、类的初始化,代码实战(2)

    常量在编译阶段,会存在调用这个常量的方法的所在的类的常量池当中 System.out.println(MyParent2.str); 输出: hello parent2 依据:在MyTest2类调用M ...

  4. jvm的学习笔记:二、类的初始化,代码实战(4)

    当接口被初始化的时候,不要求其父类被初始化 System.out.println(MyChild5.c); 输出: MyChild5 1 依据:new Random().nextInt(3)并非编译区 ...

  5. 078 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 03 创建类

    078 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 03 创建类 本文知识点:创建类 说明:因为时间紧张,本人写博客过程中只是对知识点的关 ...

  6. Java学习笔记11---静态成员变量、静态代码块、成员变量及构造方法的初始化或调用顺序

    当创建一个对象时,各种成员变量及构造方法的初始化或调用顺序是怎样的呢? (1).如果类尚未加载,则先初始化静态成员变量和静态代码块,再初始化成员变量,最后调用相应的构造方法: (2).如果类已经加载过 ...

  7. Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API

    不同修饰符使用细节 常用来修饰类.方法.变量的修饰符 public 权限修饰符,公共访问, 类,方法,成员变量 protected 权限修饰符,受保护访问, 方法,成员变量 默认什么也不写 也是一种权 ...

  8. Java基础学习(三)—面向对象(上)

    一.理解面向对象       面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是 ...

  9. java基础学习05(面向对象基础01)

    面向对象基础01 1.理解面向对象的概念 2.掌握类与对象的概念3.掌握类的封装性4.掌握类构造方法的使用 实现的目标 1.类与对象的关系.定义.使用 2.对象的创建格式,可以创建多个对象3.对象的内 ...

随机推荐

  1. MySQL慢日志监控脚本实例剖析

    公司线上的 MySQL 慢日志,之前一直没有做好监控.趁着上周空闲,我就把监控脚本写了下,今天特地把代码发出来与51博友分享一下. 针对脚本的注解和整体构思,我会放到脚本之后为大家详解. 1 2 3 ...

  2. Android 布局之LinearLayout

    Android 布局之LinearLayout 1 LinearLayout简介 LinearLayout是线程布局.它包括2个方向(android:orientation):“水平”(horizon ...

  3. django 快速实现完整登录系统(cookie)

    经过前面几节的练习,我们已经熟悉了django 的套路,这里来实现一个比较完整的登陆系统,其中包括注册.登陆.以及cookie的使用. 本操作的环境: =================== deep ...

  4. 前端比较好的学习资料(包括js和css)以及 最全前端资源汇集

    js详细资料: http://javascript.ruanyifeng.com/ 『引』最全前端资源汇集: 来源:http://www.jeffjade.com/2016/03/30/104-fro ...

  5. 仿照微信的效果,实现了一个支持多选、选原图和视频的图片选择器,适配了iOS6-9系统,3行代码即可集成.

    提示:如果你发现了Bug,请尝试更新到最新版.目前最新版是1.6.4,此前的版本或多或少存在一些bug的~如果你已经是最新版了,请留一条评论,我看到了会尽快处理和修复哈~ 关于升级iOS10和Xcdo ...

  6. 看看如何面试前端工程师:Github很重要

    从程序员的角度提出要去学习哪些知识,下面这篇文章从面试官的角度介绍到面试时可能会问到的一些问题.不过我想先给你们一个忠告,招聘是一件非常艰巨的任务,在45分钟内指出一名侯选人是否合适是你需要完成的任务 ...

  7. sprint演示Scrum 项目7.0

    1.坚持所有的sprint都结束于演示. 团队的成果得到认可,会感觉很好. 其他人可以了解你的团队在做些什么,并得到重要反馈. 演示是一种社会活动,不同的团队可以在这里相互交流,讨论各自的工作.这很有 ...

  8. P6 EPPM Installation and Configuration Guide 16 R1 April 2016

    P6 EPPM Installation and Configuration Guide 16 R1         April 2016 Contents About Installing and ...

  9. visual studio 局域网远程调试web项目

    1.进入项目根目录,找到.vs/config/applicationhost.config文件(可能是隐藏的) 2.搜索sites节点,找到当前项目,并添加一个binding配置节,将ip地址设置为本 ...

  10. 基于Lumisoft.NET组件的SMTP账号登陆检测

    在邮件处理的方面,Lumisoft.NET可以说是非常不错的一个选择,我在前面几篇文章中都介绍过这个组件. 基于Lumisoft.NET组件开发碰到乱码等一些问题的解决 基于Lumisoft.NET组 ...