zoukankan      html  css  js  c++  java
  • java回顾之多态、内部类、权限修饰符、代码块

    java回顾之多态、内部类、权限修饰符、代码块

    一、多态

    1.1、多态的概念

      一个对象可以表现多种形态,这就叫做是多态,比如:我们可以说猫是一只猫,我们也可以说猫是一个动物

      java中多态的前提

      要有继承extends或者实现implement关系

      体现多态要有方法重写

      要有父类引用指向子类对象

    实例代码:

    //创建对象
    Cat c=new Cat();
    //要有父类引用指向子类对象
    Animal a=new Cat();
    

    1.2、多态的成员访问特点

      成员变量

        编译看左边(父类),运行看左边(父类)

    (这个意思就是,当写代码的时候,用到的变量都是父类的变量,运行的时候也是父类的变量)

      成员方法

        编译看左边(父类)、运行看右边(子类)

      (这个意思就是,用到的方法,父类中要有,运行的话其实是子类中重写的父类的方法)

    //动物
    public class Animal {
    
        String name = "123";
    
        public void method(){
            System.out.println("父类的方法");
        }
    }
    
    //猫
    public class Cat extends Animal{
    
        String name = "321";
    
        public void method(){
            System.out.println("子类的方法");
        }
    }
    
    public class Demo {
        public static void main(String[] args) {
    
            //创建对象
            Cat c = new Cat();
    
            //要有父类引用指向子类对象
            Animal a = new Cat();
    
            //编译看左边(父类),运行看左边(父类)
            System.out.println(a.name);
    
            //编译看左边(父类), 运行看右边(子类)
            a.method();
        }
    }
    

    1.3、多态的好处和弊端

    弊端:

      多态情况下,不能调用子类的特有方法

      因为父类中没有子类的特有方法,编译就没有办法编译

    好处:

      提高了代码的扩展性

    比如吃饭一个方法,参数是类型
    
    public static void method(Cat c){
    
    这代表猫吃饭,但是如果传过来一个狗,这个方法就接不了参数,因为类型不同,就需要再写一个吃的方法,参数中定义的是Dog d
    
    }
    
    public static void method(Dog d){ 
    
    但是如果有多态,可以将参数这写成动物接口,然后所有的类来实现动物
    }
    
    //使用多态
    //一个方法可以接受任意动物的子类,这个方法提高了代码扩展性
    public static void method(Animal a){ 
    //相当于 Animal a = new Cat(); // Aniaml a = new Dog(); } } 

    这样就可以节省代码,接收参数更灵活

    1.3多态的转型

    向上转型

    把子类类型转成父类类型

    Animal a = new Cat();    //把Cat类型转成Animal类型

    向下转型

    把父类类型转成子类类型

    //子类类型 变量名 = (子类类型)父类类型对象;
    Cat c = (Cat) a;

    作用:
    为了调用子类的特有方法

    2.内部类

      2.1分类

      成员内部类

      局部内部类

          匿名内部类

      2.2成员内部类

      定义在类中方法外的内部类就是成员内部类

      创建对象的方式

      外部类名.内部类名  变量名=new 外部类().new 内部类();

      变量重名时的访问

      访问外部类的成员变量

      外部类名.this.变量名

      2.3局部内部类

      定义在方法中的内部类就是局部内部类

      局部内部类没什么大作用,因为局部限制了他的使用范围,只能在当前方法中使用,所以这个东西真没什么使用场景

      在局部内部类中访问了外部类的局部变量,那么这个变量就变成了final变量,不能被修改。

      2.4匿名内部类

      没有类名的内部类就是匿名内部类

      格式:

      new 类名/接口名(){

        方法重写

      };

      写法二:调用方法

    method(new Animal(){
        @Override
        public void eat() {
            System.out.println("匿名内部类吃饭方法");
        }
    });

    三、权限修饰符

    四、代码块

    4.1、静态代码块

    static{
    要执行的代码
    }

    执行时机

    在当前类第一次被使用的时候静态代码块会执行,且只执行一次

    如果有些代码只需要执行一次且需要在别的代码之前执行,就可以放在静态代码块中,比如加载驱动。

    4.2、构造代码块

    在类中方法外:
    {
    里面可以写代码;
    }

    在构造方法执行的最开始先执行构造代码块

    多个构造方法中有相同的代码,为了提高代码复用性,可以把相同的代码抽取到构造代码块中

  • 相关阅读:
    选择排序
    UVA 10142 Australian Voting(模拟)
    Android Intent 其中一个分析
    leetcode先刷_Merge Two Sorted Lists
    图片缓存负载
    c/c++ 基金会(七) 功能覆盖,虚函数,纯虚函数控制
    Petroglyph访问:中间件游戏
    Cocos2d-x3.0 文件处理
    Qt5官方demo分析集29——Extending QML
    [Phonegap+Sencha Touch] 移动开发34 gem安装compass,不编译scss,怎么办?
  • 原文地址:https://www.cnblogs.com/gushiye/p/13740266.html
Copyright © 2011-2022 走看看