Java学习随便记2

可抛出的对象:错误和异常

错误是致命的,而且程序员预期不该发生的,一旦发生程序通常自行奔溃;异常是程序员可以预期的某种特殊情况,程序应该捕获且合理地处理它。Java内置了不少异常类,如除以0、数组越界、对象为空、加载类时找不到对应类……。基类 Throwable 定义了 getMessage()、toString()、printStatckTrace()等方法,可以在捕获异常时使用。

一个方法可能抛出(非检查性)异常,应该在方法签名尾部用 throws关键字声明这些异常。

异常处理中,可以在 try{...} catch(..) {...} catch(..){...} 尾部添加 finally {...} 块做善后工作,finally块代码会确保被执行。JDK 7+ 中的 try (资源声明创建) { ... } catch(...){...} 语法糖,可以减轻这种确保资源释放的负担(即不用写finally块,编译器帮你处理)。

java继承

java继承和php一样,使用 extends 关键字实现类继承(只是php中通常不用管类本身的public之类的访问控制。不继承任何类的类默认继承Object类),用 implements 关键字实现接口“继承”(即实现接口)。java类继承是单继承,用接口可以实现多继承的特性,因为同一个类可以实现多个接口。

继承中,使用 super 关键字访问父类(这关键字倒和python同了),this指向实例自己(注意,虽然关键字和C++、PHP相同,但不用箭头语法)。

final关键字可以实现“断子绝孙”,这个关键字和C#同。

java方法覆盖(override)

子类对父类方法覆盖(或叫“覆写”或“重写”)时,方法签名除了返回值,其余必须保持不变(返回值必须是父类的兼容类型)。访问权限只能提高,不能降低,即前一篇中的父类是public的方法,不能被子类覆盖成protected或private。当然,重写实现中,可以用super.Xxx()调用父类方法。

Java方法重载(overload)

java中的重载(overload),最常用的是构造函数重载。重载就是方法名一样,参数必须不同。重载其实是本质(签名)不同的函数,只是这些函数作用相近取了相同的名字。

Java多态

覆盖重写实现多态的基本条件:(1)存在继承;(2)子类覆盖父类方法;(3)父类引用指向子类对象(表明父类变量总是子类的兼容类型)

多态的特点是:设计父类(通常是类库之类,用户应用较少使用多态)时,可以编写通用的代码,子类可以实现不同功能。父类类型的变量(父类引用),可以在运行时绑定不同的子类实例,调用同名方法时,具体呈现实现功能不同,即运行时多态

Java抽象类

抽象类无实例,必须被继承得到使用,所以,它只是一份关于成员变量和成员方法的协议,通常类库设计者更关注它。抽象类用 abstract 修饰 class。

抽象类中可以有抽象方法(当然也可以没有抽象方法),即用abstract修饰的方法。可以认为,抽象方法更体现“协议性”,因为它只规定了继承者同名方法的签名,本身无方法体。不能用 abstract 修饰构造方法和static类方法。

抽象类的派生子类可以仍然是抽象类,子类若非抽象类,它必须实现所有抽象方法(如果有的话)的具体实现。

Java接口

看一个例子:Closeable接口从AutoCloseable继承(接口可以继承另一接口,也可以没有继承)。接口内声明了一个 close() 方法(只需要标记public,但它本质上是 public abstract的)。接口内成员变量不常见,并且只能是static和final的。

public interface Closeable extends AutoCloseable {
    public void close() throws IOException;
}

接口机制让 Java 也可以实现多继承效果。

Java枚举

简单的 Java 枚举和 C枚举类型类似,如

enum RGB {
    RED, GREEN, BLUE;
}

但Java枚举其实是一个类(都从java.lang.Enum派生),可以添加成员变量、方法和构造函数。并且,Java枚举类可以嵌入其他类之中。

public class HelloWorld {
    enum RGB {
        RED {
            public String getColor() {
                return "Red";
            }
        },
        GREEN {
            public String getColor() {
                return "Green";
            }
        },
        BLUE {
            public String getColor() {
                return "Blue";
            }
        };

        public abstract String getColor();
    }

    public static void main(String[] args) {
        for (RGB x : RGB.values()) {
            System.out.println(x.getColor());
        }
    }
}

指的注意的是,从理解概念上来说,要把枚举成员 RED、GREEN、BLUE当做类RGB的实例,类RGB有抽象方法 getColor(),然后枚举实例可以具体实现自己的 getColor()实例方法(类似多态中的子类方法)。在调用时,RGB型的实例 x 是不能直接看见 RED、GREEN、BLUE的 getColor() 方法的,它必须借由“父类”RGB的抽象方法 getColor() 来调用(因为父类RGB的getColor()是抽象的,所以,会去调用子类的方法)。因为 x 依次绑定到 RED、GREEN、BLUE “实例”,从而实现了某种程度的运行时多态。

Java包机制

Java包机制不仅仅解决命名冲突问题,它还有访问控制搜索定位类、接口等成分的作用。写法上,Java包机制和golang有部分相似。

Java包机制“严肃”的地方是必须遵守包名、类名的约定,并且包名必须和相应的字节码所在的目录结构对应(因为需要实现搜索定位)。

以上是Java OOP的一些基本概念

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值