文章目录

  • Demo08-static、单例、代码块、继承
    • 1.static
      • 1.1static静态关键字
        • 1.1.1static修饰成员变量
        • 1.1.2static修饰成员方法
        • 1.1.3static访问注意事项:
      • 1.2static应用知识
        • 1.2.1工具类
        • 1.2.2代码块
        • 1.2.3单例设计模式
    • 2.继承
      • 2.1认识继承
      • 2.2继承的特点
      • 2.3访问特点
      • 2.4方法重写
      • 2.5子类构造器
        • 2.5.1子类的无参构造器
        • 2.5.2子类的有参构造器
      • 2.6this和super总结

Demo08-static、单例、代码块、继承

1.static

1.1static静态关键字

static是什么:

  • static是静态的意思,可以修饰成员变量和成员方法
  • static修饰成员变量表示该成员变量只在内存中存储一份,可以被共享访问、修改

1.1.1static修饰成员变量

成员变量可以分为2类:

  • 静态成员变量(有static修饰,属于类而不再属于具体的对象,在内存中加载一次),访问方式:类名.静态成员变量(推荐.如果是在该类中访问自己类的静态成员变量,可以省略类名.) 对象名.静态成员变量(不推荐.访问流程:根据对象名找到对象,再根据对象找到静态成员变量)
  • 实例成员变量(无static修饰,归属于对象),访问方式:对象名.实例成员变量

静态成员变量的内存机制:

静态成员变量会随着类的加载在内存中加载一次,加载完成后会在堆内存中开辟一块区域存放该类的静态变量,然后将加载后的静态成员变量放到开辟的这块区域中

1.1.2static修饰成员方法

成员方法可以分为2类:

  • 静态成员方法(有static修饰,属于类而不再属于具体的对象),可以用类名访问也可以用对象访问,建议用类名访问(如果是在该类中访问自己类的静态成员变量,可以省略类名.)
  • 实例成员方法(无static修饰,归属于对象),只能用对象访问

表示对象自己的行为,且方法中需要访问实例成员的,则该方法必须申明成实例方法

如果该方法是以执行一个共用功能为目的,则可以申明成静态方法

静态成员方法的内存机制及运行原理:

1.类加载时会将静态成员方法(如main和getMax)加载到方法区

2.将方法区的main方法提到栈内存运行

3.main方法运行过程中遇到了一行代码是调用getMax方法,那么就将方法区的getMax方法提到栈内存运行

实例成员方法的内存机制及运行原理:

1.类加载时会将静态成员方法(如main和getMax)加载到方法区

2.将方法区的main方法提到栈内存运行

3.main方法运行过程中遇到了一行代码是创建Student对象的,那么就会在堆内存创建该对象,同时将该对象的实例方法study加载到方法区,并且堆内存中的该对象有方法引用指向方法区的实例方法和静态方法.最后将地址赋值给栈内存中的变量student

4.继续运行main方法遇到了一行代码student.study(),此时根据地址找到堆内存的对象,再根据该对象中的方法引用找到方法区的方法study并将其提到栈内存运行,运行完成后将方法study退出栈内存

5.继续运行main方法遇到了一行代码student.getMax(),这里不能像使用类名调用静态方法那样(直接在方法区找到该方法然后提到栈内存运行)而是应该像调用实例方法那样,先根据地址找到对象,再根据对象的方法引用找到方法区的该方法

1.1.3static访问注意事项:

  • 静态方法只能访问静态成员(成员变量和成员方法),不可以直接访问实例成员(成员变量和成员方法)可以间接访问:在静态方法中new一个对象然后通过对象访问该对象的实例成员
  • 实例方法可以访问静态成员(成员变量和成员方法),也可以访问实例成员(成员变量和成员方法)
  • 静态方法中不可以出现this关键字,因为this代表的是当前对象,而静态方法并不是使用对象调用的,而是使用类名调用的

1.2static应用知识

1.2.1工具类

工具类中都是一些静态方法,每个方法都是以完成一个共用的功能为目的,这个类用来给系统开发人员共同使用的

为什么工具类中的方法不用实例方法做:

  • 实例方法需要创建对象调用
  • 此时用对象只是为了调用方法,这样只会浪费内存

工具类定义时的要求: 由于工具类里面都是静态方法,直接用类名即可访问,因此工具类无需创建对象,建议将工具类的构造器进行私有,这样显得很专业,嘿嘿~~~

1.2.2代码块

代码块概述

  • 代码块是类的五大成分之一(成员变量,构造器,方法,代码块,内部类),定义在类中方法外
  • 在java类下,使用{}括起来的代码被称为代码块

