疯狂的java进阶之01搬砖从砖头(对象)开始

搬砖也要搬的不一般。

一、前言

岁月匆匆而来,时光匆匆而去。转眼间,做java开发已有3、4年的时间了,期间做过后台开发,写过前端web,而最主要的则是做android开发。语言也接触过好多种,什么Python、Kotlin、swift、Js、C等等,而最让我迷恋的还是个java。
java的优点我便不多说了,网上有太多的解释。而本文则是我三年来对java的理解,以及对网上收集资料的总结,是最java进阶的知识整理。

进入编程的第四年,不应该仅仅处于java的使用,而java的理解才是一道不得不迈的一道坎。

二、java第一步:啥是面向对象

2种主流的开发方法:结构化程序设计和面向对象程序设计;

* 结构化程序设计:

理解:

结构化程序设计就是将程序功能,进行一层一层的剥离,进行功能细分。一个细分功能就是一个函数,然后再由上层函数进行调用,在函数的层层调用之后,最终由主函数进行调用,实现完整的功能。

原则:

自顶向下、逐步求精、模块化。

* 面向对象程序设计:

理解:

1.什么是对象?
对象是实际存在的该类事物的个体,即对象是类的实例化,现实中的万物都可以理解为一个对象;
如:一辆汽车,将其抽象为具体的属性,即速度、大小、颜色、座位数等属性,以及具体的行为,即加速、刹车、载客等行为。
2.什么是对象?
类是具有共同属性和行为的一组对象的抽象。类是对象的抽象表现,是对象在代码中的具体表现形式;它必须具有属性和行为,才是一个完整的对象。
3.对象就是类?

对象是类的实例化,而类是对象的抽象;

类是面向对象编程中的最小的单元,但是类并不一定是一个对象,而类只是对象的一种表现形式;
对象可以是一个类,也可以是一个函数,或者多个类的集合,即万物皆可为对象;
而有些类在严格的意义上来讲,却并不是一个对象;
如: 一个仅仅包含常量的类,就不是一个对象。它仅仅具有属性缺不具有行为。

4.面向对象的特征

封装、继承、多态

  • 封装:

是把对象的属性和行为结合成一个整体,对细节隐藏,对操作开放。

如:一台智能手机,你不要关心手机内部有什么?怎么运行的程序?你只要点亮屏幕,就可以实现打电话、玩游戏、聊天等功能。

java的封装由权限修饰符:private、public、protected、default实现;
  • 继承:

是对一系列对象的公共属性和行为进行提取封装,而后由其他类继承,并实现自己独有的属性或行为。
父类独立于子类,而子类则依赖于父类。

如:水果是一个父类,其具有酸、甜等属性,也具有吃、腐烂等行为;而橘子也是水果的一种,它不仅具有父类的属性,同时还具有剥皮的特殊行为。因此,橘子是水果的一个子类,它实现了父类的所有方法,但要独立实现剥皮的行为。
简单说,没有橘子,水果依旧还是水果。但是,橘子如果不能吃,那他就一定不是水果。

java的继承使用extends或implements进行标记,通过override(重写)标记父类的行为,通过super实现父类的方法。
  • 多态:

是对象的同种行为的不同表现形式。
多态仅仅针对行为,与属性无关。
java的多态可以划分为同一个类中的多态(重载),以及父类与子类间的多态(重写)

如:‘吃’这个行为。可以表现为,吃饭、吃水果、吃茶等等。

java的多态,由重写(override)和重载(overload)来实现;

三、对象的番外篇

1.权限修饰符

修饰符 类内部 本包 子类 外部包
public 可访问 可访问 可访问 可访问
protected 可访问 可访问 可访问
default 可访问 可访问
private 可访问

备注:⚠️没有填写的内容为不可访问。
问题:被protected标注的外部包的子类是否可以访问?
答:可以访问的,类优先与包,而被protected标注的变量,在子类中是可以访问的。

2.重写和重载的对比

  • 什么是重写?

重写父类与子类之间的多态性,是子类对父类的方法重新定义,可以实现父类的方法,也可以不实现父类的方法。
即,方法名、参数与返回值完全相同,且子类方法的访问权限不可以小于类;

  • 什么是重载?

