文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么理解Java面向对象三大特性

2023-06-02 18:22

关注

这篇文章主要讲解了“怎么理解Java面向对象三大特性”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Java面向对象三大特性”吧!

继承

Java中的继承只能单继承,但是可以通过内部类继承其他类来实现多继承。

public class Son extends Father{public void go () {System.out.println("son go");}public void eat () {System.out.println("son eat");}public void sleep() {System.out.println("zzzzzz");}public void cook() {//匿名内部类实现的多继承new Mother().cook();//内部类继承第二个父类来实现多继承Mom mom = new Mom();mom.cook();}private class Mom extends Mother {@Overridepublic void cook() {System.out.println("mom cook");}}}

封装

封装主要是因为Java有访问权限的控制。public > protected > package = default > private。封装可以保护类中的信息,只提供想要被外界访问的信息。

类的访问范围

A、public包内、包外,所有类中可见B、protected包内所有类可见,包外有继承关系的子类可见(子类对象可调用)C、(default)表示默认,不仅本类访问,而且是同包可。D、private仅在同一类中可见

多态

多态一般可以分为两种,一个是重写overwrite,一个是重载override。

重写是由于继承关系中的子类有一个和父类同名同参数的方法,会覆盖掉父类的方法。重载是因为一个同名方法可以传入多个参数组合。注意,同名方法如果参数相同,即使返回值不同也是不能同时存在的,编译会出错。从jvm实现的角度来看,重写又叫运行时多态,编译时看不出子类调用的是哪个方法,但是运行时操作数栈会先根据子类的引用去子类的类信息中查找方法,找不到的话再到父类的类信息中查找方法。
 而重载则是编译时多态,因为编译期就可以确定传入的参数组合,决定调用的具体方法是哪一个了。

向上转型和向下转型的解释 :

public static void main(String[] args) {        Son son = new Son();        //首先先明确一点,转型指的是左侧引用的改变。        //father引用类型是Father,指向Son实例,就是向上转型,既可以使用子类的方法,也可以使用父类的方法。        //向上转型,此时运行father的方法        Father father = son;        father.smoke();        //不能使用子类独有的方法。        // father.play();编译会报错        father.drive();        //Son类型的引用指向Father的实例,所以是向下转型,不能使用子类非重写的方法,可以使用父类的方法。        //向下转型,此时运行了son的方法        Son son1 = (Son) father;        //转型后就是一个正常的Son实例        son1.play();        son1.drive();        son1.smoke();        ```        //因为向下转型之前必须先经历向上转型。        //        在向下转型过程中,分为两种情况:        //        //        情况一:如果父类引用的对象如果引用的是指向的子类对象,        //        那么在向下转型的过程中是安全的。也就是编译是不会出错误的。            //因为运行期Son实例确实有这些方法            Father f1 = new Son();            Son s1 = (Son) f1;            s1.smoke();            s1.drive();            s1.play();        //        情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,        //        但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。        //因为运行期Father实例并没有这些方法。            Father f2 = new Father();            Son s2 = (Son) f2;            s2.drive();            s2.smoke();            s2.play();        //向下转型和向上转型的应用,有些人觉得这个操作没意义,其实可以用于方法参数中的类型聚合,然后具体操作再进行分解。        //比如add方法用List引用类型作为参数传入,传入具体类时经历了向下转型        add(new LinkedList());        add(new ArrayList());        //总结        //向上转型和向下转型都是针对引用的转型,是编译期进行的转型,根据引用类型来判断使用哪个方法        //并且在传入方法时会自动进行转型(有需要的话)。运行期将引用指向实例,如果是不安全的转型则会报错。        //若安全则继续执行方法。    }    public static void add(List list) {        System.out.println(list);        //在操作具体集合时又经历了向上转型//        ArrayList arr = (ArrayList) list;//        LinkedList link = (LinkedList) list;    }

总结:
向上转型和向下转型都是针对引用的转型,是编译期进行的转型,根据引用类型来判断使用哪个方法。并且在传入方法时会自动进行转型(有需要的话)。运行期将引用指向实例,如果是不安全的转型则会报错,若安全则继续执行方法。

编译期的静态分派:其实就是根据引用类型来调用对应方法。

public static void main(String[] args) {    Father father  = new Son();    静态分派 a= new 静态分派();    //编译期确定引用类型为Father。    //所以调用的是第一个方法。    a.play(father);    //向下转型后,引用类型为Son,此时调用第二个方法。    //所以,编译期只确定了引用,运行期再进行实例化。    a.play((Son)father);    //当没有Son引用类型的方法时,会自动向上转型调用第一个方法。    a.smoke(father);    //    }public void smoke(Father father) {    System.out.println("father smoke");}public void play (Father father) {    System.out.println("father");    //father.drive();}public void play (Son son) {    System.out.println("son");    //son.drive();}

方法重载优先级匹配

public static void main(String[] args) {        方法重载优先级匹配 a = new 方法重载优先级匹配();        //普通的重载一般就是同名方法不同参数。        //这里我们来讨论当同名方法只有一个参数时的情况。        //此时会调用char参数的方法。        //当没有char参数的方法。会调用int类型的方法,如果没有int就调用long        //即存在一个调用顺序char -> int -> long ->double -> ..。        //当没有基本类型对应的方法时,先自动装箱,调用包装类方法。        //如果没有包装类方法,则调用包装类实现的接口的方法。        //最后再调用持有多个参数的char...方法。        a.eat('a');        a.eat('a','c','b');    }    public void eat(short i) {        System.out.println("short");    }    public void eat(int i) {        System.out.println("int");    }    public void eat(double i) {        System.out.println("double");    }    public void eat(long i) {        System.out.println("long");    }    public void eat(Character c) {        System.out.println("Character");    }    public void eat(Comparable c) {        System.out.println("Comparable");    }    public void eat(char ... c) {        System.out.println(Arrays.toString(c));        System.out.println("...");    }//    public void eat(char i) {//        System.out.println("char");//    }

感谢各位的阅读,以上就是“怎么理解Java面向对象三大特性”的内容了,经过本文的学习后,相信大家对怎么理解Java面向对象三大特性这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