一、 static关键字

使用static关键字修饰成员变量表示静态的含义,此时成员变量由对象层级提升为类层级,整个类共享一份静态成员变量,该成员变量随着类的加载准备就绪,与是否创建对象无关

  • 使用static修饰属性:静态变量(或类变量)

    • 静态变量随着类的加载而加载,可以通过类名.静态变量的方式进行调用
    • 静态变量的加载早于对象的创建
    • 类只会加载一次,静态变量在内存中只有一份,在方法区的静态域中
  • 使用static关键字修饰类方法:静态方法
    • 静态方法中只能代用静态方法的属性或方法
    • 非静态方法中,可以调用非静态的方法和属性,也可以调用静态的方法和属性
  • 特点:

    • 在Java类中, 可用static修饰属性、 方法、 代码块、 内部类,不能修饰构造器
    • 被static修饰的成员随着类的加载而加载,优先于对象存在,被所有对象共享
    • 可以直接被类调用,通过类名.静态成员变量或方法的方式
  • 注意事项:
    • 在非静态成员方法中既能访问非静态成员,又能访问静态成员 (成员:成员变量 + 成员方法, 静态成员被所有对象共享)  
    • 静态成员方法中职能访问静态成员,不能访问非静态成员(成员:成员变量 + 成员方法, 因为此时可能还没有创建对象)
    • 隶属于类层级并被所有对象共享的才可使用static关键字修饰
    • 在静态的方法内,不能使用this关键字、super关键字
    • static修饰的方法不能被重写
  • 内存解析

  

二、代码块

代码块用于初始化类和对象,只能用static修饰,分为静态代码块和非静态代码块

  • 静态代码块

    • 内部可以有输出语句,随着类的加载而执行,只执行一次,初始化类的信息
    • 不可以对非静态的属性初始化,不可以调用非静态的属性和方法
    • 如果一个类中定义了多个静态代码块,按照声明的先后顺序执行
    • 静态代码块的执行优先于非静态代码块的执行
    • 静态代码块只能调用静态的属性和静态方法,不能调用非静态的结构
  • 非静态代码块
    • 内部可以有输出语句
    • 随着对象的创建而执行
    • 每创建一个对象就会执行一次非静态代码块,可以在创建对象
    • 如果一个类中定义了多个非静态代码块,按照声明的顺序先后执行
    • 非静态代码块可以调用静态的属性和方法或者非静态的属性和方法
  • 对属性可以赋值的位置:
    ①默认初始化-->②显式初始化/⑤在代码块中赋值(同级别下按先后顺序执行 )-->③构造器中初始化-->④有了对象以后,可以通过"对象.属性"或"对象.方法"的方式,进行赋值  

  1. package com.atguigu.java3;
  2. class Root{
  3. static{
  4. System.out.println("Root的静态初始化块");
  5. }
  6. {
  7. System.out.println("Root的普通初始化块");
  8. }
  9. public Root(){
  10. super();
  11. System.out.println("Root的无参数的构造器");
  12. }
  13. }
  14. class Mid extends Root{
  15. static{
  16. System.out.println("Mid的静态初始化块");
  17. }
  18. {
  19. System.out.println("Mid的普通初始化块");
  20. }
  21. public Mid(){
  22. super();
  23. System.out.println("Mid的无参数的构造器");
  24. }
  25. public Mid(String msg){
  26. //通过this调用同一类中重载的构造器
  27. this();
  28. System.out.println("Mid的带参数构造器,其参数值:"
  29. + msg);
  30. }
  31. }
  32. class Leaf extends Mid{
  33. static{
  34. System.out.println("Leaf的静态初始化块");
  35. }
  36. {
  37. System.out.println("Leaf的普通初始化块");
  38. }
  39. public Leaf(){
  40. //通过super调用父类中有一个字符串参数的构造器
  41. super("mid");
  42. System.out.println("Leaf的构造器");
  43. }
  44. }
  45. public class LeafTest{
  46. public static void main(String[] args){
  47. new Leaf();
  48. System.out.println();
  49. new Leaf();
  50. }
  51. }
  52.  
  53. //执行结果
  54. /*
  55. Root的静态初始化块
  56. Mid的静态初始化块
  57. Leaf的静态初始化块
  58. Root的普通初始化块
  59. Root的无参数的构造器
  60. Mid的普通初始化块
  61. Mid的无参数的构造器
  62. Mid的带参数构造器,其参数值: mid
  63. Leaf的普通初始化块
  64. Leaf的构造器

    Root的普通初始化块
    Root的无参数的构造器
    Mid的普通初始化块
    Mid的无参数的构造器
    Mid的带参数构造器,其参数值:mid
    Leaf的普通初始化块
    Leaf的构造器
  65. */