重载是在同一个类中,相同的行为的不同表现形式。
即,方法名相同,参数的个数或类型不同,返回值可以相同,也可以不同。

  • 概述

重写与重载是java多态性的具体表现形式.
⚠️使用的原则是:相同的行为,表现形式不同时使用

参考链接

3.普通类、抽象类和接口的区别

  • 普通类:
    是具有一系列属性和行为的类,它可以被实例化成一个对象。

  • 抽象类:
    是普通类的抽象形式,它仅仅代表一个分类或抽象概念,它的实例化没有任何意义,因此不希望它被实例化。即,抽象类并不是一个完整的对象。
    特征:
    1.抽象类使用abstract class对类名进行标记;
    2.抽象类可以有抽象方法,也可以没有抽象方法,其使用 abstract标记;
    3.抽象类不可以被实例化;
    4.抽象类可以有普通方法,并实现具体行为。
    5.抽象类的子类,必须实现父类的抽象方法,或者子类也是抽象类。
    6.抽象类通过extends使用,一个类只能继承一个抽象类。

  • 接口:
    接口是特殊的抽象方法,在接口中所有的方法都是抽象方法。
    特征:
    1.接口使用interface对类名进行标记;
    2.接口中全部都是抽象方法,不可以写方法的实现,由子类实现具体的行为;
    3.接口不可以被实例化;
    4.接口通过implements使用,一个类可以实现多个接口。

  • 接口和抽象类的之间的区别。
    1.变量,抽象类可以有实例变量,而接口不能拥有实例变量,接口中的变量都是静态的常量。
    2.方法,抽象类中可以有非抽象方法,而接口中只能拥有抽象方法。
    3.接口可以多继承,抽象类只能继承一个。

  • 接口和抽象类的使用场景
    在考虑使用抽象类还是使用接口时,应该从以下两点出发。
    1.父类中不需要实现具体的功能,使用接口;
    2.子类需要继承多个父类,才能实现完整的功能时,使用接口;
    其他情况,一般会使用抽象类。
    参考链接

4.类的初始化流程

父类:

public class ClassA {
    //构造方法
    ClassA() {
        System.out.println("父类-构造方法");
    }

    //非静态代码块
    {
        System.out.println("父类-非静态代码块");
    }

    //静态代码块
    static {
        System.out.println("父类-静态代码块");
    }

    //静态方法
    public static void mothedA() {
        System.out.println("父类-静态方法");
    }
}

子类:

 public class ClassB extends ClassA {
    //构造方法
    ClassB() {
        System.out.println("子类-构造方法");
    }

    //非静态代码块
    {
        System.out.println("子类-非静态代码块");
    }

    //静态代码块
    static {
        System.out.println("子类-静态代码块");
    }

    //静态方法
    public static void mothedB() {
        System.out.println("子类-静态方法");
    }

    //静态方法
    public static void mothedA() {
        System.out.println("父类-静态方法");
    }

}

备注:
1.父类的方法优先与子类的方法;
2.同一个类中的非静态代码块与构造方法先后执行,执行完成后才会执行到子类;
3.若直接调用静态方法,优先于非静态代码块。

调用方式 执行顺序
new ClassA(); 父类-静态代码块
子类-静态代码块
父类-非静态代码块
父类-构造方法
new ClassB(); 父类-静态代码块
子类-静态代码块
父类-非静态代码块
父类-构造方法
子类-非静态代码块
子类-构造方法
ClassA.mothedA(); 父类-静态代码块
子类-静态代码块
父类-静态方法
ClassB.mothedA(); 父类-静态代码块
子类-静态代码块
父类-静态方法
ClassB.mothedB(); 父类-静态代码块
子类-静态代码块
子类-静态方法

总结:
1.直接调用静态方法,即没有实例化,不会运行非静态代码块和构造方法;
2.同一个类中的非静态代码块与构造方法先后执行,执行完成后才会执行到子类;
3.相同方法,父类优先于子类;


以上是我对java象的简单理解。
若有问题,欢迎指正、留言,欢迎大家一起讨论。

你可能感兴趣的:(疯狂的java进阶之01搬砖从砖头(对象)开始)