• 整理Java面向对象


    继承:

    需要注意的是 Java 不支持多继承,但支持多重继承。

    继承的特性

    1.子类拥有父类非private的属性,方法。
    2.子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
    3.子类可以用自己的方式实现父类的方法。
    4.Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类,这是java继承区别于C++继承的一个特性。
    5.提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。

    关键字

    1.final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:
    2.super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
    3.this关键字:指向自己的引用。
    4.使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
    5.在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。

    构造器

    子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
    如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

    例如:

    class SuperClass {
      private int n;
      SuperClass(){
        System.out.println("SuperClass()");
      }
      SuperClass(int n) {
        System.out.println("SuperClass(int n)");
        this.n = n;
      }
    }
    class SubClass extends SuperClass{
      private int n;
      
      SubClass(){
        super(300);
        System.out.println("SubClass");
      }  
      
      public SubClass(int n){
        System.out.println("SubClass(int n):"+n);
        this.n = n;
      }
    }
    public class TestSuperSub{
      public static void main (String args[]){
        SubClass sc = new SubClass();
        SubClass sc2 = new SubClass(200); 
      }
    }

    输出结果为:

    SuperClass(int n)
    SubClass
    SuperClass()
    SubClass(int n):200

    Java 重写(Override)与重载(Overload):


    方法的重写规则

    1.参数列表必须完全与被重写方法的相同;

    2.返回类型必须完全与被重写方法的返回类型相同;

    3.访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。

    4.父类的成员方法只能被它的子类重写。

    5.声明为final的方法不能被重写。

    6.声明为static的方法不能被重写,但是能够被再次声明。

    7.子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。

    8.子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。

    9.重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。

    10.构造方法不能被重写。

    11.如果不能继承一个方法,则不能重写这个方法。

    重载(Overload)

    重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。

    每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。

    最常用的地方就是构造器的重载。

    重载规则:

    被重载的方法必须改变参数列表(参数个数或类型不一样);

    被重载的方法可以改变返回类型;

    被重载的方法可以改变访问修饰符;

    被重载的方法可以声明新的或更广的检查异常;

    方法能够在同一个类中或者在一个子类中被重载。

    无法以返回值类型作为重载函数的区分标准。

    重写与重载的区别

    总结:

    方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。

    (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。

    (2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。

    (3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。

    Java多态

    多态是同一个行为具有多个不同表现形式或形态的能力。

    多态就是同一个接口,使用不同的实例而执行不同操作,多态性是对象多种表现形式的体现.

    多态的优点:

    1. 消除类型之间的耦合关系

    2. 可替换性

    3. 可扩充性

    4. 接口性

    5. 灵活性

    6. 简化性

    多态存在的三个必要条件:

    1.继承

    2.重写

    3.父类引用指向子类对象(比如: Parent p = new Child())

    当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。

    实例如下:

    abstract class Animal {  
        abstract void eat();  
    }  
      
    class Cat extends Animal {  
        public void eat() {  
            System.out.println("吃鱼");  
        }  
        public void work() {  
            System.out.println("抓老鼠");  
        }  
    }  
      
    class Dog extends Animal {  
        public void eat() {  
            System.out.println("吃骨头");  
        }  
        public void work() {  
            System.out.println("看家");  
        }  
    }
    public class Test {
        public static void main(String[] args) {
          show(new Cat());  // 以 Cat 对象调用 show 方法
          show(new Dog());  // 以 Dog 对象调用 show 方法
                    
          Animal a = new Cat();  // 向上转型  
          a.eat();               // 调用的是 Cat 的 eat
          Cat c = (Cat)a;        // 向下转型  
          c.work();        // 调用的是 Cat 的 work
      }  
                
        public static void show(Animal a)  {
          a.eat();  
            // 类型判断
            if (a instanceof Cat)  {  // 猫做的事情 
                Cat c = (Cat)a;  
                c.work();  
            } else if (a instanceof Dog) { // 狗做的事情 
                Dog c = (Dog)a;  
                c.work();  
            }  
        }  
    }

    输出结果:

    吃鱼
    抓老鼠
    吃骨头
    看家
    吃鱼
    抓老鼠

    多态的实现方式

    方式一:重写
    方式二:接口
    方式三:抽象类和抽象方法

    抽象类

    1.抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。

    2.由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。

    3.父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。

    4.在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。

    抽象方法:

    如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。

    Abstract关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。

    抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。

    声明抽象方法会造成以下两个结果:

    1.如果一个类包含抽象方法,那么该类必须是抽象类。

    2.任何子类必须重写父类的抽象方法,或者声明自身为抽象类。

    Java 接口

    接口与类相似点:

    1.一个接口可以有多个方法。

    2.接口文件保存在 .java 结尾的文件中,文件名使用接口名。

    3.接口的字节码文件保存在 .class 结尾的文件中。

    4.接口相应的字节码文件必须在与包名称相匹配的目录结构中。

    接口与类的区别:

    接口不能用于实例化对象。

    接口没有构造方法。

    接口中所有的方法必须是抽象方法。

    接口不能包含成员变量,除了 static 和 final 变量。

    接口不是被类继承了,而是要被类实现。

    接口支持多继承。

    接口特性:

    接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。

    接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。

    接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

    抽象类和接口的区别:

    1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。

    2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。

    3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。

    4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

  • 相关阅读:
    openssl生成公钥私钥对 加解密
    boost replace_if replace_all_regex_copy用法
    PS 图像滤镜— — USM 锐化
    使用boost库生成 随机数 随机字符串
    改动Android设备信息,如改动手机型号为iPhone7黄金土豪版!
    验证(Verification)与确认(Validation)的差别
    Spring-SpringMVC-Hibernate整合
    全面整理的C++面试题
    Metropolis Hasting算法
    捕捉到来自宇宙深空的神奇X-射线信号
  • 原文地址:https://www.cnblogs.com/Lukizzz/p/9671148.html
Copyright © 2020-2023  润新知