• 面向对象高级一(static 继承)


    适宜人群
    1. 具备一定Java编程基础的人员
    2. 想深刻体会Java编程思想,成为大牛的人员。
    学完会有什么收货?
    1. 掌握完整的Java基础技术体系
    2. 极强的编程能力
    3. 较强的解决问题的能力
    4. 足以支持Java基础面试和后续课程的学习
    5. 最为标准的代码规范
    6. 阅读源码的能力
    面向对象高级部分的学习建议
    1. 多关注语法的基础作用
    2. 多思考,练习,记忆
    3. 要自信,后面用起来就会了

    static

    静态,可以修饰成员变量、成员方法。

    成员变量按照有无static修饰,分为两种

    类变量(静态成员变量):有static修饰,属于类,在计算机中只有一份,会被类的全部对象共享。

    实例变量(对象的变量):无static修饰,属于每个对象的。

    访问方式

    类名.类变量

    对象名.类变量(不推荐使用这种方式)

    类变量(静态成员变量)属于类,与类一起加载一次,在内存中只有一份,可以被类和类的所有对象共享。

    小结
    1. static是什么?
    • 叫静态,可以修饰成员变量、成员方法。
    1. static修饰的成员变量叫什么?怎么使用?有啥特点?
    • 类变量(静态成员变量)

    • 属于类,与类一起加载一次,在内存中只有一份,会被类的所有对象共存。

    1. 无static修饰的成员变量叫什么?怎么使用?有啥特点
    • 实例对象(对象变量)
    • 属于对象,每个对象中都有一份。
    类变量的应用场景

    在开发中,如果某个数据只需要一份,且希望能够被共享(访问、修改),则该数据可以定义成类变量来记住。

    1. 成员变量有几种?各自在什么情况下定义?
    • 类变量:数据只需要一份,且需要被共享时(访问,修改)
    • 实例变量:每个对象都要有一份,数据个不同(如:name,score,age)
    1. 访问自己类中的类变量,是否可以省略类名不写?
    • 可以的
    • 注意:在某个类中访问其他类里的类比那辆,必须带类名访问。
    成员方法的分类

    类方法:有static修饰的成员方法,属于类。

    public static void printHelloWorld(){
        System.out.println("Hello World");
    }
    
    • 1
    • 2
    • 3

    实例方法:无static修饰的成员方法,属于对象。

    public void printPass(){
        //...
    }
    
    • 1
    • 2
    • 3
    1. static修饰的成员方法叫什么?如何使用?
    • 类方法(静态方法)

    • 属于类,可以直接用类名访问,也可以用对象访问

    • 类名.类方法(推荐)

      对象名.类方法(不推荐使用)

    1. 无static修饰的成员方法叫什么?如何使用?
    • 实例方法(对象的方法)。
    • 属于对象,只能用对象访问。对象.实例方法
    类方法常用的应用场景
    • 类方法最常见的应用场景是做工具类
    工具类是什么?
    • 工具类中的方法都是一些类方法,每个方法都是用来完成一个功能的,工具类是给开发人员共同使用的。
    使用类方法来设计工具类有什么好处?
    • 提高了代码的复用性;调用方便,提高了开发效率。
    为什么工具类中的方法要用类方法,而不用实例方法?
    • 实例方法需要创建对象来调动,此时对象只是为了调用方法,对象占内存,这样会浪费内存
    • 类方法,直接用类名调用即可,调用方便,也能节省内存。

    因为工具类是不创建对象的所以可以将工具类的构造器私有化。

    总结
    1. 类方法有什么应用场景?
    • 可以用来设计工具类
    1. 工具类是什么,有什么好处?
    • 工具中的方法都是类方法,每个类方法都是用来完成一个功能的。
    • 提高了代码的复用性;调用方便,提高了开发效率。
    1. 为什么工具类要用类方法,而不是实例方法?
    • 实例方法需要创建对象来调用,会浪费内存。
    1. 工具类定义时有什么要求?
    • 工具类不需要创建对象,建议将工具类的构造器私有化。
    static注意事项(使用类方法、实例方法时的几点注意事项)
    • 类方法中可以直接访问类的成员,不可以直接访问实例成员。
    • 实例方法中即可以访问类成员,也可以直接访问实例成员。
    • 实例方法中可以出现this关键字,类方法中不可以出现this关键字。
    代码块

    代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类)

    代码块分为两种

    • 静态代码块:

      • 格式:static{}
      • 特点:类加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次。
      • 作用:完成类的初始化,例如:对类变量的初始化赋值。
    • 实例代码块

      • 格式:{}
      • 特点:每次创建对象时,执行实例代码块,并在构造器前执行。
      • 作用:和构造器一样,都是用力啊完成对象的初始化的,例如:对实例变量进行初始化赋值
    什么是设计模式(design pattern)?
    • 一个问题通常由n种解法,其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式。
    • 设计模式有20多种,对应20多种软件开发中会遇到的问题。
    单例设计模式

    确保一个类只有一个对象。

    写法:

    • 把类的构造器私有化。
    • 定义一个类变量记住类的对象。
    • 定义一个类方法,返回对象。
    //饿汉式单例
    public class A{
        //2、 定义一个类变量
        private static A a = new A();
        //1. 私有构造器
        private A(){
            
        }
        //3.定义一个类方法返回对象
        public static A getObject(){
            return a;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    除了饿汉式单例,还存在懒汉式单例等实现方式。

    应用场景:Runtime

    懒汉式单例设计模式

    写法:

    • 把类的构造器私有。
    • 定义一个类变量用于存储对象。
    • 提供一个类方法,保证返回的是同一个对象。
    //懒汉式单例设计模式
    public class B{
        //2. 定义一个变量用来存储对象。
        private static B b;
        //1.把类的构造器私有化
        private B(){
            
        }
        //3. 提供一个类方法,保证返回的是同一个对象。
        public static B getInstance(){
            if(b == null){
                b = new B();
            }
            return b;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    面向对象的三大特性之二——继承

    什么是继承?

    Java中提供了一个关键字extends,用这个关键字,可以让一个类和另一个类建立起父子关系。

    public class B extends A{
        //A类称为父类(基类或超类)、B称为子类(派生类)
    }
    
    • 1
    • 2
    • 3

    继承的特点:子类能继承父类的非私有成员(成员变量、成员方法)

    继承后对象的创建:子类的对象是由子类、父类共同完成的。

    子类对象实际上是由子父类两张设计图共同创建出来的。

    总结

    1. 什么是继承?继承后有哪些特点?
    • 继承就是用extends关键字,让一个类和另一个类建立起一种父子关系
    • 子类可以继承父类非私有的成员。
    1. 带继承关系的类,Java会怎么创建它的对象?对象创建出来后,可以直接访问哪些成员?
    • 带继承关系的类,java会用类和其父类,这多张设计图来一起创建类的对象。
    • 对象能直接访问什么成员,是由父类这多张设计图共同决定的,这多张设计图对外暴露了什么成员,对象就可以访问什么成员。

    使用继承的好处?

    • 减少重复代码的编写。

    什么是权限修饰符?

    • 就是用来限制类中的成员(成员变量,成员方法,构造器,代码块……)能够被访问的范围。

    权限修饰符有几种?各自的作用是什么?

    修饰符在本类中在同一个包下的其他类里任意包下的子类中任意包下的任意类中
    private
    缺省
    protected
    public

    private<缺省

    Java是单继承的,Java中的类不支持多继承,但是支持多层继承。

    Object类
    • Object类是java所有类的祖宗类。我们写的任何一个类,其实都是object的子类或子孙类
    1. 继承相关的两个注意事项?
      1. Java是单继承的:一个类只能继承一个直接父类;Java中的类不支持多继承,但是支持多层继承。
      2. Object类是Java中所有类的祖宗。

    什么是方法重写?

    • 当子类觉得父类中的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法,这就是方法重写。
    • 注意:重写后,方法的访问,Java会遵循就近原则。

    方法重写的注意事项

    • 重写小技巧:使用Override注解,他可以指定java编译器,检查我们重写的格式是否正确,代码可读性也会更好。
    • 子类重写父类方法时,访问权限必须大于或等于父类该方法的权限(public>protected>缺省)
    • 重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小。
    • 私有方法、静态方法不能被重写,如果重写会报错。

    方法重写在开发中的常见应用场景

    • 子类重写Object类的toString()方法,以便返回对象的内容。
    1. 方法重写是什么?
    • 子类写一个方法名称,形参列表与父类某个方法一样的方法去覆盖父类的该方法。
    1. 重写方法有哪些注意事项?
    • 建议加上:@Override注解,可以校验重写是否正确,同时可读性好。
    • 子类重写父类方法时,访问权限必须大于或等于父类被重写的方法的权限。
    • 重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小。
    • 私有方法、静态方法不能被重写。
    1. 方法重写应用场景?
    • 当子类觉得父类方法不好用,或者不满足自己的需求时,就可以用方法重写。
    1. 在子类方法中访问其他成员(成员变量、成员方法),是依照就近原则的。
    • 先子类局部范围找。
    • 然后子类成员范围找
    • 然后父类成员范围找,如果父类范围没有找到则会报错。
    1. 如果子父类中,出现了重名的成员,会有限使用子类的,如果此时一定要在子类中使用父类怎么办?
    • 可以通过super关键字,指定访问父类的成员:super.父类成员变量/父类成员方法
    子类构造器的特点:
    • 子类的全部构造器,都会调用父类的构造器,再执行自己。
    子类构造器是如何实现调用父类构造器的:
    • 默认情况下,子类全部构造器的第一行代码都是super()(写不写都有),它会调用父类的无参构造器。
    • 如果父类没有无参构造器,则我们必须在子类构造器的第一行手写super(……),指定去调用父类的有参构造器。
    • 子类构造器可以通过调用父类构造器,把对象中包含父类这部分的数据先初始化赋值,再回来把对象里面包含子类这部分的数据也进行初始化赋值。

    补充知识:this(……)调用兄弟构造器

    任意类的构造器中,是可以通过this(……)去调用该类的其他构造器的。

    在同一个构造器中super和this能同时出现。this()super()都只能放在构造器的第一行,所以有了this()就不能写super()了。

    总结
    1. 子类构造器有什么特点?
    • 子类中的全部构造器,都必须先调用父类的构造器,再执行自己的。
    1. super()调用父类有参构造器的常见应用场景是什么?
    • 对象中包含父类部分的成员变量进行赋值。
    1. this()的作用是什么?
    • 在构造器中调用本类的其他构造器。
    1. this()super()的使用需要注意什么?
    • 都必须放在构造器的第一行。
  • 相关阅读:
    CGI Hack 实现在HTML页面执行Shell命令
    java“俄罗斯方块”
    centos使用lftp备份文件
    Maven打包可执行jar包方法大全(史上最全)
    AI 应用的全流程存储加速方案技术解析和实践分享
    Ubuntu处理依赖问题
    maven-metadata.xml
    Vue2之防抖_debounce封装函数&v-debounce自定义指令(传参/不传)
    C语言,数组和指针的区别
    docker-compose 搭建 Prometheus+Grafana监控系统
  • 原文地址:https://blog.csdn.net/Tian_baby/article/details/134483383