三、final关键字

final可以用于修饰类、方法和变量,意为最终的,不可变的

  • final 用来修饰一个类:此类不能被其他类所继承。
  • final 用来修饰方法:表明此方法不可以被重写
  • final 用来修饰变量:此时的"变量"就称为是一个常量,可以考虑赋值的位置有:显式初始化、代码块中初始化、构造器中初始化
  • final修饰局部变量,表明形参是一个常量,一旦赋值不能在进行重新赋值
  • static final 用来修饰属性:全局常量
  1. public class FinalTest {
  2.  
  3. final int WIDTH = 0;
  4. final int LEFT;
  5. final int RIGHT;
  6. // final int DOWN;
  7.  
  8. {
  9. LEFT = 1;
  10. }
  11.  
  12. public FinalTest(){
  13. RIGHT = 2;
  14. }
  15.  
  16. public FinalTest(int n){
  17. RIGHT = n;
  18. }
  19.  
  20. public void setDown(int down){
  21. // this.DOWN = down; //在方法体不可以对final属性进行赋值操作
  22. }
  23.  
  24. public void doWidth(){
  25. // width = 20;//在方法体不可以对final属性进行赋值操作
  26. }
  27.  
  28. public void show(){
  29. final int NUM = 10;//常量
  30. // NUM += 20; //final局部变量一旦初始化不可以在被复制
  31. }
  32.  
  33. public void show(final int num){
  34. // num = 20;//final 局部变量一旦被实参传入,就已经赋值,不能重新赋值,编译不通过
  35. System.out.println(num);
  36. }
  37.  
  38. public static void main(String[] args) {
  39.  
  40. int num = 10;
  41.  
  42. num = num + 5; //局部变量可以重复赋值
  43.  
  44. FinalTest test = new FinalTest();
  45. // test.setDown(3);
  46.  
  47. test.show(10);
  48. }
  49. }
  50.  
  51. final class FinalA{
  52.  
  53. }
  54.  
  55. //class B extends FinalA{
  56. //
  57. //}
  58.  
  59. //class C extends String{
  60. //
  61. //}
  62.  
  63. class AA{
  64. public final void show(){
  65.  
  66. }
  67. }
  68.  
  69. class BB extends AA {
  70. /*public void show(){ //final方法不可以被重写
  71. }*/
  72. }
  73.  
  74. final class Root{}
  75. // class sub extends Root{} // final 类不可以被继承

四、abstract关键字

abstract用于修饰抽象的类或方法,抽象类使用extends实现

  • 抽象类: 指不能具体实例化的类并且使用abstract关键字修饰,也就是不能创建对象

    • 抽象类中一定有构造器,便于子类实例化时调用,但是抽象类不能调用自身构造器实例化
    • 多态的一种表现形式:抽象类的子类实例化形成抽象类
    • 抽象类中可以有成员变量、构造方法、成员方法
    • 抽象类中可以没有抽象方法,也可以有抽象方法
    • 当一个类继承抽象类后必须重写抽象方法,否则该类也变成抽象类,也就是抽象类对子类具有强制性和规范性,因此叫做模板设计模式
  • 抽象方法:抽象方法用abstract修饰方法,没有方法体
    • 包含抽象方法的一定是抽象类,抽象类可以没有抽象方法
    • 若子类重写了父类的所有抽象方法后,子类可以实例化
    • 若子类没有全部重写父类中的所有抽象方法,该子类也是一个抽象类,需要适用abstract修饰
  • abstract不能用来修饰私有方法、静态方法、final的方法、final的类 

五、接口

