最后是今天给大家分享的一些独家干货:
【Android开发核心知识点笔记】
【Android思维脑图(技能树)】
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【Android高级架构视频学习资源】
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
==
在最初学习Java的时候,我们都听到过一句话,Java是面向对象语言。每当提到面向对象的时候,许多开发者也嗤之以鼻:都什么年代了,谁还不知道面向对象。
重学设计模式后,请回答,你真的面向对象了吗?
你真的了解面向对象吗
==========
一般情况下,我们会将面向对象的特性分为四大特性,分别是:封装、抽象、继承、多态。以这四大特性作为代码设计规范的编程风格我们一般称之为面向对象编程。
我们都知道Java语言是面向对象语言,那么用Java语言实现的代码就是面向对象编程吗?答案是否定的。在了解这个原因之前,首先我们需要需要知道面向对象四大特性分别可以解决什么问题。
封装
–
封装特性说白了就是数据访问限制或者叫数据访问保护,这一特性需要依赖语言本身具有访问权限机制。比如在Java中 使用private、public、protect等修饰符修复变量来控制变量读、写的权限控制,这一点是最容易被开发者忽略也是开发者最不在意或者容易使用错误的一点。这一点我们后续会详细讲解。
抽象
–
抽象特性主要用来隐藏方法的具体实现。也有一种说法将上面提到的四大特性中的抽象这一特性排除在外,这是因为函数本身就是一种抽象,函数内部包含具体的实现逻辑对调用者来说是不需要关注具体实现方式的。在Java语言中除了函数本身,通常使用interface接口和abstract抽象关键字来实现,抽象更像是一种理论指导,许多代码设计原则都是基于抽象理论来实现的。
举个具体的例子🌰,在Android开发中我们经常会使用到地图业务,以使用百度地图为例,开发者可能为了模块的通用性,会定义一系列的接口,代码如下所示:
public interface BaiduMapApi {
/**
* 加载地图
*/
void loadBaiduMap();
/**
* 销毁地图
*/
void destoryBaiduMap();
}
按照抽象特性和代码设计原则来说,其实这套设计是有些瑕疵的。抽象要将具体实现隐藏起来,如果以后业务中的百度地图更改成了高德地图,那么这一套接口命名设计就会产生歧义。并且可能会为后人埋坑。
较为合理的设计代码如下所示:
public interface MapApi {
/**
* 加载地图
*/
void loadMap();
/**
* 销毁地图
*/
void destoryMap();
}
这样一来,接口的设计遵循了抽象原则,更便于开发者后续的扩展和维护。
继承
–
继承用来表示类之间is-a的关系,比如:猫是动物、狗是动物,动物都会吃饭、睡觉,我们则会创建一个动物类,代码如下所示:
public class Animal {
private void eat(){
System.out.println(“–eat–”);
}
private void sleep(){
System.out.println(“–eat—”);
}
}
然后再创建两个子类继承自Animal类,代码如下所示:
public class Brid extends Animal{
@Override
public void eat() {
super.eat();
}
@Override
public void sleep() {
super.sleep();
}
}
public class Dog extends Animal{
@Override
public void eat() {
super.eat();
}
@Override
public void sleep() {
super.sleep();
}
}
继承的最大好处就是实现代码复用,Java语言中一个类是无法继承多个父类的,那么原因是什么呢?这是因为继承多个问题会出现”钻石问题“,感兴趣的可自行了解,这里不做过多解释了。
继承虽然可以实现代码复用,但是过度使用继承会导致嵌套过深,代码难以阅读和维护,所以在设计原则中也会说组合方式优于继承。
多态
–
接着来看最后一个特性:多态。多态是许多设计模式和设计原则实现的基础,比如常用的策略模式和里式替换原则等。简单的说,多态就是子类可以替换父类,举个例子:
比如在业务中,需要提供一个方法实现设备信息打印功能,设备中类有A、B等多种,代码如下所以:
public class PrintUtil {
private void print(A a){
}
private void print(B b){
}
}
按照一般实现方式,每增加一种设备类型,都需要在PrintUtil新增一个打印方法,且逻辑都在PrintUtil类中使得难以扩展和维护。依赖多态的特性,我们可以这样来实现,首先定义一个接口,代码如下所示:
public interface PrintInterface {
void print();
}
使A、B类都继承PrintInterface接口,代码如下所示:
public class A implements PrintInterface{
@Override
public void print() {
System.out.println(“-A设备的打印-”);
}
}
public class B implements PrintInterface {
@Override
public void print() {
System.out.println(“-B设备的打印-”);
}
}
修改PrintUtil类中的方法如下所示:
public class PrintUtil {
public void print(PrintInterface printInterface) {
printInterface.print();
}
}
需要打印设备信息时,可直接采用如下方式:
public static void main(String[] args) {
PrintUtil printUtil = new PrintUtil();
A a = new A();
printUtil.print(a);
B b = new B();
printUtil.print(b);
}
这样,当增加一种设备时,我们只需要将设备类继承自PrintInterface接口,并在类内部实现自己的打印规则即可,不需要改动PrintUtil中的代码,提高了代码的可扩展性。
了解了面向对象的四大特性后,接着来看你真的面向对象了吗?
最后
想要了解更多关于大厂面试的同学可以点赞支持一下,除此之外,我也分享一些优质资源,包括:Android学习PDF+架构视频+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
6X5pm0,size_17,color_FFFFFF,t_70,g_se,x_16)
最后
想要了解更多关于大厂面试的同学可以点赞支持一下,除此之外,我也分享一些优质资源,包括:Android学习PDF+架构视频+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!