J2SE基础2——OOP

面向对象的本质:
  以类的方式组织代码,以对象的方式封装数据

创建与初始化对象

使用new关键字创建的时候,除了分配内存空间外,还会给创建好的对象进行默认初始化以及对类中构造器的调用。
类中的构造器又称构造方法,创建对象时必须调用,需满足以下3个要求:
 1.方法名必须和类名相同
 2.必须没有返回类型,但不写void
 3.不能在程序中显式地调用

任何类都有一个隐式的无参构造方法,把变量都初始化为默认值。
可以显式地定义有参构造函数,但此时就没有了隐式的无参构造方法,需要时应重新显式地自定义无参构造方法。

封装

高内聚,低耦合:该露的露,该藏的藏。
通常,应禁止直接访问一个对象中数据的实际表示,而是通过操作接口来访问:信息隐藏。
操作:属性私有——类的变量成员不用public,而用private修饰,此时添加get和set方法用于外部访问。
图片说明

图片说明

private把成员变量封装了起来,若要外部调用,就写get,set方法:

图片说明

IDEA中用 alt + insert 快捷键选择生成 ge t和 set 方法:Getter and Setter

继承

java中只有单继承,没有多继承
IDEA有 Ctrl+h 快捷键展示继承树
java中所有的类都默认直接或间接继承Object类。

super关键字

在子类对象中调用父类的方法或成员变量。
只能出现的子类的方法或构造方法中


生成子类对象,首先调用父类的构造方法(调用父类无参构造方法时一般不写语句,直接默认调用,也可以写一句 super(); 放在子类构造方法的第一句,!必须是第一句,否则报错),然后才调用子类自己的构造方法。若在父类中重写了一个有参的构造方法,则必须再重写一个父类的无参构造方法,或者在子类构造方法的第一行先调用父类的有参构造方法,否则子类构造方法报错,无法生成子类对象。
图片说明

重写

为什么需要: 父类的功能子类不一定需要活不一定被满足
IDEA有 alt+insert 快捷键选择生成override


  • 重写都是方法的重写,和成员变量无关
  • 需要有继承关系,子类重写父类的方法
  • 方法名必须相同,参数列表必须相同(否则变成重载),方法体不同
  • 修饰符:范围可以扩大,但不能缩小
  • 抛出的异常:范围可以缩小,但不能扩大
  • 不用static:
    图片说明
    图片说明

    多态

    即同一方法可以根据发送对象的不同而采取所种不同的响应方式。
    动态编译:
    一个对象的实际类型是确定的,但可以指向对象的【引用的类型】有很多。
    多态是方法的多态,成员变量没有多态性。
  • 多态存在的条件:
  1. 有继承关系
  2. 子类重写父类方法
  3. 父类引用指向子类对象:
    Person s1 = new Student(); //Student类继承Person类
    //Person表示s1的类型,称为引用类型,相对于int称为基本数据类型

对象能执行哪些方法,主要看其引用类型:
  如Person有run()方法,Student继承并重写了run()方法,且还有独有的study()方法,则s1可执行Student的run()方法,但不能执行study()方法。
子类重写了父类的方法,执行子类的方法。
子类引用的对象可调用自己的或继承(重写)父类的方法,父类引用的对象只能执行父类的方法。
可将父类强制转换为子类,以此执行子类独有的方法:

//Student是Person的子类,它俩都是Object的子类
Student s1 = new Student();
Person s2 = new Student();
Object s3 = new Student();

s2.run();
((Student) s2).study(); //study()是Student独有的方法

instanceof

X instanceof Y
//能否编译通过以及通过的返回值取决于X和Y是否存在父子关系:

*不存在编译报错
*X是Y的父类或本身类返回true或false
图片说明

  1. 子类可以转换为父类:向上转型
  2. 父类强制转换为子类:向下转型
  3. 子类向上转型会丢失独有的方法:
    图片说明

static关键字

  • 非静态方法可以调用静态方法里的内容
  • 静态变量在内存中只有1个,被类的所有实例共享

匿名代码块:在类中只用一对{}括起来的代码块,必须出现在构造方法之前(可用来赋初值)先于构造方法执行,次于静态代码块执行。
静态代码块:用一对{}括起来的代码块,前面只有一个static修饰。在类中只能执行 一次,且最先执行

  • 静态导入包
    import static java.lang.Math.random;
    public class Test{
      public static void main(Strin[] args){
          System.out.println(random());    //不用再写Math.random()
      }
    }

抽象类

abstract修饰,只有方法名,没有方法的实现。

Class 'subAction' must either be declared abstract or implement abstract method 'doSomething()' in 'Action'
  • 不能new抽象类,只靠子类继承实现
  • 凡是包含抽象方法,类必须是抽象类,即加abstract修饰(抽象方法必须在抽象类中)。抽象类中可以有非抽象方法。
  • 抽象类本质是类,类只能单继承,java可以通过接口实现多继承。

接口

图片说明

  • 接口都需要有对应的实现类,一般类名以Impl结尾。
  • 实现接口的类需要重写接口中的所有方法!
  • 接口中所有的方法其实都是抽象的,默认修饰为public abstract,所以不加;接口中可以定义常量(几乎用不到):
    图片说明
  • 实现接口的类可以implements多个接口,只要把这些接口的方法都重写实现即可:java中的多继承。

内部类

就是在一个类中再定义的类:

  1. 成员内部类:类中的类
  2. 静态内部类:static修饰
  3. 局部内部类:方法中的类
  4. 匿名内部类。

一个java文件中可以有多个class,但只能有一个类是public修饰的。

异常机制

Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。
在Java API 中已经定义了许多异常类,可分为两大类:错误Error和异常Exception:
图片说明
Error类对象由java虚拟机生成并抛出。

若要捕获多个异常,则要从小到大地去catch,最大的是Throwable。可以捕获所有异常,所以放最后:
图片说明

快捷键:选中一行代码,ctrl+alt+t,调出提示的结构:Surround With ...

throw和throws:
throw在方法体内,throws在方法体外。

public void test(int a, int b) throws ArithmeticException{
    if (b==0) {
        throw new ArithmeticException();
    }
}

自定义异常类:
图片说明


图片说明 图片说明 图片说明

图片说明 图片说明 图片说明

尽量添加fianlly语句,以便释放占用的资源。

全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务