接口使用interface定义,使用implements实现

  • JDK7以前,接口里只能定义全局变量和抽象方法,(public static final )+ 常量; public abstract+ 方法
  • JDK8以后,接口可定义静态方法和默认方法,只能通过接口直接调用静态方法,可以通过类的对象调用默认方法,如果重写了接口中的默认方法,就会被覆盖
  • 继承关系大于接口实现关系
  1. interface Playable {
  2. void play();
  3. }
  4. interface Bounceable {
  5. void play();
  6. }
  7. interface Rollable extends Playable,
  8. Bounceable {
  9. Ball ball = new Ball("PingPang");
  10. }
  11. class Ball implements Rollable {
  12. private String name;
  13. public String getName() {
  14. return name;
  15. }
  16. public Ball(String name) {
  17. this.name = name;
  18. }
  19. public void play() {
  20. ball = new Ball("Football");
  21. System.out.println(ball.getName());
  22. }
  23. }
  • 接口不可以定义构造器,没有默认构造器,不能实例化
  • 如果实现类覆盖了接口中的所有抽象方法,该实现类可以被实例化,否则该实现类是一个抽象类
  • 接口和接口之间可以多继承,实现类和接口之间可以多实现
  • 接口主要用于代理模式,为其他对象提供一种代理以控制对这个对象的访问。
  • 接口可以用于工厂模式

若一个接口中定义了一个默认方法,而另外一个接口中也定义了一个同名同参数的方法,在实现类同时实现了这俩个接口时会出现接口冲突

  1. class Man implements Filial, Spoony {
  2. @Override
  3. public void help() {
  4. System.out.println("我该怎么办呢?");
  5. Filial.super.help();
  6. Spoony.super.help();
  7. }
  8. }
  9. interface Filial {// 孝顺的
  10. default void help() {
  11. System.out.println("老妈,我来救你了");
  12. }
  13. }
  14. interface Spoony {// 痴情的
  15. default void help() {
  16. System.out.println("媳妇,别怕,我来了");
  17. }
  18. }

若一个接口中定义了一个默认方法,而父类中也定义了一个同名同参数的非抽象方法,由于类优先原则,不会出现冲突问题,接口中的同名同参数默认方法会被忽略

七、内部类