代码块分为

  • 静态代码块

    • 格式: static{}
    • 特点: 需要通过关键字static修饰,随着类的加载而加载,并且自动触发,只执行一次
    • 使用场景: 在类加载的时候做一些静态数据初始化的操作,以便后续使用
  • 构造代码块(了解,几乎不用)
    • 格式: {}
    • 特点: 每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在构造器执行前执行
    • 使用场景: 初始化实例资源

1.2.3单例设计模式

设计模式:

1.什么是设计模式:开发中经常遇到一些问题,一个问题通常有n种解法的,但其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式

2.设计模式有20多种,对应20多种软件开发中会遇到的问题

3.学设计模式主要是学2点:

  • 第一:这种模式用来解决什么问题
  • 第二:遇到这种问题了,该模式是怎么写的,他是如何解决这个问题的


单例设计模式:

  • 可以保证系统中,应用该模式的这个类永远只有一个实例,即一个类永远只能创建一个对象
  • 例如任务管理器对象我们只需要一个就可以解决问题了,这样可以节省内存空间

单例的实现方式很多:恶汉单例模式,懒汉单例模式…



饿汉单例设计模式:

  • 在用类获取对象时,对象已经提前为你创建好了

设计步骤:

1.定义一个类,把构造器私有

2.定义一个静态变量并存储一个对象

