• J-10 面向对象


    摘要:
    final关键字;
    多态;
    接口;
    形式参数和返回值问题;

    十七、final关键字

    • 特点:
      ①final修饰类:该类不能被继承。

      • 错误提示:无法从最终Fu进行集成
        ②final修饰方法:该方法不能被重写(覆盖,复写)。
      • 错误提示:Zi中的show()无法覆盖Fu中的show()
        ③final修饰变量:该变量不能被重新赋值,因为这个变量是常量。
      • 错误提示:无法为最终变量num2分配值。
    • final修饰局部变量
      ①局部变量是基本类型:基本类型的值不能发生改变
      ②局部变量是引用类型:引用类型的地址值不能发生改变,但是该对象的堆内存的值是可以改变的。

    • final修饰变量的初始化时机
      ①被final修饰的变量只能赋值一次。
      ②在构造方法完毕前。(非静态的常量)

    十八、多态

    多态概述

    同一个对象,在不同时刻表现出来的状态。例:猫是猫,猫是动物。

    • 多态的前提:
      ①要有继承关系。
      ②要有方法重写。
      ③要有父类引用指向子类对象。

        父类 f = new 子类();
      
    • 分类

      • 集体类多态
      • 抽象类多态(常用)
      • 接口多态(最常用)
    • 成员访问的特点:

      • 成员变量:
        编译看左边;运行看左边。
      • 构造方法:
        创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
      • 成员方法:(因为方法重写时,父类方法被子类方法覆盖)
        编译看左边;运行看右边。
      • 静态方法:(静态和类相关,算不上重写,所以访问的还是左边)
        编译看左边;运行看右边。
    • 好处
      ①提高了代码的维护性(继承保证)
      ②提高了代码的扩展性(多态保证)

    • 弊端
      不能使用子类的特有功能。只能调用父类定义的方法。

      • 解决方案:
        • 创建子类对象,调用子类方法。(可以用,但不合理,且占内存。)
        • 把子类的引用强制转换为子类的引用。(向下转型)

    对象间的转型问题

    • 向上转型:从子到夫,父类引用指向子类对象。

        	Fu f = new zi();
      
    • 向下转型:从父到子,父类引用转为子类对象。

        	Zi z = (Zi) f;     //要求该f必须是能够转换成Zi的。
      

    十九、抽象类

    抽象类概述

    • 定义:
      在java中,一个没有方法体(区别于空方法体)的方法应该定义为抽象方法;而类中如果有抽象方法,该必须定义为抽象类。

    • 格式:

        abstract class 类名{}
      
    • abstract关键字注意事项
      abstract与private、final关键字 冲突。(ERROR:非法的修饰符组合)
      abstract与static关键字 无意义

    抽象类的特点

    • 抽象类和抽象方法必须用abstract关键字修饰

    • 抽象类中不一定有抽象方法,但有抽象方法的类必须定义为抽象类。

    • 抽象类不能实例化(可以通过多态的方式进行实例化)。抽象方法有构造方法,构造方法的作用是用于子类访问父类数据的初始化。

    • 抽象类的子类
      ① 子类是抽象类
      ② 子类是具体类,重写抽象方法。

    成员特点

    • 成员变量:既可以是变量,也可以是常量。

    • 构造方法:有。用于子类访问父类数据的初始化。

    • 成员方法:
      ①抽象方法:强制要求子类做的事情
      ②非抽象方法:子类继承的事情,提高代码复用性

    二十、接口

    接口概述

    扩展性

    接口的特点

    • 关键字:interface

    • 格式:

        interface 接口名{}
      
    • 类实现接口:

        class 类名 implements 接口名{}
      

    接口实现类名格式:接口名+Impl

    • 接口不能实例化。按照多态的方式进行实例化。
    • 接口的子类
      ①抽象类 -----> 意义不大。
      ②具体类 -----> 重写接口中的所有抽象方法。(推荐)

    接口成员特点

    • 成员变量:只能是常量
      默认修饰符:public static final

    • 构造方法:没有。因为接口是拓展功能的,没有具体存在。

    • 成员方法:只能是抽象方法,没有方法体。
      默认修饰符:public abstract

    接口实例

    /*
    	接口成员特点
    		成员变量;只能是常量,并且是静态的。
    				默认修饰符:public static final
    				建议:自己手动给出。
    		构造方法:接口没有构造方法。
    		成员方法:只能是抽象方法。
    				默认修饰符:public abstract
    				建议:自己手动给出。
    		
    	所有的类都默认继承自一个类:Object。
    	类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。
    */
    interface Inter {
    	public int num = 10;
    	public final int num2 = 20;
    	public static final int num3 = 30;
    	
    	//错误: 需要<标识符>
    	//public Inter() {}
    	
    	//接口方法不能带有主体
    	//public void show() {}
    
    	//abstract void show(); //默认public
    	public void show(); //默认abstract
    }
    
    //接口名+Impl这种格式是接口的实现类格式
    /*
    class InterImpl implements Inter {
    	public InterImpl() {
    		super();
    	}
    }
    */
    
    class InterImpl extends Object implements Inter {
    	public InterImpl() {
    		super();
    	}
    	
    	public void show() {}
    }
    
    //测试类
    class InterfaceDemo2 {
    	public static void main(String[] args) {
    		//创建对象
    		Inter i = new InterImpl();
    		System.out.println(i.num);
    		System.out.println(i.num2);
    		//i.num = 100;
    		//i.num2 = 200;
    		//System.out.println(i.num); //无法为最终变量num分配值
    		//System.out.println(i.num2);//无法为最终变量num2分配值
    		System.out.println(Inter.num);
    		System.out.println(Inter.num2);
    		System.out.println("--------------");
    	}
    }
    

    区别关系

    • 类与类:
      继承关系,只能单继承,可以多层继承。

    • 类与接口:
      实现关系,可以单实现,也可以多实现。
      可以在继承一个类的同时实现多个接口。

    • 接口与接口:
      继承关系,可以单继承,也可以多继承。

      • 实例:

           interface Father {
           	public abstract void show();
           }
           
           interface Mother {
           	public abstract void show2();
           }
           interface Sister extends Father,Mother {
           
           }
           
           //class Son implements Father,Mother //多实现
           class Son extends Object implements Father,Mother {
           	public void show() {
           		System.out.println("show son");
           	}
           	
           	public void show2() {
           		System.out.println("show2 son");
           	}
           }
           
           class InterfaceDemo3 {
           	public static void main(String[] args) {
           		//创建对象
           		Father f = new Son();
           		f.show();
           		//f.show2(); //报错
           	
           		Mother m = new Son();
           		//m.show(); //报错
           		m.show2();
           	}
           }
        

    抽象类与接口的区别

    • 成员区别

      • 抽象类:
        成员变量:变量,常量
        构造方法:有
        成员方法:抽象,非抽象

      • 接口:
        成员变量:常量
        构造方法:无
        成员方法:抽象

    • 关系区别

      • 类与类:
        继承关系,只能单继承,可以多层继承。

      • 类与接口:
        实现关系,可以单实现,也可以多实现。

      • 接口与接口:
        继承关系,可以单继承,也可以多继承。

    • 设计理念区别

      • 抽象类 被继承体现的是:"is a"的关系。抽象类中定义的是该继承体系的共性功能。

      • 接口 被实现体现的是:"like a"的关系。接口中定义的是该继承体系的扩展功能。

    二十一、形式参数和返回值问题

    形式参数

    基本类型

    应用类型

    • 类名
      需要的是该类的对象

               StudentDemo sd = new StudentDemo();
        Student ss = new Student();
        sd.method(ss);
      
    • 抽象类
      需要的是该类的子类对象

        PersonDemo pd = new PersonDemo();
        Person p = new Student();
        pd.method(p);
      
    • 接口
      需要的是该接口的实现类对象

                LoveDemo ld = new LoveDemo();
        Love l = new Teacher();
        ld.method(l);  
      

    返回值

    基本类型

    应用类型

    • 类名
      返回的是该类的对象

    • 抽象类
      返回的是该抽象类的子类的对象

    • 接口
      返回的是该接口的实现类的对象。

  • 相关阅读:
    Day15模块(导入,使用)
    day14 迭代器,生成器,函数的递归调用
    Day13有参装饰器,三元表达式,匿名函数
    re模块
    Day12装饰器
    subprocess模块windows系统命令和linux系统命令
    Day11名称空间,作用域,闭包函数
    识别 Linux上的设备(磁盘)类型
    Linux lsblk和df命令区别
    Linux远程拷贝scp
  • 原文地址:https://www.cnblogs.com/android-lyz/p/4773669.html
Copyright © 2020-2023  润新知