一个类的定义位于另一个类的内部称为内部类 ,Inner class一般用在定义它的类或语句块之内,在外部引用它时必须给出完郑的名称,且内部类不能与他所在的外部类同名

  • 类中的内容:成员变量、成员方法、构造方法、静态成员、构造块和静态代码块、内部类。
  • 当一个类存在的价值仅仅是为某一个类单独服务时,那么就可以将这个类定义为所服务类中的内部类,这样可以隐藏该类的实现细节并且可以方便的访问外部类的私有成员而不再需要提供公有的get和set方法
  • 分类:

    • 普通内部类 - 直接将一个类的定义放在另外一个类的类体中。 

      • 普通内部类和普通类一样可以定义成员变量、成员方法以及构造方法等。

      • 普通内部类和普通类一样可以使用final或者abstract关键字修饰。

      • 普通内部类还可以使用private或protected关键字进行修饰。

      • 普通内部类需要使用外部类对象来创建对象

      • 如果内部类访问外部类中与本类内部同名的成员变量或方法时,需要使用this关键字
  1. 访问修饰符 class 外部类的类名 {
  2. 访问修饰符 class 内部类的类名 {
  3. 内部类的类体;
  4. }
    • 静态内部类 - 使用static关键字修饰的内部类,隶属于类层级 

      • 静态内部类不能直接访问外部类的非静态成员。静态内部类可以直接创建对象。

      • 如果静态内部类访问外部类中与本类内同名的成员变量或方法时,需要使用类名.的方式访问。

  1. 访问修饰符 class 外部类的类名 {
  2. 访问修饰符 static class 内部类的类名 {
  3. 内部类的类体;
  4. }
  5. }
    • 局部内部类 - 直接将一个类的定义放在方法体的内部时

      • 局部内部类只能在该方法的内部可以使用。

      • 局部内部类可以在方法体内部直接创建对象。

      • 局部内部类不能使用访问控制符和static关键字修饰符。

      • 局部内部类可以使用外部方法的局部变量,但是必须是final的,因为局部内部类和局部变量的声明周期不同所致     

  1. 访问修饰符 class 外部类的类名 {
  2. 访问修饰符 返回值类型 成员方法名(形参列表) {
  3. class 内部类的类名 {
  4. 内部类的类体;
  5. }
  6. }
  7. }
    • 匿名内部类 - 就是指没有名字的内部类
  1. 接口/父类类型 引用变量名 = new 接口/父类类型() { 方法的重写 };

java基础---类和对象(4)的更多相关文章

  1. 第31节:Java基础-类与对象

    前言 Java基础-类与对象,方法的重载,构造方法的重载,static关键字,main()方法,this关键字,包,访问权限,类的继承,继承性,方法的重写,super变量. 方法的重载:成员方法的重载 ...

  2. JAVA基础——类和对象

    java类与对象学习笔记 一.成员变量和局部变量 (1)定义 1.成员变量 在类中定义,用来描述对象将要有什么.(默认的成员变量值为0) 2.局部变量 在类的方法中定义,在方法中临时保存数据. 演示示 ...

  3. Java基础-类和对象

    类和对象 对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有:摇尾巴.叫.吃等. 类:类是一个模板,它描述一类对象的行为和状态. ...

  4. Java基础—类和对象

    基本概念 对象:对象是类的一个实例,有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有:摇尾巴.叫.吃等. 类:类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提 ...

  5. java基础---类和对象(1)

    一. 类和对象 面向对象:以属性和行为的观点去分析现实生活中的事物,将功能封装进对象, 强调具备了功能的对象,以类/对象为最小单位,考虑谁来做 面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做 ...

  6. Java基础——类和对象的初始化过程

    本节把类和对象的初始化所涉及到的所有代码块阐述一边. 示例代码: public class Demo { private static String name; private String age; ...

  7. java基础---类和对象(3)

    一.Object类 java.lang.Object类是Java语言中类层次结构的根类,也就是说任何一个类都是该类的直接或者间接子类 如果定义一个Java类时没有使用extends关键字声明其父类,则 ...

  8. java基础---类和对象(2)

    一.继承(extends) 面向对象的三大特性之一,当多个类中存在相同属性和行为时,将这些内容抽取到一个公共类中,让多个类(子类)吸收公共类(父类.超类)中已有特征和行为,而在多个类型只需要编写自己独 ...

  9. Java基础-IO流对象之字符类(FileWrite与FileReader)

    Java基础-IO流对象之字符类(FileWrite与FileReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常见编码简介 1>ASCII 我们知道计算机是 ...

随机推荐

  1. anaconda同时集成Python2 和 Python3

    参考帖子,亲测有效: 利用anaconda同时使用python2和python3的方法 注意:最后一步是再对应的python环境中输入:conda install anaconda

  2. MinkowskiEngine语义分割

    MinkowskiEngine语义分割 要运行示例,请安装Open3D与PIP安装open3d-python. cd /path/to/MinkowskiEngine python -m exampl ...

  3. Node.js使用本地依赖

    最近项目组写了几个模块,打算采用依赖的方式来使用它们. 因为敏感性问题,不打算发布到npm官方仓库:自行搭建一个npm仓库成本也大. 所以最后决定采用本地安装. 即在package.json中填写如下 ...

  4. 使用BootstrapVue相关组件,构建Vue项目界面

    基于Vue的前端框架有很多,Element算一个,而BootstrapVue也可以非常不错的一个,毕竟Bootstrap也是CSS中的大佬级别的,它和Vue的整合,使得开发起来更加方便了.Bootst ...

  5. Android 小知识点笔记

    获取 view 的位置 View.getLocationInWindow(int[] location) 一个控件在其父窗口中的坐标位置 View.getLocationOnScreen(int[] ...

  6. Netty 框架学习 —— ByteBuf

    概述 网络数据的基本单位总是字节,Java NIO 提供了 ByteBuffer 作为它的字节容器,但这个类的使用过于复杂.Netty 的 ByteBuf 具有卓越的功能性和灵活性,可以作为 Byte ...

  7. pytest 给用例打标签

    1.给用例添加自定义标签命令:@pytest.mark.tagname     #tagname是自定义的标签名 import pytest class TestClass(): @pytest.ma ...

  8. 【NX二次开发】Block UI 双精度表

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...

  9. 【NX二次开发】Block UI 通过浏览选择文件

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  10. TCP/IP协议 (图解+秒懂+史上最全)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...