zoukankan      html  css  js  c++  java
  • 面向对象:类的基础

    类的成员构成:

    属性

     

    方法

    4种权限都可以用来修饰类的内部结构:属性、方法、构造器、内部类
    修饰类的话,只能使用:缺省、public

    this

    1.可以调用的结构:属性、方法;构造器
    2.this调用属性、方法:
    this理解为:当前对象  或 当前正在创建的对象
    2.1  在类的方法中,我们可以使用"this.属性"或"this.方法"的方式,调用当前对象属性或方法。但是,
     *   通常情况下,我们都择省略"this."。特殊情况下,如果方法的形参和类的属性同名时,我们必须显式
     *   的使用"this.变量"的方式,表明此变量是属性,而非形参。
     *
     *  2.2 在类的构造器中,我们可以使用"this.属性"或"this.方法"的方式,调用当前正在创建的对象属性或方法。但是,通常情况下,我们都择省略"this."。特殊情况下,如果构造器的形参和类的属性同名时,我们必须显式的使用"this.变量"的方式,表明此变量是属性,而非形参。
    3.this调用构造器:
    ① 我们在类的构造器中,可以显式的使用"this(形参列表)"方式,调用本类中指定的其他构造器
    ② 构造器中不能通过"this(形参列表)"方式调用自己
    ③ 如果一个类中有n个构造器,则最多有 n - 1构造器中使用了"this(形参列表)"
    ④ 规定:"this(形参列表)"必须声明在当前构造器的首行
    ⑤ 构造器内部,最多只能声明一个"this(形参列表)",用来调用其他的构造器
     
    final

    1. 数据

    声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。

    • 对于基本类型,final 使数值不变;
    • 对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。

    2. 方法

    声明方法不能被子类重写。

      private 方法隐式地被指定为 final,如果在子类中定义的方法和基类中的一个 private 方法签名相同,此时子类的方法不是重写基类方法,而是在子类中定义了一个新的方法。

    3. 类

    声明类不允许被继承。

    static

    1. 静态变量

    • 静态变量:又称为类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以直接通过类名来访问它。静态变量在内存中只存在一份。
    • 实例变量:每创建一个实例就会产生一个实例变量,它与该实例同生共死。

    2. 静态方法

    静态方法在类加载的时候就存在了,它不依赖于任何实例。所以静态方法必须有实现,也就是说它不能是抽象方法。

    只能访问所属类的静态字段和静态方法,方法中不能有 this 和 super 关键字。

    3. 静态语句块

    静态语句块在类初始化时运行一次。

    4. 静态内部类

    非静态内部类依赖于外部类的实例,而静态内部类不需要。

    public class OuterClass {
    
        class InnerClass {
        }
    
        static class StaticInnerClass {
        }
    
        public static void main(String[] args) {
            // InnerClass innerClass = new InnerClass(); // 'OuterClass.this' cannot be referenced from a static context
            OuterClass outerClass = new OuterClass();
            InnerClass innerClass = outerClass.new InnerClass();
            StaticInnerClass staticInnerClass = new StaticInnerClass();
        }
    }

    静态内部类不能访问外部类的非静态的变量和方法。

    6. 初始化顺序

    静态变量和静态语句块优先于实例变量和普通语句块,静态变量和静态语句块的初始化顺序取决于它们在代码中的顺序。

    最后才是构造函数的初始化。

    存在继承的情况下,初始化顺序为:

    • 父类(静态变量、静态语句块)
    • 子类(静态变量、静态语句块)
    • 父类(实例变量、普通语句块)
    • 父类(构造函数)
    • 子类(实例变量、普通语句块)
    • 子类(构造函数)
    super 关键字可以理解为:父类的
    2.可以用来调用的结构:
    属性、方法、构造器
    3.super调用属性、方法:
    3.1 我们可以在子类的方法或构造器中。通过使用"super.属性"或"super.方法"的方式,显式的调用父类中声明的属性或方法。但是,通常情况下,我们习惯省略"super."
    3.2 特殊情况:当子类和父类中定义了同名的属性时,我们要想在子类中调用父类中声明的属性,则必须显式的使用"super.属性"的方式,表明调用的是父类中声明的属性。
    3.3 特殊情况:当子类重写了父类中的方法以后,我们想在子类的方法中调用父类中被重写的方法时,则必须显式的使用"super.方法"的方式,表明调用的是父类中被重写的方法。
    
    
    4.super调用构造器:
    4.1  我们可以在子类的构造器中显式的使用"super(形参列表)"的方式,调用父类中声明的指定的构造器
    4.2 "super(形参列表)"的使用,必须声明在子类构造器的首行!
    4.3 我们在类的构造器中,针对于"this(形参列表)"或"super(形参列表)"只能二一,不能同时出现
    4.4 在构造器的首行,没显式的声明"this(形参列表)"或"super(形参列表)",则默认调用的是父类中空参的构造器:super()
    4.5 在类的多个构造器中,至少一个类的构造器中使用了"super(形参列表)",调用父类中的构造器
    1.多态性的理解:可以理解为一个事物的多种形态。
    2.何为多态性:
    对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)
    举例:
    Person p = new Man();
    Object obj = new Date();
    3.多态性的使用:虚拟方法调用
    > 有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
    > 总结:编译,看左边;运行,看右边。
    4.多态性的使用前提:
    ① 类的继承关系  ② 方法的重写
    5.多态性使用的注意点:
    对象的多态性,只适用于方法,不适用于属性(编译和运行都看左边)

    1.java.lang.Object类的说明:
     * 1.Object类是所Java类的根父类
     * 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 
     * 3.Object类中的功能(属性、方法)就具通用性。
     *     属性:无
     *  方法:equals() / toString() / getClass() /hashCode() / clone() / finalize()
     *     wait() 、 notify()、notifyAll()
     * 
     * 4. Object类只声明了一个空参的构造器
    2.equals()方法
    2.1 equals()的使用:
       1. 是一个方法,而非运算符
     * 2. 只能适用于引用数据类型
     * 3. Object类中equals()的定义:
     *    public boolean equals(Object obj) {
                return (this == obj);
          }
     *    说明:Object类中定义的equals()和==的作用是相同的:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体
     * 
     * 4. 像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是
     *    两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同。
     *    
     * 5. 通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的"实体内容"是否相同。那么,我们
     *    就需要对Object类中的equals()进行重写.
     *    重写的原则:比较两个对象的实体内容是否相同.
    2.2 如何重写equals()
    2.2.1 手动重写举例:
    class User{
    String name;
    int age;
        //重写其equals()方法
        public boolean equals(Object obj){
            if(obj == this){
                return true;
            }
            if(obj instanceof User){
                User u = (User)obj;
                return this.age == u.age && this.name.equals(u.name);
            }
            return false;
        }
    }
    2.2.2 开发中如何实现:自动生成的
    2.3 回顾 == 运算符的使用:
     * == :运算符
     * 1. 可以使用在基本数据类型变量和引用数据类型变量中
     * 2. 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同)
     *    如果比较的是引用数据类型变量:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体
     * 补充: == 符号使用时,必须保证符号左右两边的变量类型一致。
    
    3. toString()方法
    3.1 toString()的使用:
       1. 当我们输出一个对象的引用时,实际上就是调用当前对象的toString()
     * 
     * 2. Object类中toString()的定义:
     *   public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
         }
     * 
     * 3. 像String、Date、File、包装类等都重写了Object类中的toString()方法。
     *    使得在调用对象的toString()时,返回"实体内容"信息
     *    
     * 4. 自定义类也可以重写toString()方法,当调用此方法时,返回对象的"实体内容"
    3.2 如何重写toString()
    举例:
    //自动实现
        @Override
        public String toString() {
            return "Customer [name=" + name + ", age=" + age + "]";
        }

     abstract

    abstract: 抽象的
    1.可以用来修饰:类、方法
    2.具体的:
    abstract修饰类:抽象类
     *      > 此类不能实例化
     *      > 抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程)
     *      > 开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作 --->抽象的使用前提:继承性
    
    abstract修饰方法:抽象方法
     *         > 抽象方法只方法的声明,没方法体
     *         > 包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法的。
     *        > 若子类重写了父类中的所的抽象方法后,此子类方可实例化
     *          若子类没重写父类中的所的抽象方法,则此子类也是一个抽象类,需要使用abstract修饰
    3.注意点:
     * 1.abstract不能用来修饰:属性、构造器等结构
     * 2.abstract不能用来修饰私方法、静态方法、final的方法、final的类
    interface:接口
    1.使用说明:
       1.接口使用interface来定义
     * 2.Java中,接口和类是并列的两个结构
     * 3.如何定义接口:定义接口中的成员
     *         
     *         3.1 JDK7及以前:只能定义全局常量和抽象方法
     *             >全局常量:public static final的.但是书写时,可以省略不写
     *             >抽象方法:public abstract的
     *             
     *         3.2 JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法(略
     * 
     * 4. 接口中不能定义构造器的!意味着接口不可以实例化
     * 
     * 5. Java开发中,接口通过让类去实现(implements)的方式来使用.
     *    如果实现类覆盖了接口中的所抽象方法,则此实现类就可以实例化
     *    如果实现类没覆盖接口中所的抽象方法,则此实现类仍为一个抽象类
     *    
     * 6. Java类可以实现多个接口   --->弥补了Java单继承性的局限性
     *   格式:class AA extends BB implements CC,DD,EE
     *   
     * 7. 接口与接口之间可以继承,而且可以多继承
     * 
     * *******************************
     * 8. 接口的具体使用,体现多态性
     * 9. 接口,实际上可以看做是一种规范

    接口和抽象类的区别:

    相同点:不能实例化;都可以包含抽象方法的。

    不同点:①抽象类可以有成员方法的具体实现,成员变量可以是各种类型。而接口中方法都是public abstract 方法,成员变量都是public static final类型。

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

  • 相关阅读:
    ProtoType Design Tools
    什么是publickeytoken及publickeytoken的作用
    Windows最高权限system帐户
    Q70 AV01本本安装MAC
    解决MDict3在PPC下乱码的问题
    QT_XSP.CPP
    QT_XSP.CPP
    SetupFactory脚本
    DVD IFO FILE HEADER
    SerialPort comstat is being used without defining
  • 原文地址:https://www.cnblogs.com/lemonzhang/p/12892328.html
Copyright © 2011-2022 走看看