java 面向对象

  1. 简介

    1. 面向对象的特征:

      • 封装(encapsulation)
      • 继承(inheritance)
      • 多态(polymorphism)

    2. 成员变量和局部变量的区别?

      成员变量:
      • 成员变量定义在类中,在整个类中都可以被访问。
      • 成员变量随着对象的建立而建立,存在于对象所在的堆内 存中。
      • 成员变量有默认初始化值。

      局部变量:
      • 局部变量只定义在局部范围内,如:函数内,语句内等。
      • 局部变量存在于栈内存中。
      • 作用的范围结束,变量空间会自动释放。
      • 局部变量没有默认初始化值

    3. 创建对象,使用对象

      class Car//对Car这类事物进行描述
      {
      	String color = "red";
      	int num = 4;
      	void show()
          {
          	System.out.println("color="+color+"..num="+num);
      	}
      }
      class CarDemo
      {
          public static void main(String[] args)
          {
              Car c = new Car();//建立对象
              c.color = "black";//对对象的属性进行修改
              c.show();//使用对象的功能。
          }
      }
    4. 匿名对象

      匿名对象是对象的简化形式

      匿名对象两种使用情况
      • 当对对象 方法仅进行 一次调用的时
      • 匿名对象可以作为实际参数进行传递

    5. 封装(Encapsulation)

      封装:是指隐藏对象的属性和实现细节,仅对外提供 公共访问方式。

      好处:

      • 将变化隔离。
      • 便于使用。
      • 提高重用性。
      • 提高安全性。
      封装原则:
      • 将不需要对外提供的内容都隐藏起来。
      • 把属性都隐藏,提供公共方法对其访问。

    6. private(私有)关键字

      将成员变量私有化,对外提供对应的set ,get 方法对其进行访问。提高对数据访问的安全 性。

    7. 构造函数

      特点:

      1. 函数名与类名相同
      2. 不用定义返回值类型
      3. 不可以写return语句
      作用:
      给对象进行初始化。
      注意:

      1. 默认构造函数的特点。如果没有显示定义构造函数,编译器会自动创建一个空参构造函数,如果定义了一个或者多个构造函数,编译器就不会再创建默认构造函数了。
      2. 多个构造函数是以重载的形式存在的。

      class Person{
      String name;
      int age;
      }

      Person p = new Person();的初始化过程:
      在栈中声明一个变量p;
      在堆中申请内存;将成员变量默认初始化。
      查找构造函数;构造函数压栈,执行构造函数初始化;
      构造函数出栈;
      将对象的指针赋值给p;

    8. this关键字

      特点:this代表其所在函数所属对象的引用。
      换言之:this代本类对象的引用。


      当成员变量和局部变量重名时,可以用关键字this区分。
      this(构造函数的参数);在对象的构造函数中调用其它构造函数。但是他只能在构造函数的第一行

    9. static( 静态)关键字

      用于修饰成员(成员变量和成员函数)

      被修饰后的成员具备以下特点:
      • 随着类的加载而加载
      • 优先于对象存在
      • 被所有对象所共享
      • 可以直接被类名调用
      使用注意
      • 静态方法只能访问静态成员
      • 静态方法中不可以写this,super关键字
      • 主函数是静态的
    10. javadoc

      生成帮助文档。

      javadoc -d DocDemohelp -author -version -encoding utf-8 -charset utf-8 DocDemo.java

    11. 类的成员变量没有赋值时,默认初始化

    12. 定义成员变量时直接赋初值,显示初始化

    13. 静态代码块

    14. 构造代码块

  2. 单例模式

    1. 设计模式:

      对问题行之有效的解决方式。其实他是一种思想。

    2. 单例设计模式

      解决的问题:可以保证一个类在内存中的对象唯一性。

  3. 继承(inheritance)

    1. 概述:

      多个类中存在相同属性和行为时,将这些内容抽取到 单独一个类中,那么多个类无需再定义这些属性和行 为,只要继承单独的那个类即可。

      多个类可以称为子类,单独这个类称为父类或者超 类。

      子类可以直接访问父类中的非私有的属性和行为。

      通过 extends 关键字让类与类之间产生继承关系。

      Java只支持单继承,不支持多继承。但是可以多实现接口。

    2. 关键字

      super和this的用法相同

      this代表本类引用

      super代表父类(超类)引用

      当子父类出现同名成员时,可以用super进行区分

      子类要调用父类构造函数时,可以使用super语句。

    3. 函数覆盖(Override)

      子类中出现与父类一模一样的方法时,会出现覆盖操作,也称为重写或者复写。

      父类中的私有方法不可以被覆盖

      在子类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名 获取。

      覆盖注意事项:

      覆盖时,子类方法权限一定要大于等于父类方法权限
      静态只能覆盖静态
      覆盖的应用:
      • 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以复写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内 容。

    4. 子类的实例化过程

      子类中所有的构造函数默认都会访问父类中空参数的构造函数
      因为每一个构造函数的第一行都有一条默认的语句super();
      但是当第一行使用this调用子类另外的构造函数时,在本子类的本构造函数中就不会再super语句。

      子类会具备父类中的数据,所以要先明确父类是如何对这些数据初始化的。

      当父类中没有空参数的构造函数时,子类的构造函数必须通过this或者super语句指定要访问的构造函数。

      1、 1、 1、 1、 1、 1、
  4. final 关键字

    final可以修饰类,方法,变量。

    final修饰的类不可以被继承。

    final修饰的方法不可以被覆盖。

    final修饰的变量是一个常量。只能被赋值一次。

    内部类只能访问被final修饰的局部变量。
  5. 抽象类

    1. 概述

      抽象定义:
      • 抽象就是从多个事物中将共性的,本质的内容抽取出来。
      • 例如:狼和狗共性都是犬科,犬科就是抽象出来的概念。

      抽象类:
      • Java中可以定义没有方法体的方法,该方法的具体实现由子类完 成,该方法称为抽象方法,包含抽象方法的类就是抽象类。

      抽象方法的由来:
      • 多个对象都具备相同的功能,但是功能具体内容有所不同,那么在抽取过程中,只抽取了功能定义,并未抽取功能主体,那么只有功 能声明,没有功能主体的方法称为抽象方法。

    2. 特点

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

      抽象方法只有方法声明,没有方法体,定义在抽象类中。
      • 格式:修饰符 abstract 返回值类型 函数名(参数列表) ;

      抽象类不可以被实例化,也就是不可以用new创建对象。原因如 下:

      • 抽象类是具体事物抽取出来的,本身是不具体的,没有对应的实例。例如:犬科是一个抽象的概念,真正存在的是狼和狗。
      • 而且抽象类即使创建了对象,调用抽象方法也没有意义。
      抽象类通过其子类实例化,而子类需要覆盖掉抽象类中所有的抽象方法后才可以创建对象,否则该子类也是抽象类。

    3. 相关问题
      抽象类中是否有构造函数?
      有。用于给子类进行初始化

      抽象类可以不定义抽象方法吗?
      可以的。但是很少见,目的就是不让该类创建对象。

      抽象关键字abstract不可以和哪些关键字 共存?
      private final static

      抽象类中可不可以没有抽象方法?
  6. 接口

    1. 格式

      interface {}
      接口中的成员修饰符是固定的。
      • 成员常量:public static final
      • 成员函数:public abstract

      接口的出现将“多继承”通过另一种形式体现出来,即“多实现”。

    2. 特点

      接口是对外暴露的规则

      接口是程序的功能扩展

      接口的出现降低耦合性

      接口可以用来多实现

      类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口。

      接口与接口之间可以有继承关系
  7. 对象的多态

    1. 定义
      某一类事物的多种存在形态。

      体现: 父类或者接口的引用指向或者接收自己的子类对象。

      作用: 多态的存在提高了程序的扩展性和后期可维护性

      前提:
      • 需要存在继承或者实现关系
      • 要有覆盖操作
    2. 特点

      成员函数:
      • 编译时:要查看引用变量所属的类中是否有所调用的成员。
      • 在运行时:要查看对象所属的类中是否有所调用的成员。

      成员变量(非静态):
      • 编译时:参考引用型变量所属的类中的是否有调用的成员变量。有编译通过,没有编译失败。。
      • 在运行时:参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。
      简单的说:编译和运行都参考左边。

      静态函数:
      • 编译时:参考引用型变量所属的类中的是否有调用的静态方法。有编译通过,没有编译失败。。
      • 在运行时:参考引用型变量所属的类中的是否有调用的静态方法,并运行该所属类中的静态方法。
      简单的说:编译和运行都参考左边。
  8. 内部类

    将一个类定义在另一个类的里面,对里面那个 类就称为内部类(内置类,嵌套类)。

    访问特点:
    • 内部类可以直接访问外部类中的成员,包括私有成员。
    • 而外部类要访问内部类中的成员必须要建立内部类的对象。


    内部类定义在成员位置上
    • 可以被private static成员修饰符修饰。
    • 被static修饰的内部类只能访问外部类中的静态成员。


    内部类定义在局部位置上
    • 也可以直接访问外部类中的成员。
    • 同时可以访问所在局部中的局部变量,但必须是被final修 饰的。



    匿名内部类:

    就是内部类的简化写法。

    前提:
    • 内部类可以继承或实现一个外部类或者接口。

    格式为:
    • new 外部类名或者接口名(){覆盖类或者接口中的代码,(也可以自定义内容。)}

    简单理解:
    • 就是建立一个建立一个带内容的外部类或者接口的子类匿名对象。

    通常使用场景之一:
    当函数参数是接口类型时,而且接口中的方法不超过三个。可以用匿名内部类作为实际参数进行传递。
  9. 异常

    1. 异常的体系
      • Throwable
      • Error
      • 通常出现重大问题如:运行的类不存在或者内存溢出等。
      • 不编写针对代码对其处理
      • Exception

      • 在运行时运行出现的一起情况,可以通过try catch finally

    2. Exception和Error的子类名都是以父类名作为后 缀。

      编译时异常(除RuntimeException和其子类):在抛出时要声明或者捕捉
      只要没有处理,编译就会失败。

      运行时异常(RuntimeException):在抛出时可以不用声明

    3. Throwable中的方法

      getMessage()
      • 获取异常信息,返回字符串。

      toString()
      • 获取异常类名和异常信息,返回字符串。

      printStackTrace()
      • 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。

      printStackTrace(PrintStream s)
      • 通常用该方法将异常内容保存在日志文件中,以便查阅。

    4. throws和throw

      throws用于标识函数暴露出的异常。

      throw用于抛出异常对象。

      throws与throw的区别:
      • thorws用在函数上,后面跟异常类名。
      • throw用在函数内,后面跟异常对象。

    5. 异常处理
      try
      {
      需要检测的代码;
      }
      catch(异常类变量)//没有要回收的资源时可以省略
      {
      异常处理代码;
      }
      finally
      {
      一定会执行的代码;
      }

      Finally代码块只有一种情况不会被执行。就是在之前执行了System.exit(0)

    6. 自定义异常

      自定义类继承Exception或者其子类。

      通过构造函数定义异常信息。例:
      Class DemoException extends Exception
      {
      DemoException(String message)
      {
      super(message);
      }

      }

      通过throw将自定义异常抛出。
    7. 异常细节

      RuntimeException以及其子类如果在函数中被throw抛出,可以不用在函数上声明。

      一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类。

      如果父类抛出多个异常,那么重写(覆盖)方法必须抛出那些异常的一个子集,不能抛出新的异常。

      介绍异常在分层设计时的层内封装。
  10. 包(package)

    1. 简介

      对类文件进行分类管理。

      给类提供多层命名空间。

      写在程序文件的第一行。

      类名的全称的是:包名.类名。

      包也是一种封装形式。
    2. 包之间的访问

      被访问的包中的类权限必须是public的。

      类中的成员权限:public或者protected

      protected是为其他包中的子类提供的一种权限
       publicprotecteddefaultprivate
      同一类中
      同一包中 
      子类  
      不同包中   
    3. import

      简化类名。

      一个程序文件中只有一个package,可以有多个import。

      用来导包中的类,不导入包中的包。

      通常写import mypack.Demo;而不写import mypack.*;为什么?
    4. Jar包
      Java的压缩包
      • 方便项目的携带。
      • 方便于使用,只要在classpath设置jar路径即可。
      • 数据库驱动,SSH框架等都是以jar包体现的。
    5. Jar包的操作
      通过jar.exe工具对jar的操作。
      • 创建jar包
      jar -cvf mypack.jar packa packb
      • 查看jar包
      jar -tvf mypack.jar [>定向文件]
      • 解压缩
      jar -xvf mypack.jar
      • 自定义jar包的清单文件
      jar –cvfm mypack.jar mf.txt packa packb
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值