2022-07-27 day16第一小组 王鸣赫
类的内部结构
属性、方法、构造器、代码块、内部类

代码块
代码块又可以称为初始化块,属于类的一个成员,它是将逻辑语句封装在方法体中。
通过{ }包裹。代码块没有方法名,没有参数,没有返回值,只有方法体。
它是不需要通过对象或类进行显式的调用,会在类加载或者创建对象时,主动地(隐式)调用。
(1)静态代码块
staric{}
一个类被加载时会被调用一次,做一些初始化的工作
(2)实例代码块
{}
每次创建势力都会被调用一次,用的很少(创建对象就调用一次)
·可以有多个静态块,但是开发中一般就写一个静态块
父类优于子类,静态块优于其他
(1)父类输出顺序:静态块 > 实例块 > 构造器
(2)子类输出顺序(父类有静态块、实例块和构造器,子类也有静态块、实例块和构造器)。
当没有继承关系时,就一个类,静态块——实例块——构造器
当有继承关系时,父类静态块——子类静态块——父类实例块——父类构造器——子类实例块——子类构造器
static静态(类属性,类方法)
可以修饰属性、方法、代码块
用static修饰的结构,不属于任何一个对象

static内存解析
1.静态的变量或者静态方法存在于方法区,静态的结构不会被垃圾回收
2.不属于某一个实例对象,只存在于方法区。调用静态结构,直接用类名.的方式。
面向对象的设计原则
1.开闭原则(Open Close Principle)
对扩展开放,对修改关闭(继承,实现接口)
我们可以通过“抽象约束,封装变化”来实现开闭原则
通过接口或者抽象类为软件定义一个相对稳定的抽象层
将相同的可变因素封装在相同的具体实现类中
2.里氏代换原则
子类继承父类时,除了添加新的方法完成新增的功能外,尽量不要重写
3.依赖倒转原则
要面向接口编程,不要面向实现(类)编程
a.每个类尽量提供接口或抽象类,或者两者兼备
b.变量的类型声明尽量是接口或者是抽象类
c.任何类都不应该从具体类派生
d.在使用继承时,要遵循里氏代换原则
4.接口隔离原则
使用多个隔离的接口
5.迪米特法则
6.合成复用原则
7.单一原则:一个类只做一件事
单例模式
单例模式指的是在应用整个生命周期内只能存在一个实例。单例模式是一种被广泛使用的设计模式。他有很多好处,能够避免实例对象的重复创建,减少创建实例的系统开销,节省内存。
静态和单例的区别
首先理解一下什么是静态类,静态类就是一个类里面都是静态方法和静态field,构造器被private修饰,因此不能被实例化。Math类就是一个静态类。
知道了什么是静态类后,来说一下他们两者之间的区别:
1)首先单例模式会提供给你一个全局唯一的对象,静态类只是提供给你很多静态方法,这些方法不用创建对象,通过类就可以直接调用;
2)如果是一个非常重的对象,单例模式可以懒加载,静态类就无法做到;那么时候时候应该用静态类,什么时候应该用单例模式呢?首先如果你只是想使用一些工具方法,那么最好用静态类,静态类比单例类更快,因为静态的绑定是在编译期进行的。如果你要维护状态信息,或者访问资源时,应该选用单例模式。还可以这样说,当你需要面向对象的能力时(比如继承、多态)时,选用单例类,当你仅仅是提供一些方法时选用静态类。
如何实现单例模式
饿汉模式
所谓饿汉模式就是立即加载,一般情况下再调用getInstancef方法之前就已经产生了实例,也就是在类加载的时候已经产生了。这种模式的缺点很明显,就是占用资源,当单例类很大的时候,其实我们是想使用的时候再产生实例。因此这种方式适合占用资源少,在初始化的时候就会被用到的类。
点击查看代码
public class Hungry{
private Hungry(){}
// 类加载的时候就实例化,并且创建单例对象
private static final Hungry hungry=new Hungry();
public static Hungry getInstance(){
return hungry;
}
}
懒汉模式
懒汉模式就是延迟加载,也叫懒加载。在程序需要用到的时候再创建实例,这样保证了内存不会被浪费。
点击查看代码
public class Singleton {
private static Singleton single=null;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return single;
}
}
区别
单例中懒汉和饿汉的本质区别在于以下几点:
①饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变。懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的。
②从实现方式来讲他们最大的区别就是懒汉式是延时加载,他是在需要的时候才创建对象,而饿汉式在虚拟机启动的时候就会创建,饿汉式无需关注多线程问题、写法简单明了、能用则用。但是它是加载类时创建实例(上面有个朋友写错了)、所以如果是一个工厂模式、缓存了很多实例、那么就得考虑效率问题,因为这个类一加载则把所有实例不管用不用一块创建。
箭头函数
箭头函数表达式的语法比函数表达式更简洁,并且没有自己的this,arguments,super或new.target。箭头函数表达式更适用于那些本来需要匿名函数的地方,并且它不能用作构造函数。
点击查看代码
const materials = [
'Hydrogen',
'Helium',
'Lithium',
'Beryllium'
];
console.log(materials.map(material => material.length));
// expected output: Array [8, 6, 7, 9]
(param1, param2, …, paramN) => { statements } (param1, param2, …, paramN) => expression //相当于:(param1, param2, …, paramN) =>{ return expression; }
// 当只有一个参数时,圆括号是可选的: (singleParam) => { statements } singleParam => { statements }
// 没有参数的函数应该写成一对圆括号。 () => { statements }
懒汉式和饿汉式只是了解还需加强学习,箭头函数一头雾水以后在了解

浙公网安备 33010602011771号