static、代码块、继承以及内存走向

针对多个对象用于共同的成员变量的时候

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关键字先调用父类的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值