public class SingleInstance {public static SingleInstance instance = new SingleInstance();private SingleInstance(){}
}public class Test1 {public static void main(String[] args) {SingleInstance s1 = SingleInstance.instance;SingleInstance s2 = SingleInstance.instance;System.out.println(s1 == s2);//true}
}

懒汉单例设计模式

  • 在真正需要该对象的时候,才去创建一个对象(延迟加载对象)

设计步骤:

1.定义一个类,把构造器私有

2.定义一个静态变量用来存储一个对象,但此时为null

3.提供一个返回单例对象的方法

public class SingleInstance2 {//注意懒汉单例设计模式要把instance私有化,不能暴露给外部private static SingleInstance2 instance;public static SingleInstance2 getInstance() {if(instance == null){// 第一次来拿对象 :此时需要创建对象instance = new SingleInstance2();}return instance;}private SingleInstance2(){}
}public class Test2 {public static void main(String[] args) {SingleInstance2 s1 = SingleInstance2.getInstance();SingleInstance2 s2 = SingleInstance2.getInstance();System.out.println(s1 == s2);}
}

2.继承

2.1认识继承

什么是继承:

  • 继承就是java允许我们用extends关键字,让一个类和另一个类建立起一种父子关系

继承的好处:

  • 提高代码复用性,减少代码冗余,增强类的功能扩展性

继承的格式:

  • 子类 extends 父类

继承后子类的特点:

  • 子类继承父类,子类可以得到父类的属性和行为,子类可以使用
  • java中子类更强大

继承设计规范:

  • 子类们相同特征(共性属性,共性方法)放在父类中定义,子类独有的属性和行为应该定义在子类自己里面(如果子类的独有属性,行为定义在父类中,会导致其他子类也会得到这些属性和行为,这不符合面向对象逻辑)

继承的内存机制:

  • new Student()时会在堆内存中创建对象,该对象有两个空间,一个是父类空间,一个是子类空间

2.2继承的特点

  • 子类可以继承父类的属性和行为,但是子类不能继承父类的构造器
  • 子类可以继承父类私有成员,只是不能直接访问
  • 子类不可以继承父类的静态成员,但是子类可以直接使用父类的静态成员
  • java是单继承模式,一个类只能继承一个直接父类
  • java不支持多继承,但是支持多层继承
  • java中所有的类都是Object类的子类

1.java不支持多继承是因为如果继承的多个父类有相同的方法,应该调用哪个呢,这就引起了语法冲突

2.为什么子类不可以继承父类的静态成员,但是子类可以直接使用父类的静态成员:老师认为这是一种共享方式并非继承,Student继承了People那么就理所当然可以用子类.静态成员变量或子类.静态成员方法调用父类的静态成员,如果说子类可以继承父类的静态成员,那么子类对象就应该能从父类得到静态成员,但因为静态成员在内存中只有一份,所以子类创建的对象并没有真的从父类得到静态成员,所以这种方式只能算是共享而不能算是继承

java中的所有类,要么直接继承Object,要么默认继承Object,要么间接继承Object,Object是祖宗类

2.3访问特点

1.在子类方法中访问成员变量:就近原则,先找方法内部有没有该局部变量,没有的话找子类里面有没有,没有的话找父类里面有没有,如果父类也没有就报错

2.在子类方法中访问成员方法:就近原则,先找子类里面有没有,没有的话找父类里面有没有,如果父类也没有就报错

3.如果子父类中出现了重名的成员(成员变量,成员方法),此时如果一定要在子类中使用父类的成员:super.父类成员变量/父类成员方法

题外话:如果一个类中有变量public String name = “1”,并且该类中的方法study()中有局部变量String name = “2”(注意这里的String,我一直以为如果类中有该变量,那么方法内部就不能再声明了,而是应该更改,也就是只能name = “2”,这是错误的),在该方法内默认是调用局部变量name,如果想要调用类中的变量name,那么应该this.name

public class Test {public static void main(String[] args) {Dog d = new Dog();d.run(); // 子类有,就用子类的d.lookDoor(); // 子类有,就用子类的d.showName(); // 子类有,就用子类的}
}class Animal{public String name = "动物名";public void run(){System.out.println("动物可以跑~~");}
}class Dog extends Animal{public String name = "狗名";public void lookDoor(){System.out.println("狗可以看门~~");}public void showName(){String name = "局部名";System.out.println(name);//局部的nameSystem.out.println(this.name); // 当前子类对象的nameSystem.out.println(super.name); // 找父类的namesuper.run(); // 找父类的方法run(); // 子类的runthis.run(); // 子类的run}public void run(){System.out.println("狗跑的贼快~~~");}
}

2.4方法重写

@Override重写注解

  • 修饰方法,表明这是一个重写方法,作为重写是否正确的校验注解,**如果方法有@Override修饰并且不报错,表明重写正确.**如果方法的返回值或方法名或参数列表不同,那么在编译阶段就会出现错误提示,代码更安全
  • 别人读我写的代码一眼就看出来这是个重写方法,是不是更优雅了呢~~~

方法重写的注意事项:

  • 重写方法的返回值,方法名,参数列表必须和被重写方法的一致
  • 私有方法不能被重写
  • 子类重写父类方法时,访问的权限必须大于或者等于父类(实际开发中建议等于)
  • 子类不能重写父类的静态方法,因为重写方法的前提是该方法能够过继到子类对象,而静态方法不能过继到子类对象
public class Test {public static void main(String[] args) {NewPhone hw = new NewPhone();hw.call();}
}class Phone{public void call(){System.out.println("打电话~");}
}class NewPhone extends Phone{@Overridepublic void call(){super.call(); // 先用它爸爸的基本功能System.out.println("开始视频通话~~");}}

2.5子类构造器

2.5.1子类的无参构造器

子类中所有的构造器默认都会先访问父类中无参构造器,再执行自己

为什么要这样呢:因为子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据

怎么调用父类构造起的呢:子类构造器的第一行语句默认都是:super(),不写也存在

2.5.2子类的有参构造器

我们通常会在子类的有参构造器中手动super(…)调用父类的有参构造器以便初始化继承自父类的数据,一定要手动写上super(…)否则子类的有参构造器就会自动调用父类的无参构造器,就无法实现初始化了

如果父类只有有参构造器而没有无参构造器,那么就需要在子类的所有构造器中手动调用父类的有参构造器,否则就会报错,因为子类构造器默认是调动父类无参构造器的.所以建议父类一定要写上无参构造器

public class Test {public static void main(String[] args) {Teacher t = new Teacher("mxy");System.out.println(t.getName());}
}class People {private String name;public People(){}public People(String name) {this.name = name;}public String getName() {return name;}
}class Teacher extends People{public Teacher(){}public Teacher(String name){super(name);}
}

2.6this和super总结

this代表本类对象的引用,super代表父类存储空间的标识

关键字 访问成员变量 访问成员方法 访问构造方法
this this.成员变量
访问本类成员变量
在子类的方法中使用
this.成员方法(…)
访问本类成员方法
在子类的方法中使用
this(…)
访问本类其他构造器
在构造器中使用
super super.成员变量
访问父类成员变量
在子类的方法中使用
super.成员方法(…)
访问父类成员方法
在子类的方法中使用
super(…)
访问父类构造器
在子类的构造器中使用

以前没遇见过this(…)访问本类其他构造器,下面用一个实例理解一下

public class Test {public static void main(String[] args) {Student s2 = new Student("mxy");System.out.println(s2.getName());System.out.println(s2.getSchoolName());}
}class Student {private String name;private String schoolName;public Student() {}public Student(String name) {// 借用本类兄弟构造器this(name, "中国大学~");}public Student(String name, String schoolName) {// 这里有默认的super();先初始化父类,再初始化自己。this.name = name;this.schoolName = schoolName;}public String getName() {return name;}public String getSchoolName() {return schoolName;}
}

this(…)和super(…)使用注意点:

  • this(…)和super(…)都只能放在构造器的第一行

  • 因为this(…)和super(…)都只能放在构造器的第一行,所以两者不能共存在同一个构造器中

  • 子类通过this(…)去调用本类的其他构造器,本类其他构造器会通过super去调用父类的构造器,所以最终还是会调用父类构造器的

25天掌握java基础(八)——static、单例、代码块、继承相关推荐

  1. Java基础篇:四种代码块详解

    所谓代码块,就是用大括号{}将多行代码封装在一起,形成一个独立的数据体,用于实现特定的算法.一般来说,代码块是不能单独运行的,它必须有运行主体.在Java中代码块主要分为四种:普通代码块.静态代码块. ...

  2. Java 基础之 static 静态

    static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static ...

  3. 笔记整理3----Java语言高级(三)11 综合练习+12 面向对象-static变量 与 代码块+13 面向对象-继承与抽象类+14 面向对象-接口与多态+15 面向对象-包修饰符

    11 综合练习+12 面向对象-static变量 与 代码块+13 面向对象-继承与抽象类+14 面向对象-接口与多态+15 面向对象-包&修饰符 第11天 综合练习 今日内容介绍 综合练习 ...

  4. 第三周 Java语法总结__static关键字__代码块__继承__this和super的区别__重写__final关键字__多态__抽象__接口__形参问题__包__权限修饰符__内部类

    文章目录 6.static关键字 1)静态static关键字的特点: 2)关于static关键字的使用注意事项 3)什么时候将变量定义为成员变量: 7.文档说明书: 8.代码块 9.继承 1)继承的概 ...

  5. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块的加载顺序

    1. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块 在Java中,使用{}括起来的代码称为代码块,代码块可以分为以下四种: (1)普通代码块:就是类中方法的方法体 public vo ...

  6. 从安全和不安全两个角度,教你如何发布对象(含各种单例代码)

    本文分享自华为云社区<[高并发]如何安全的发布对象(含各种单例代码分析)>,作者: 冰 河 . 今天,为大家带来一篇有技术含量的文章,那就是在高并发环境下如何安全的发布对象实例. 发布对象 ...

  7. java静态变量、静态方法、代码块、main方法

    文章目录 一.类变量 / 静态变量(static) 二.类方法 / 静态方法(static) 三.main方法 四.代码块 (一)static代码块 (二)普通代码块 五.属性初始化.代码块.构造器的 ...

  8. Java码农进阶之路~代码块面向对象特征之继承

    一 代码块 1.局部代码块(方法) 书写位置:方法中 作用:限制作用域 2.构造代码块 书写位置:类中 方法外 代码的执行顺序: ①系统调用 ②只要创建对象 就会调用 ③构造代码块 在 构造方法 之前 ...

  9. iOS严谨单例写法/可继承单例

    单例模式在iOS开发中可能算是最常用的模式之一了,但是由于OC本身的语言特性,想要写一个正确的单例模式相对来说比较麻烦. 今天就来说一说, 单例创建的方式和严谨的单例写法及可继承单例编写. 基本单例的 ...

最新文章

  1. 01 HBase基本概念和hbase shell常用命令用法
  2. Kafka在Spring项目中的实战演练
  3. vue商城项目开发:底部导航样式、顶部导航矩阵和轮播图
  4. JAVA复习5(集合——HashSet)
  5. css动画-模拟正余弦曲线
  6. 模板变量,过滤器和静态文件引用
  7. 【Kaggle】Intro to Machine Learning 第一次提交 Titanic
  8. 原生js实现浏览器全屏和退出全屏
  9. RNN 循环神经网络系列 5: 自定义单元
  10. linux 修改php配置,PHP部署时的几个配置修改说明
  11. Win7性能优化:解决多核处理器兼容问题
  12. xsd文件生成class
  13. 不小心删了sxos文件夹_Switch SX OS 精简虚拟系统 教程
  14. 体验不尽,进化不止,看视频云技术六大创新
  15. Adobe Photoshop 2021 22.4.2 绿色精简版
  16. 尘锋信息scrm与企鲸客的功能差别
  17. 锐取录播服务器咋样进系统界面,锐取录播系统
  18. BP神经网络Matlab实现(工具箱实现、自主编程实现)
  19. 简单易用的运动控制卡(十一):运动的暂停恢复和速度倍率设置
  20. PMP机构选择线上还是选择线下?

热门文章

  1. 基于Python处理Excel按条件合并表格
  2. 中创股份在科创板提交上会稿:计划募资6亿元,景新海为董事长
  3. java属于前端还是后端_jsp属于前端还是后端
  4. html盒子毛玻璃效果,css毛玻璃效果(外加background属性)
  5. Hbase中的LSM树详解
  6. 人工蜂群算法代码实现 python
  7. 基于FreeRTOS与MQTT的物联网技术应用系列——步进电机控制(五)MQTT的移植和步进电机控制的实现
  8. python十六进制转换成八进制_Python 进制转换 二进制 八进制 十进制 十六进制
  9. 华为机试真题 C++ 实现【绘图机器】【计算面积】
  10. 苹果8P/ iphone8plus /iphone8p已经连接WIFI 但是无法上网的问题