ObjectOrientedProgramming - 面向对象的编程(多态、抽象类、接口)- Java - 细节狂魔

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

class Shape{// 无论是 三角形,还是正方形等等,它们都是图形

// 以此作为共性抽出

public void draw(){

    System.out.println("Shape::draw()");

}

}

// 矩形

class Rect extends Shape{

@Override// 当我们在子类中,重写了父类中的方法。那么父类方法中的输出语句就显得毫无意义

// 最后都是输出子类draw方法,如果你想的话,可以删掉父类的 输出语句

public void draw(){

    System.out.println("♦");

}

}

// 花

class Flower extends Shape{

@Override

public void draw() {

    System.out.println("❀");

}

}

public class Test {

public static void paint(Shape shape){

    shape.draw();

}

public static void main(String[] args) {

    Rect rect = new Rect();

    paint(rect);

    paint(new Rect());

    System.out.println("=============");

    Flower flower = new Flower();

    paint(flower);

    paint(new Flower());

}

}




#### []( )附图



![在这里插入图片描述](https://img-blog.csdnimg.cn/31d294d49dbc452db4924717f3b367a3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

从另一个方面来说:通过一个引用来调用不同的draw方法,会呈现出不同的表现形式。表现的形式取决于将来它引用那个对象。这就是动态。而且实现多态的大前提,就是一定要向上转型,且实现 父类和子类的重写方法。



* * *



[]( )总结:

------------------------------------------------------------------



在这个代码中, 上方的代码(矩形、花、继承)是 类的实现者 编写的, 下方的代码(main所在的类)是 类的调用者 编写的。  

当类的调用者在编写 Paint 这个方法的时候, 参数类型为 Shape (父类), 此时在该方法内部并不知道, 也不关注当前的 shape 引用指向的是哪个类型(哪个子类)的实例. 此时 shape 这个引用调用 draw 方法可能会有多种不同的表现。(和 shape 对应的实例相关), 这种行为就称为 多态。  

多态 顾名思义, 就是 “一个引用, 能表现出多种不同形态”。



* * *



### []( )拓展:



多态是面向对象程序设计中比较难理解的部分. 我们会在后面的抽象类和接口中进一步体会多态的使用. 重点是多态带来的编码上的好处.

另一方面,

如果抛开 Java, 多态其实是一个更广泛的概念, 和 “继承” 这样的语法并没有必然的联系.

C++ 中的 “动态多态” 和 Java 的多态类似. 但是 C++ 还有一种 “静态多态”(模板), 就和继承体系没有关系了.

Python 中的多态体现的是 “鸭子类型”, 也和继承体系没有关系.

Go 语言中没有 “继承” 这样的概念, 同样也能表示多态.

无论是哪种编程语言, 多态的核心都是让调用者不必关注对象的具体类型. 这是降低用户使用成本的一种重要方式.




* * *



[]( )使用多态的好处是什么?

==========================================================================



1\. 类调用者对类的使用成本进一步降低。  

       **封装**是让类的**调用者不需要知道类的实现细节**.  

       **多态**能让类的**调用者连这个类的类型是什么都不必知道**, 只需要知道这个对象具有某个方法即可。因此,多态可以理解成是封装的更进一步, 让类的**调用者对类的使用成本进一步降低.**  

 这也**贴合了 <<代码大全>> 中关于 “管理代码复杂程度” 的初衷.**  

   

2\. 能够降低代码的 “圈复杂度”, **避免使用大量的 if - else**  

3\. 可扩展能力更强.:如果要新增一种新的形状, 使用多态的方式代码改动成本也比较低



[]( )有第二个好处,引出问题,什么是圈复杂度?

-----------------------------------------------------------------------------------



圈复杂度是一种描述一段代码复杂程度的方式. 一段代码如果平铺直叙, 那么就比较简单容易理解.

而如果有很多的条件分支或者循环语句, 就认为理解起来更复杂.

因此我们可以简单粗暴的计算一段代码中条件语句和循环语句出现的个数, 这个个数就称为 "圈复杂度". 

如果一个方法的圈复杂度太高, 就需要考虑重构

 不同公司对于代码的圈复杂度的规范不一样. 一般不会超过 10



### []( )对比图(情况2)



![在这里插入图片描述](https://img-blog.csdnimg.cn/e30a8e8daade416f9212ff68a1717323.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



### []( )情况3 附图



![在这里插入图片描述](https://img-blog.csdnimg.cn/67d9782d81ef487493d7f7c7b01f6f9d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_12,color_FFFFFF,t_70,g_se,x_16)



* * *



[]( )抽象类

==================================================================



[]( )语法规则

-------------------------------------------------------------------



> 在刚才的打印图形例子中, 我们发现, 父类 Shape 中的 draw 方法好像并没有什么实际工作, 主要的绘制图形都是由  

> Shape 的各种子类的 draw 方法来完成的. 像这种没有实际工作的方法, 我们可以把它设计成一个 抽象方法(abstract  

> method), 包含抽象方法的类我们称为 抽象类(abstract class)



abstract class Shape {

abstract public void draw();

}




> 在 draw 方法前加上 abstract 关键字, 表示这是一个抽象方法. 同时抽象方法没有方法体(没有 { }, 不能执行具体代码).  

> 对于包含抽象方法的类, 必须加上 abstract 关键字表示这是一个抽象类.



![在这里插入图片描述](https://img-blog.csdnimg.cn/8494cc616d064f80b50a78a07dfef913.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



[]( )代码如下:

--------------------------------------------------------------------



abstract class Shape{

// 凡是 一个类中,包含抽象方法,就要改类前面加上 abstract 修饰,叫做抽象类。

public abstract void draw();// 加上分号,代表没有不实现任何现象

// 在 public 后面加上 abstract 这样它就变成了一个抽象方法

}




* * *



[]( )那么抽象类 和 普通类 又有区别?

--------------------------------------------------------------------------------



### []( )1\. 抽象类不能直接实例化.



![在这里插入图片描述](https://img-blog.csdnimg.cn/eff28760c00644cc9c9168d8b89161d5.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_19,color_FFFFFF,t_70,g_se,x_16)



#### []( )另外 在抽象类内部 是可以定义成员变量和方法的



![在这里插入图片描述](https://img-blog.csdnimg.cn/cb8f461471a445528da5462881bb36fe.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_17,color_FFFFFF,t_70,g_se,x_16)



有人可能会说,又不能new,里面就算能存储方法和变量,也不能用,那我们要它干什么用,徒增脱发??



* * *



### []( )由1引出, 抽象类的用法:因为不能被实体化,所以这个抽象类,只能被继承。



![在这里插入图片描述](https://img-blog.csdnimg.cn/890102267f3f497486698f043c53483c.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



![在这里插入图片描述](https://img-blog.csdnimg.cn/450b69ff93ff43df9adc0fab11e210d7.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

另外:继承抽象类的普通类当中 **需要重写所有的抽象方法**,上面重写一个,只是因为 被abstract修饰的方法只有一个,



* * *



### []( )抽象类是可以 向上转型的



![在这里插入图片描述](https://img-blog.csdnimg.cn/4a4774b8d9b64964b052a2692a2e575d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



### []( )抽象类可以向上转型,就意味着能发生动态绑定、加上重写,就能形成多态。



![在这里插入图片描述](https://img-blog.csdnimg.cn/df8a6790f92d475384e9f651b77aa702.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



#### []( )而且 前面说的成员变量和方法都能继承过来,并且使用



![在这里插入图片描述](https://img-blog.csdnimg.cn/29daa3ed52124c85a4b2ee1cdd959437.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



### []( )一个抽象类A,如果继承了另一个抽象类B,那么抽象类A可以不实现抽象类B的抽象方法。



![在这里插入图片描述](https://img-blog.csdnimg.cn/9794a59c81c443258c0646af56811228.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_19,color_FFFFFF,t_70,g_se,x_16)



* * *



### []( )俗话说的好,躲得了一时,躲不了一世,如果 继承了抽象类Shape的抽象类A,被一个普通类继承,你需要实现 抽象类A 和 B。两者的抽象方法。



![在这里插入图片描述](https://img-blog.csdnimg.cn/4823b49b8b9b439fbc63ee2740582a63.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



![在这里插入图片描述](https://img-blog.csdnimg.cn/e47620dbaf1e4d8683b7837f0b546672.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



### []( )抽象类 不能被 final修饰



![在这里插入图片描述](https://img-blog.csdnimg.cn/dac2f5b953e64d7f85ccb5b3c7f71148.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

既然知道了 抽象类不能被 final修饰的原理,那么由此推论出:抽象方法也不可以被 final修饰。.  

![在这里插入图片描述](https://img-blog.csdnimg.cn/4d49a688b1c54b09a916ccbca2069664.png)



* * *



[]( )总结

-----------------------------------------------------------------



   

1\. 包含抽象方法的类,叫做抽象类  

   

2\. 什么是抽象方法,一个没有具体实现的方法,被 abstract 所修饰。  

   

3\. 抽象类是不可以被实例化(不能 new)  

   

4\. 由于抽象类不能实体化,所以,抽象类只能被继承  

   

5\. 抽象类当中,也可以包含和普通类一样的成员和方法  

   

6\. 一个普通类,继承了一个抽象类,那么这个普通类当中,**需要重写  

   

所有的抽象方法。**  

   

7\. 抽象类的最大的作用,就是为了被继承。  

   

8\. 一个抽象类A,如果继承了另一个抽象类B,那么抽象类A可以不实现  

   

抽象类B的抽象方法。  

   

9\. 结合第8点,当A类 再次被一个普通类所继承后,那么 A 和 B 两个  

   

抽象类当中的抽象方法,必须被重写。  

   

10\. 抽象类 不能被 final修饰,那么由此推论出:抽象方法也不可以被  

   

final修饰。  

   

11.抽象方法不能是 private 的  

   

12.抽象类中可以包含其他的非抽象方法, 也可以包含字段. 这个非抽象  

   

方法和普通方法的规则都是一样的, 可以被重写,也可以被子类直接调  

   

用.



* * *



### []( )抽象类的作用



> 抽象类存在的最大意义就是为了被继承.  

> 抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法.



> 有些朋友可能会说了, 普通的类也可以被继承呀, 普通的方法也可以被重写呀, 为啥非得用抽象类和抽象方法呢?  

> 确实如此. 但是使用抽象类相当于多了一重编译器的校验(如果你没有重写抽象方法,编译器会报错,提醒你)



* * *



&ensp;



[]( )接口

=================================================================



> 接口是抽象类的更进一步. 抽象类中还可以包含非抽象方法, 和字段. 而接口中包含的方法都是抽象方法, 字段只能包含  

> 静态常量.



* * *



[]( )语法规则

-------------------------------------------------------------------



> 在刚才的打印图形的示例中, 我们的父类 Shape 并没有包含别的非抽象方法, 也可以设计成一个接口  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/2f20d365a2b648b891879795f8982b6a.png)  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/dc5d3a3690ad48a1bb9b4209044c02f5.png)



* * *



[]( )接口当中,普通方法不能有具体的方法实现。

-----------------------------------------------------------------------------------



![在这里插入图片描述](https://img-blog.csdnimg.cn/f5052ac443e94533818fd32974a1099c.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_16,color_FFFFFF,t_70,g_se,x_16)  

如果非要有实现具体方法,也行在方法前面加上 default修饰,表示 该方法是此接口的默认方法。  

![在这里插入图片描述](https://img-blog.csdnimg.cn/dcbca590fc3b4331a6a26b8e406a21b2.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_15,color_FFFFFF,t_70,g_se,x_16)



* * *



### []( )凡事都有例外:接口当中,静态方法可以有具体的实现。(静态方法也是不能重写的)



![在这里插入图片描述](https://img-blog.csdnimg.cn/9c96033b60dd448cba0425897e96549f.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_16,color_FFFFFF,t_70,g_se,x_16)  

由此得出结论:接口当中的方法(静态,和 默认),只能通过 接口的引用来调用。



* * *



[]( )不知有没有细心的人发现上面程序程序中 修饰方法的关键字public都是灰色的,意味着在接口当中,所有的方法都默认是public。

-------------------------------------------------------------------------------------------------------------------------------



![在这里插入图片描述](https://img-blog.csdnimg.cn/dbbf368af6b24c21b2a0d34a063a351d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_18,color_FFFFFF,t_70,g_se,x_16)



* * *



[]( )上面说到接口是 抽象类的进一步抽象。那么接口可不可以实例化?

---------------------------------------------------------------------------------------------



![在这里插入图片描述](https://img-blog.csdnimg.cn/02c9126b5ceb4307bae9a1ddb9821897.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_16,color_FFFFFF,t_70,g_se,x_16)



* * *



[]( )接口的使用

--------------------------------------------------------------------



![在这里插入图片描述](https://img-blog.csdnimg.cn/f98c6d8be3b945f5ac2eb8603b1a85dd.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



[]( )由上个点得出的结论:如果一个类实现了接口,那么这个类就需要 重写 接口当中抽象方法,默认 和 static 的方法,不需要重写

------------------------------------------------------------------------------------------------------------------------------



![在这里插入图片描述](https://img-blog.csdnimg.cn/4b14fcd9d8064793941539103a059518.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_12,color_FFFFFF,t_70,g_se,x_16)



* * *



### []( )上个点说到, 默认 和 static 的 方法 是不需要重写,但是 默认的方法,想要重写,还是能被重写的。但是static的方法不能被重写,因为它本来就不能被重写,



![在这里插入图片描述](https://img-blog.csdnimg.cn/98dd05a44d6e4123ab9100b4aa0b7f90.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



[]( )接口虽然不能实例化,但是能通过实例化有关系类的对象(这个对象是来实现接口的),达到向上转型。(在调用的时候同样可以创建一个接口的引用, 对应到一个子类的实例)

----------------------------------------------------------------------------------------------------------------------------------------------



![在这里插入图片描述](https://img-blog.csdnimg.cn/8bc002de852e4ce59aa251db71624fea.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



### []( )效果图



![在这里插入图片描述](https://img-blog.csdnimg.cn/89f4d55aafd143be9d593e4c5c8f9409.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_16,color_FFFFFF,t_70,g_se,x_16)



* * *



[]( )既然可以被重写,那么 意味着接口也能是多态

------------------------------------------------------------------------------------



![在这里插入图片描述](https://img-blog.csdnimg.cn/f982807f66cb4357be0775017fa83197.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



[]( )接口中只能包含抽象方法. 对于字段来说,接口中只能包含静态常量(static final)

------------------------------------------------------------------------------------------------------------



![在这里插入图片描述](https://img-blog.csdnimg.cn/26623986c1a24b67892029d75ed9e4cc.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_17,color_FFFFFF,t_70,g_se,x_16)



* * *



[]( )既然知道了,接口当中的属性和方法,写法上可以省略。那么现在我们再来实现一下,子类重写方法。

------------------------------------------------------------------------------------------------------------



![在这里插入图片描述](https://img-blog.csdnimg.cn/8139de223d2e4870b5b644545b5a48cd.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_18,color_FFFFFF,t_70,g_se,x_16)



* * *



![在这里插入图片描述](https://img-blog.csdnimg.cn/0eb9ec4647b0475c832c15fb949513a4.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_18,color_FFFFFF,t_70,g_se,x_16)



* * *



[]( )一个类可以继承多个接口

--------------------------------------------------------------------------



![在这里插入图片描述](https://img-blog.csdnimg.cn/9ef71e5581844de69852f9e8b570d9db.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



![在这里插入图片描述](https://img-blog.csdnimg.cn/15c2937df3614831baa0a73595a920d4.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



[]( )在一个类继承另一个类/抽象类的时候(但只能继承一个类,这个前篇文章讲过),还可以继承多个接口。只不过继承了抽象类,需要重写抽象类当中的抽象方法

--------------------------------------------------------------------------------------------------------------------------------------



![在这里插入图片描述](https://img-blog.csdnimg.cn/888e96859d81487b9b859afe1ed712f1.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



[]( )既然 类与类之间,类与接口之间 都是能够被继承的,那么接口与接口之间,又有什么关系?能否被继承?

---------------------------------------------------------------------------------------------------------------



![在这里插入图片描述](https://img-blog.csdnimg.cn/c107ac2259ff451ea35e4763422d0a26.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

接口与接口之间,可以使用 extends来 操作它们的关系,此时,extends 在这里意为 拓展。(一个接口A 通过 extends 来拓展 另一个接口B的功能,此时当一个类 通过 implements 实现 接口A,此时重写的方法,不仅仅是 A 的抽象方法,还有从B接口,拓展来的功能【方法】)



* * *



[]( )实践



### 最后

**为什么我不完全主张自学?
①**平台上的大牛基本上都有很多年的工作经验了,你有没有想过之前行业的门槛是什么样的,现在行业门槛是什么样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。
②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。
如果说你认为你的目标十分明确,能做到第②点所说的几个点,以目前的市场来看,你才真正的适合去自学。

除此之外,对于绝大部分人来说,报班一定是最好的一种快速成长的方式。但是有个问题,现在市场上的培训机构质量参差不齐,如果你没有找准一个好的培训班,完全是浪费精力,时间以及金钱,这个需要自己去甄别选择。

我个人建议线上比线下的性价比更高,线下培训价格基本上没2W是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:
①价格:线上的价格基本上是线下的一半;
②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。

**应该学哪些技术才能达到企业的要求?(下图总结)**

![](https://img-blog.csdnimg.cn/img_convert/bf8914105b296fdea5d56b87e8837563.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/fc266bdc825590bfd10afc2d35a1d37d.webp?x-oss-process=image/format,png)





**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)**
![img](https://img-blog.csdnimg.cn/img_convert/b8f673dd86c139614b60b40ac1963e9f.jpeg)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。
如果说你认为你的目标十分明确,能做到第②点所说的几个点,以目前的市场来看,你才真正的适合去自学。

除此之外,对于绝大部分人来说,报班一定是最好的一种快速成长的方式。但是有个问题,现在市场上的培训机构质量参差不齐,如果你没有找准一个好的培训班,完全是浪费精力,时间以及金钱,这个需要自己去甄别选择。

我个人建议线上比线下的性价比更高,线下培训价格基本上没2W是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:
①价格:线上的价格基本上是线下的一半;
②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。

**应该学哪些技术才能达到企业的要求?(下图总结)**

[外链图片转存中...(img-uN4WGoHO-1713567659295)]

[外链图片转存中...(img-LSlGc0Nz-1713567659296)]





**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)**
[外链图片转存中...(img-vA72MkJ9-1713567659296)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值