【幻化万千戏红尘】qianfengDay07-java基础学习:static、设计模式之单例模式

时间:2021-07-16 10:30:15

课程回顾:

 

面向对象:是一种思想

类:方法和属性,抽象的、模板、概念上的定义

对象:类的实例化,实实在在的具体的实例

this

1、代表本类对象

2、可以调用构造方法

 

属性的封装

1、私有的属性

2、并且提供公有的getset方法

 

 

 

今日内容:

方法的参数传递

1、基本数据类型:传递的是数据的本身

2、引用数据类型:传递的是对象的地址

 

总而言之:参数传递的是栈内存中记录的内容

只是基本数据类型栈内存记录的数据的本身

而引用类型栈内存中记录的是对象的地址

 

构造代码块(空代码块)

格式:{代码块}

构造代码块的执行会根据创建对象的时候执行

而且先于构造方法执行

 

 

static:关键字 静态

1、修饰属性:静态属性

可以通过类名.属性名直接使用

注意:静态属性为类属性,所有对象共享

类被加载的时候,被初始化

2、修饰方法:静态方法

可以通过类名.方法名直接调用

注意:可以直接使用静态属性,不能直接使用非静态属性

 

在静态方法中不能直接使用非静态的属性和方法

但是在非静态方法中,可以使用静态的属性和方法

 

3、修饰代码块:静态代码块

常常被用来初始化静态属性

格式:static{代码块}

类被加载的时候执行,只执行一次

 

对象第一次创建时:

先执行静态代码块

再执行构造代码块

最后执行构造方法

 

4、修饰内部类

 

 

类中可以出现的:

1、属性[0,n]

2、静态属性[0,n]

3、方法[0,n]

4、静态方法[0,n]

5、构造方法[0,n]

6、构造代码块[0,n]

7、静态代码块[0,n]

8、成员内部类[0,n]

9、静态内部类[0,n]

10、内部接口[0,n]

 

package com.qianfeng.demo2;

 

public class TestMain01 {

 

public static void main(String[] args) {

// TODO Auto-generated method stub

Animal animal=new Animal();

animal.price=10;

animal.type="";

//静态属性,可以通过类名.属性名直接使用

Animal.type="";

System.out.println("类型:"+animal.type+",价格:"+animal.price);

Animal animal2=new Animal();

System.out.println("类型:"+animal2.type+",价格:"+animal2.price);

}

 

}

package com.qianfeng.demo2;

 

public class Animal {

 

//1static修饰属性,类属性,所有对象共享

public static String type;//类型

public int price;//价格

//构造代码块

{

System.out.println("我是构造代码块");

}

public static void show() {

type="";//静态属性可以直接被使用在静态方法中

// new Animal().price=12;

}

public void test() {

type="";//在非静态方法中,我们可以直接使用静态属性

show();

}

}

 

 

思考:如何保证一个类的唯一实例

设计模式之单例模式:

保证类的唯一实例

规则:

1、私有的构造方法

2、私有的静态本类对象

3、公有的静态方法

单例模式的实现方式:

1、懒汉式:不安全(线程不同步)

在声明本类的对象的时候没有实例化

2、饿汉式:安全

在声明本类对象的时候就完成实例化

 

 

练习:请自己动手体会static关键字的用法

 

 

 

包:就是存放java源文件的文件夹

包的作用:

1、避免类名冲突

2、隐藏类

3、通过合适的包名表达不同的意思

 

包名要求不能有大写,多级关系使用.连接

包名中的.其实就是相当于一层目录

 

package:声明包,必须出现在源文件的第一行

格式:package 包名;

说明对应的类属于当前声明的包

使用命令进行编译带包的源文件:

编译:javac -d . 文件名.java

执行:java 包名.类名

 

import:导入包,必须出现在类声明的上方

 

JDK5.0之后,支持静态导包

格式:import static 包名.类名.方法名/属性名

只能导入静态方法或静态属性

 

由于java.lang包,日常开发使用最为频繁,所有官方默认导入该包

 

 

思考:一个类怎么拥有另一类的信息?

1、聚合关系

就是将另一个类的对象作为本类的一个属性

2、继承

父类:超类---被继承的类

子类:基类、派生类---实现继承的类

子类可以拥有父类的部分(全部)属性和方法

构造方法不能被继承

java只能单继承,也就是说:一个类只能继承一个类

但是java允许继承的传递性

 

extends:实现继承关系

格式:[修饰符] class子类名称extends父类名称

{

属性

方法

}

一个父类可以有多个子类,但是一个子类只能拥有一个父类

 

练习:自己创建有继承关系的类并体会继承的作用

 

 

package com.qianfeng.demo5;

 

public class Father {

 

public String name;//名字

public int age;//年龄

private int money;

public void showInfo() {

System.out.println("名字:"+name+",今年:"+age+"");

}

}

package com.qianfeng.demo5;

 

//继承Father

public class Son extends Father{

 

public String like;//爱好

}

package com.qianfeng.demo5;

 

public class TestMain01 {

 

public static void main(String[] args) {

//创建子类对象

Son son=new Son();

son.name="儿子";

son.age=12;

son.like="LOL";

//son.money=120;//子类只能拥有父类非私有的属性和方法

son.showInfo();

//创建父类对象

Father father=new Father();

father.name="";

father.age=32;

//father.like="学习";//父类不能拥有子类新增的属性或方法

//

Grill grill=new Grill();

grill.age=18;

grill.showInfo();

}

 

}

 

 

父类中:

静态代码块

构造代码块

构造方法

 

子类中:

静态代码块

构造代码块

构造方法

 

在第一次创建子类对象的时候,执行过程:

父类静态代码块

子类静态代码块

父类构造代码块

父类构造方法

子类构造代码块

子类构造方法

 

类加载的条件:

1、第一次调用静态属性

2、第一次调用静态方法

3、第一次创建类的对象

 

super:关键字 应用在子类中

用法:

1、调用父类中的属性或方法

2、调用父类中的构造方法

要求:必须在子类的构造方法中,而且只能是第一行

super不能出现在static方法中

 

thissuper的区别?

this:

用在本类中

可以指代本类对象

可以调用属性和方法

可以调用自己的构造方法

super:

用在子类中

调用父类中的属性和方法

可以调用父类的构造方法

 

thissuper都不能出现在static方法中

 

 

 

明天内容:

访问修饰符

重写

Object

抽象类

递归

 

设计模式之单例模式:

懒汉式、饿汉式

 

思考:如何保证一个类的唯一实例

设计模式之单例模式:

保证类的唯一实例

规则:

1、私有的构造方法

2、私有的静态本类对象

3、公有的静态方法

单例模式的实现方式:

1、懒汉式:不安全(线程不同步)

在声明本类的对象的时候没有实例化

2、饿汉式:安全

在声明本类对象的时候就完成实例化