Java面向对象三大特征的理解

Java面向对象三大特征的理解面向对象三大特征的理解初始理解封装继承多态初始理解其实这些知识很早就有接触,而且一些概念也牢记于心了。自己叙述面向对象的特征会是这样的:面向对象的三大特征是封装、继承和多态。封装是对代码的封装以实现迪内聚高耦合的设计,使代码更安全且具有良好的扩展性。继承是父类产生子类的过程,子类可以使用父类的非私有的属性和方法。多态是一个对象在不同时刻可以表现出不同状态的现象。外加Animal和Cat的例子。这一段时间敲了不少的Java代码,在敲代码的过程中想了无数次的面向对象这几个概念,对他们有了更深的了解,在这

大家好,又见面了,我是你们的朋友全栈君。

面向对象三大特征的理解

初始理解

其实这些知识很早就有接触,而且一些概念也牢记于心了。自己叙述面向对象的特征会是这样的:
面向对象的三大特征是封装、继承和多态。封装是对代码的封装以实现迪内聚高耦合的设计,使代码更安全且具有良好的扩展性。继承是父类产生子类的过程,子类可以使用父类的非私有的属性和方法。多态是一个对象在不同时刻可以表现出不同状态的现象。外加Animal和Cat的例子。
这一段时间敲了不少的Java代码,在敲代码的过程中想了无数次的面向对象这几个概念,对他们有了更深的了解,在这里分享一下。

封装

封装确实是对代码的封装,但是只是这样理解却又太肤浅了,至少结合Java来思考一下里面的封装嘛。
不知道大家有没有想过我们在写JavaBean的时候为什么要将属性的权限修饰为private,其实是为了使我们的代码更安全。分析如下:

public class Cat { 
   
    //这里通过private修饰属性,外界访问属性需要通过getter和setter方法
    private String name;
    private int age;
    public String getName() { 
   
        return name;
    }
    public void setName(String name) { 
   
        this.name = name;
    }
    public int getAge() { 
   
        return age;
    }
    //假设我们设置age,如果用户恶意将age设置为100
    //众所周知,impossible,因此我们可以通过setter方法进行if判断然后再赋值
    public void setAge(int age) { 
   
        this.age = age;
    }
}
我们可以考虑一下如果没有setter方法的判断,我们将该类的属性设置为public呢?那么用户的恶意输入,怎样规避呢?
总之:private是封装的一种体现。

封装还有其他的方法:为了提高代码的复用性可以将公共逻辑抽取成方法,将公共属性抽取成类。例如我们在不同的位置用到了相同的for循环,在idea中我们就可以选中相同的for循环部分,点击快捷键 ctrl + alt + m 将其抽取为方法。

继承

继承是面向对象的三大特征之一,过程就是使子类获得父类的属性和方法。
这个过程较容易理解,关键字是extends,如果我们定义的类没有显式继承某个类,系统默认为我们继承Objects。继承是我们代码的coding量变少了,提高了代码的复用性。
这里更深的体会是继承提高了代码的维护性。主要表现就是如果方法的代码需要修改,某些情况下我们只需要修改一处就可以实现。
但是这里还有一点没有想通的继承肯定会增加代码的耦合性,我们为什么还要这样夸大继承呢?我有这种疑问就是陷入了一个思维的误区,可以看这篇文章来解疑:为耦合辩护,为继承伸冤

多态

多态的三个必要条件是:

  1. 有继承或实现关系
  2. 有方法的重写
  3. 父类引用指向子类对象
class Fu { 
   
    int num = 10;
    public void method(){ 
   
        System.out.println("Fu.. method");
    }
}
class Zi extends Fu { 
   
    int num = 20;
    public void method(){ 
   
        System.out.println("Zi.. method");
    }
}
public class Test2Polymorpic { 
   
    public static void main(String[] args) { 
   
        Fu f = new Zi();
        System.out.println(f.num);
        f.method();
    }
}

关于为什么访问成员变量和成员方法的会分别get父类和子类的值和方法,这里有讲解。从虚拟机角度看Java多态->(重写override)的实现原理

  1. 好处:提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作
  2. 弊端:不能使用子类的特有成员
    解决弊端可以通过向下转型:格式为子类型 对象名 = (子类型)父类引用;
class Fu { 
   
    public void show(){ 
   
        System.out.println("Fu..show...");
    }
}
class Zi extends Fu { 
   
    @Override
    public void show() { 
   
        System.out.println("Zi..show...");
    }
    public void method(){ 
   
        System.out.println("我是子类特有的方法, method");
    }
}
public class Test { 
   
