Java面向对象“总动员”

Java面向对象

1.面向过程和面向对象

1.1共同概念:
  面向过程和面向对象都是对软件分析、设计和开发的一种思想,它指导着人们以不同的方式去分析、设计和开发软件。
1.2 应用领域:
  C语言是一种典型的面向过程的语言。java是一种典型的面向对象语言。
1.3 总结:
  联系:
    面向对象和面向过程思想都是解决问题的思维方式,都是代码组织的方式。
  面向过程
    面向过程是一种”执行者思维“,解决简单问题可以使用面向过程;
    面向过程中数据和对数据的处理方法是分开的;
    面向过程是对每一个过程的编写。
  面向对象
    面向对象是一种”设计者思维“,解决复杂、需要协作的问题可以使用面向对象;
    面向对象把数据和对数据的处理方法封装在一起;
    面向对象就是把每个对象独立出来,然后表示他们之间的关系。
  面向对象的分类
    面向对象分析(OOA)
    面向对象设计(OOD)
    面向对象编程(OOP)

2.构造器

2.1 构造器的4个要点
  构造器通过new关键字调用;
  构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里面使用return返回某个值;
  如果我们没有定义构造器,则编译器会自动定义一个无参的构造方法。如果已经定义则编译器不会自动添加;
  构造器的方法名必须和类名一致。
2.2 方法的重载的条件
  形参类型不同、形参个数不同、形参顺序不同;
  只有返回值不同不构成方法的重载。如 int a(String str){ } 与 void a(String str){ };
  只有形参的名称不同,不构成方法的重载。如 int a (String str){ } 与 int a (String s){ }。
2.3 构造器的重载
  形参类型不同、形参个数不同、形参顺序不同;
  只有形参的名称不同,不构成构造方法的重载。

3.JVM虚拟机内存模型概念

3.1线程
  程序计数器:
    在JVM规范中,每个线程都有属于自己的程序计数器。这一块比较小的内存空间,存储当前线程正在执行的java方法的JVM指令地址,以及字节码的行号。
  Java虚拟机栈:
    属于线程私有区域,每个线程在创建的时候都会创建一个虚拟机栈,生命周期与线程一致,线程退出时,线程的虚拟机栈也回收。
  本地方法栈:
    与虚拟机类似,本地方法栈是在调用本地方法时使用的栈,每个线程都有一个本地方法栈。
  特点:
    栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈桢(存储局部变量、操作数、方法出口);
    JVM为每一个线程创建一个栈,用于存储该线程执行方法的信息(实际参数,局部变量);
    栈属于线程私有,不能实现线程间的共享;
    栈的存储特性是"先进后出,后进先出";
    栈是由系统自动分配,速度快,栈是一个连续的内存空间。
3.2堆
  创建的所有java对象实例,都会被直接分配到堆上的。堆被所有的线程所共享。在堆上的区域,会被垃圾回收器做进一步划分。
  特点:
    用于存储创建好的对象和数组(数组也是对象);
    JVM只有一个堆,被所有线程所共享;
    堆是一个不连续的内存空间,分配灵活,速度慢。
3.3方法区
  方法区和堆一样,也是被所有线程所共享,储存着被虚拟加载的元数据(常量,静态变量即时编译器编译后的代码等数据)。
  特点:
    方法区是Java虚拟机的规范,jdk7之前存在”永久代“ 、 jdk7时,部分去除”永久代“, 静态变量、字符串常量池都挪到了堆内存中、jdk8是”元数据空间“和堆结合起来;
    JVM只有一个方法区,被所有线程共享;
    方法区实际也是堆,只是用于存储类和常量的相关信息;
    用来存放程序中永远不变或者唯一的内容。(class对象) 静态变量、 字符串常量。
3.4运行时常量池
  存放两大类常量:
    字面量(文本字符串 final常量值) ;
    符号引用,存放了一些与编译器相关的常量。
3.5直接内存
    直接内存并不属于java规范规定的属于java虚拟机运行时数据区的一部分。

4.this关键字

4.1对象创建的过程
  分配对象空间,并将对象成员变量初始化为0或空;
  执行属性值的显示初始化;
  执行构造方法;
  返回对象的地址给相关的变量。
4.2this的本质
  引用创建好对象地址
4.3this关键字的常见用法
  在程序中产生二义性之处,应使用this来指明当前对象;
  普通方法中,this总是指向调用该方法的对象;
  构造方法中,this总是指向正要初始化的对象;
  使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句;
  this不能用于static方法中。

5.static关键字

