针对多个对象用于共同的成员变量的时候
Java提供了一个关键字:static
static一般使用的场景:
一般使用在工具类型的方法中(工具类),不依赖于任何对象的属性就可以完成功能的操作。
static的注意事项:
a.在静态方法当中不能出现this关键字
如何理解:
静态方法是随着类的加载而加载,this关键字是随着对象的创建而存在
静态是优先于对象的存在
b.静态方法只能方法静态方法和静态的成员变量
静态方法:
成员变量:只能方法静态的成员变量
成员方法:只能访问静态的成员方法
非静态方法:
成员变量:可以是静态的,也可以不是静态的
成员方法:可以是静态的,也可以不是静态的
一句话:静态只能访问静态,非静态 爱咋咋地。
static的特点:
1.可以修饰成员变量和成员方法
2.随着类的加载而加载
3.优于对象的存在
4.可以被类的所有对象共享
5.可以通过类名直接访问
其实本身同样可以实现对象名进行调用
一般推荐使用类名进行调用(以后凡是看到某一东西,直接用类名点出来 肯定是被static修饰了)
软件设计行业经典设计模式之:单例设计模式
什么是单例模式?
单例模式也属于创建型模式,所以也是用于创建对象的,顾名思义,“例”是“实例”的意思,“单”是“单独、唯一”的意思,所以单例模式就是指使类在内存中只能有一个对象的模式。
饿汉式(类一加载就创建对象)和懒汉式(什么时候用什么时候创建)
23种设计模式:
1.单例设计
2.模板设计
3.代理设计
4.工厂设计
5.生产者与消费者设计
6.观察者设计
单例设计模式的优势:
1.可以保证一个类只能被创建一次
2.可以保证该类对象在内层中只存在一个地址
3.可以保证,该对象必须是在确实需要使用的时候再去创建,使用完毕 JVM优先回收
优势有什么用?
1.节省内存?
2.便于管理对象
3.是不是可以保证某些业务是唯一(打印机、生成唯一序号)
单例设计模式之饿汉设计模式:
1.私有构造方法(保证外界不能创建对象)
2.声明本类的引用类型变量,并且创建对象(保证对象自己创建自己)
3.提供一个静态方法,保证外界可以不同过对象来进行调用(必须是公共)
//饿汉设计模式
public class Single {
//私有化构造
private Single(){}
//创建本类对象
private static Single single = new Single();
//提供一个公共的方法方式
public static Single getInstance() {
return single;
}
}
单例设计模式之懒汉设计模式:
1.私有构造方法(保证外界不能创建对象)
2.声明本类的引用类型变量,但是先不创建对象
3.提供一个静态方法,保证外界可以不同过对象来进行调用,但是必须是调用方法的时候 才去创建对象
//懒汉单例设计模式
class Single02{
//私有化构造
private Single02(){}
//创建本类对象
private static Single02 single;
public static Single02 getInstance() {
if(single == null) {
single = new Single02();
}
return single;
}
}
代码块:在Java当中,被{}括起来的就被称之为代码块
根据其位置的不同,写法的不同,代码块可以分为:
局部代码块:存在于局部变量,用于限定变量的声明周期
构造代码块:在类中的成员位置,每次调用构造方法前,都会执行构造代码块
作用:可以将多个构造方法相同的属性进行归集,同样可以对多个数据进行初始化
静态代码块:在类中成员的位置,用{}括起来,只不过用static进行了修饰
面试题:
请问,在Java当中,代码块的执行顺序如何?
静态代码块 --> 构造代码块 -->构造方法 --> 局部代码块
静态代码块:因为存在静态的共享区所以只有一个地址,只执行一次
构造代码块:每一次调用都会执行
构造方法:每一次调用都会执行
继承概述:
把多个类中相同的内容给提出出来到一个独立的类当中
如何实现?
Java提供了一个关键字:extends
格式:
class 子类名 extends 父类名{}
好处:
a.提高了代码的复用性
b.提供了代码的可维护性
c.让类于类之间产生了联系,同时也是多态的前提
类与类之间产生了联系,其实也是继承的弊端:
开发原则:高内聚、低耦合。
内聚:自己能够独立完成功能的能力
耦合:类与类之间的联系
继承增强了类于类之间的联系
继承需要注意的事项:
a.Java只支持单根继承,不支持多根继承
b.Java支持多层继承
c.子类只能继承父类的非私有方法和变量(成员)
d.子类不能够继承父类的构造方法,但是因为需要继承父类 所以需要先将父类的数据进行初始化,所以是父类自己执行了构造
e.不要为了部分功能而去使用继承
我们应该在什么时候去使用继承?
继承的体现关系应该是一个"is a"的关系
采用假设法
如果有两个类A B,只要他们符合A是B一种或者B是A的一种,那么就使用继承
类的组成:
成员变量:
成员方法:
构造方法:
我们现在讲到了继承,所以我们需要了解类的组成的各自的关系
继承中成员变量的关系:
a.子类中出现了和父类中名字不一样的成员变量,怎么办?自己玩自己的
b.子类当中出现和父类成员变量或者成员方法名一致的时候,怎么办?
查找顺序:
a.先在子类的局部范围去查找,有就使用
b.再去子类的成员位置去查找,有就使用
c.再去父类的成员位置去查找,有就使用
d.如果还找不到,那就是真的找不到了 报错
问题是:
我不仅仅只想要输出局部位置的num,我还要输出成员位置num,怎么办?
我还想要输出父类的num,怎么办?
如果有一个东西跟this很相似,this是访问的本对象的
有个东西如果能够访问其父类的,那么是不是就可以解决这个问题?
恭喜,这个关键字叫做:super
this和super的区别?
分别是什么?
this代表本类对象的应引用
super代表父类存储空间的标识引用(可以理解为父类的引用,可以操作父类的成员方法)
怎么用呢?
a.调用成员变量:
this.成员变量 调用本类的成员变量
super.成员变量 调用父类的成员变量
b.调用构造方法
this();
super();
c.调用成员方法
this.成员方法()
super.成员方法()
子类继承父类,在内存当中的走向
1.加载所以的class进入内存
2.加载main方法
3.因为main里面有创建对象(如果这个对象有父类,则先加载父类内存结构)
4.父类数据加载完毕,创建子类对象
5.如果有使用super,那么就通过super关键字去查找父类地址
继承当中构造方法的关系:
a.子类当中的所有的构造方法都会默认的访问父类的无参构造
b.为什么?
因为子类继承了父类,很有可能需要使用到父类的初始化数据,所以在子类初始化完成之前,必须向初始化父类
注意:子类当中的任何的构造方法,默认第一句都是super(); 必须在第一句
假如父类没有提供无参构造,那么子类应该会出现什么样的问题?
子类出现异常
如何解决?
a.给父类加一个无参
b.可以显示的去调用父类的带参构造
注意事项:
super()和this()都必须写在第一句
如果不是第一句,会报错 很有可能对父类数据进行多次初始化,JVM不允许
方法重写:子类当中出现了和父类方法声明一样的时候
方法重载:
本类当中的方法名一样,参数列表不同,与返回值无关
子类调用方法的步骤:
先找子类再去找父类
方法重写的应用:
当子类需要使用父类的功能,但是父类的功能又不能满足需求的时候,你就可以重写父类的方法
如果你仍然想保留父类的部分功能,就在你的新功能产生之前是使用super关键字先调用父类的方法