    public static void main(String[] args) { 
   
        //向上转型 : 父类引用指向子类对象
        Fu f = new Zi();
        f.show();
        // 多态的弊端: 不能调用子类特有的成员
        // f.method();
        //解决方法:
        // A: 直接创建子类对象
        // B: 向下转型
        //向下转型 : 从父类类型, 转换回子类类型
        Zi z = (Zi) f;
        z.method();
    }
}

如果被转的引用类型变量,对应的实际类型和目标类型不是同一种类型,那么在转换的时候就会出现ClassCastException,可以使用instanceOf来解决。

abstract class Animal { 
   
    public abstract void eat();
}

class Dog extends Animal { 
   
    public void eat() { 
   
        System.out.println("狗吃肉");
    }

    public void watchHome(){ 
   
        System.out.println("看家");
    }
}

class Cat extends Animal { 
   
    public void eat() { 
   
        System.out.println("猫吃鱼");
    }
}

public class Test4Polymorpic { 
   
    public static void main(String[] args) { 
   
        useAnimal(new Dog());
        useAnimal(new Cat());
    }

    public static void useAnimal(Animal a){ 
   
        a.eat();
        // 判断a变量记录的类型, 是否是Dog
        if(a instanceof Dog){ 
   
            Dog dog = (Dog) a;
            dog.watchHome();
        }
    }

}

最后再来一张图体会一下多态的强大:::::
equals的参数可以是任意对象类型,这是多态的一种应用

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159992.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Unix操作系统常用命令「建议收藏」

    Unix操作系统常用命令「建议收藏」Unix操作系统常用命令一、关于档案/目录处理的命令1、ls——列目录这是最基本的档案指令。ls的意义为”list”,也就是将某一个目录或是某一个档案的内容显示出来。格式:ls-1ACFLRabcdfgilmnopqrstux-W[sv][files]ls的常用参数如下:-a:在UNIX中若一个目录或文件名字的第一个字符为…

    2022年5月20日
    74
  • 微服务——Eruka

    1、Eruka——基于HTTPREST的服务发现框架定位于AWS(亚马逊网络服务)域中的中间层服务负载均衡、中间层服务故障转移注:Eruka专门用于发现服务,一些服务将自己注册进Eruka,使另一些服务通过Eruka查找其所要调用的服务;充当服务发现服务的组件很多,如:Zookeeper、Consul、Eruka等2、Eruka架构图…

    2022年4月4日
    237
  • Java对象数组

    Java对象数组所谓的对象数组,就是指包含了一组相关的对象,但是在对象数组的使用中一定要清楚一点:数组一定要先开辟空间,但是因为其是引用数据类型,所以数组里面的每一个对象都是null值,则在使用的时候数组中的每一个对象必须分别进行实例化操作。 对象数组的声明先定义,再开辟空间类名称对象数组名[]=null;对象数组名=new类名称[长度]; 定义并开辟数组类名称对象数…

    2022年5月5日
    43
  • 儿童计算机编程课是学什么(大学计算机课程)

    当今世界已经处于数字、网络和信息的计算机时代,而计算机编程是时代发展的关键因素,学习计算机学科的编程能培养一个人的创造力,使学习者具有批判性思维技能,同时使其成为主动学习者,为此,在少儿阶段接触和学习计算机编程知识,能使我们在今后的学习和生活中,更好的理解我们所处的时代,有能力改造我们的时代,并因此而终生受益。我们专门针对少儿学习者,开设了六门计算机科学基础课程,以方便少儿计算机编程学习者能灵活、…

    2022年4月17日
    82
  • Python代码画爱心_python代码画人物

    Python代码画爱心_python代码画人物用python一行代码画出爱心print(‘\n’.join([”.join([(‘LoveSongxiaolong'[(x-y)%8]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<=0else”)forxinrange(-30,30)])foryinrange(15,-15,-1)]))结果为:…

    2022年9月4日
    2
  • 教你如何暴力破解wifii密码

    使用kalilinux系统进行wifi暴力破解获取密码注意:私自破解他人WiFi属于违法行为,本教程仅供学习与参考。破解工具破解工具:kalilinux系统 ,本教程使用的装在物理机的linux系统(虚拟机使用方法一样)。支持监听模式的无线网卡,本教材使用的是某宝购买的3070L网卡。字典文件(如果你没有字典也没有问题后面会教你如何使用cruncl创建密码文件)。…

    2022年4月8日
    74

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号