5.1使用static修饰
  成员变量(静态成员变量)
    静态成员变量存在方法区中,被当前类所有的对象所共享,在内存中只有一份;
    静态成员变量可以使用(对象名.变量名)的方式进行访问,但是不推荐;
    推荐使用(类名.变量名)的方式进行访问。
  成员方法(静态成员方法)
    静态成员方法可以使用(对象名.方法名)调用,但是不推荐;
    推荐使用(类名.方法名)的方式进行调用;
    静态方法只能直接调用其他的静态方法。
5.2不使用static修饰
  成员变量(实例成员变量)
    实例成员变量存储在对内存中,每个对象都有自己独立的实例变量,在内存中可以有多份;
    实例成员变量只能使用(对象名.变量名)的方式进行调用。
  成员方法(实例成员方法)
    实例方法可以直接使用静态和非静态的成员变量;
    实例方法只能使用(对象名.方法名)的方式调用;
    实例方法可以直接调用其他静态方法和非静态方法。

6.面向对象的三大特征

6.1封装
  含义
    封装是对类中的属性进行封装。将对象的属性和操作结合为一个独立的整体,并且尽可能隐藏对象的内部实现细节。
  优点
    提高代码的安全性;
    提高代码的复用行;
    “高内聚”:封装细节,便于修改内部代码,提高代码可维护性;
    “低耦合”:简化代码的调用,方便使用,便于扩展和协作。
  修饰符
    private:访问权限只能在本类;
    default:访问权限在本类或者在本包;
    protected:访问权限在本类、本包或者子类中;
    public:访问权限在本类、本包、子类、以及全部类。
  封装细节
    属性:使用private修饰 ;
    方法:供子类调用的方法,使用public关键字修饰
    提供相应的get/set方法供调用者使用(boolean类型的get()方法,以is开头)
6.2继承
  要点及使用
    如果定义一个类时,没有使用extends关键字,则它的父类就是:Java.long.Object;
    Java中类只有单继承,接口有多继承;
    子类继承父类,父类的全部属性和方法都归子类(构造方法除外);
    注意:父类中的私有属性和方法是不允许子类访问的;
    继承和组合:在子类中创建父类对象,然后通过父类对象调用父类属性和方法。
  作用
    提高代码复用性,更加容易实现类的扩展;
    方便对事务的建模。
  方法重写
    “>=” : 访问权限,子类大于等于父类
    “<=” : 返回值类型和声明异常类型,子类小于等于父类
    “==”:方法名、形参列表相同
  final关键字
    变量:被final修饰的变量,不能被重新赋值.
    方法:被final修饰的方法,不能被子类重写,但可以重载
    类:被final修饰的类,不能被子类继承
  instanceof
    规则 : 左边是对象名 中间是instanceof 右边类名
    使用 : arr instanceof ArrayList
6.3多态
  概念
    调用同一方法,由于对象的不同,可能会有不同的行为。
  要点
    多态是指方法的多态,不是属性的多态;
    需要满足的三个条件:继承、重写、父类类型的变量引用子类类型的对象;
    父类引用指向子类对象后,用父类类型的变量调用子类重写父类的方法,多态就产生了。
  类型的转化
    子类转向父类(自动转型)
    父类转向父类(强制转型)

7.抽象和接口

7.1抽象
  抽象方法
    使用abstract修饰的方法,没有方法体,只有声明.
  抽象类
    包含抽象方法的类一定是抽象类,抽象类中不一定有抽象方法.
  要点
    有抽象方法的类只能定义成抽象类 ;
    抽象类不能被实例化,即不能用new来实例化抽象类;
    抽象类可以包含属性、方法、构造方法。但是构造方法不能用来new实例,只能用来被子类调用;
    抽象类只能用来被子类继承;
    抽象方法必须被子类所实现。
7.2接口
  接口和抽象类的区别
    抽象类还提供了某些具体的实现,接口不提供任何实现,接口中的所有方法都是抽象方法。接口是完全面向规范的,规定了一批类具有的公共规范。
  接口的定义
    [访问修饰符] interface 接口名 [extends 父接口1,父接口2…] {
      [public static fianl] 类型 常量名 ;
      [pubulic abstract ] 返回值 方法名();
     }
  要点
    子类通过implements来实现,并且实现父接口中的所有方法;
    接口不能创建实例,可以声明引用变量的类型;
    JDK1.8(之前)接口中只能包含静态常量抽象方法,不能有属性、方法和构造方法;
    JDK1.8之后,接口中可以包含普通的静态方法和默认方法。在默认方法中可以调用静态方法,静态只能用接口来调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值