JAVA学习笔记_Day5_OOP(面向对象)

复习

面向对象编程
1.类和对象

类:一类事物的总称 抽象的概念 抽象+封装
   是抽象数据类型 修饰词 class
   抽象:把一类事物具有共同的特点抽象成属性,把行为抽象成方法,属性和方法都用于描述一类事物
   封装:抽象之后,对属性和方法加以访问控制属性的限制
 对象:类的实例化,是类这个抽象概念具体化的结果,特指一个事物

2.类的定义

修饰词 class{
   //属性
   修饰词 类名 属性名;
   //方法
   修饰词 返回值类型 方法名(形参类表){
     //方法体
   }
}

3.实例化对象

new 类名 (实参列表);
 new的作用:1.分配内存(堆内存) 2.调用构造方法(构造器)

4.引用数据类型

类名 引用变量 = new 类名(实参列表);
左边 声明引用变量 右边 实例化具体对象

5.通过引用变量访问对象的属性和方法

引用变量.属性名;
引用变量.方法名(实参列表);

6.属性(也称 成员变量)

成员变量自动初始化 且 存放在堆区
每次实例化一个对象 对象拥有独立的属性

成员变量和局部变量的区别

  1. 成员变量自动初始化
      byte short int long  0
      float double      0.0
      char          ‘\u0000’
      引用类型        null
     局部变量必须初始化才能使用
  2. 成员变量在类里面,方法外面
     局部变量在方法里,形参也是局部变量
  3. 存储位置
     成员变量 存储在堆内存中
     局部变量 存储在栈内存中
    4.生命周期
     成员变量 对象实例化—>对象消亡
     局部变量 方法被调用—>方法调用结束
     局部变量和成员变量同名时,局部变量和隐藏(覆盖)成员变量,这时候直接访问的都是局部变量
     假如这时候要访问成员变量,通过this.属性名来访问成员变量

7.Java的三个分区

JVM对java程序进行内存分配
JVM对每一个java程序分为三部分:栈区、堆区、方法区
栈区:存储局部变量
堆区:存储对象的属性 例如通过new实例化的对象

8.构造方法(构造器)

类里面一个特殊的方法 用于对象属性的初始化
形如:
修饰词 类名(形参列表){

}
特点:
 构造方法名必须和类名相同
 构造方法没有返回值类型 不能为void
构造方法在每次实例化对象时被调用,构造方法可以重载,可以按照不同的方式来构造对象
如果一个类没有提供构造方法,那么JVM会提供一个默认的无参构造方法
如果一个类提供的构造方法,那么JVM将不会再提供默认的构造方法
正因为构造方法可以重载,所以在实例化对象时,根据参数列表的实参个数和类型来决定重载哪一个构造方法

9.this

在类的方法里面有一个隐含的引用变量,引用正在调用该方法的对象(正在构造的对象),该引用变量就是this
作用:
  区别成员变量和局部变量
  可以调用同类中的其他构造方法(例如子类可以调用继承的父类中的构造方法)
  this(实参列表); //只能放在构造方法的第一行
  super();    //只能放在构造方法的第一行
  正因为都只能放在构造方法的第一行,所以二者只能取其一

10.重载

概念:同一作用域中,方法名相同,形参列表不同的即构成重载
  与返回值类型无关
重载属于编译时语法,在编译代码时,编译器会根据调用重载方法时的实参的类型和个数来决定调用哪一个方法

JAVA学习_Day5

1.引用类型数组

数组:
引用数据类型
int[ ] arr = new int [3];
int [ ][ ]arr = new int arr[3][ ];
arr[0] = new int [3];
arr[1] = new int[5];
arr[2] = new int[7];
int [ ][ ]arr = new int[4][7];
引用类型数组:
引用类型数组其初始值都为null
 
Point[ ] arr = new Point[3]; //只实例化了数组对象,没有实例化Point对象,数组中的元素都为null
arr[0] = new Point(1,3); //实例化Point对象,让数组元素引用具体的对象
arr[1] = new Point(1,5);
arr[2] = new Point(2,4);
 
Point[ ][ ] brr = new Point[3][6]; //给数组对象分配了内存空间
brr[0][0] = new Point(1,1);  //实例化Point对象
brr[0][1] = new Point(1,5);
brr[0][2] = new Point(2,4);
 
Point[ ][ ]crr = new Point[2][ ]; //实例化了一个二维数组对象
crr[0] = new Point[3];  //实例化了一个一位数组对象,其元素都为null
crr[1] = new Point[4];
 
引用数据变量,存储的都是对象的地址信息
引用类型变量可以改变引用的对象 引用变量 = 对象;
通过引用修改对象的属性值    引用变量.属性名 = xxx;

2.null 和 java.long.NullPointerException

引用变量可以用null赋值,即该变量没用引用具体的对象,引用为空
这个时候如果通过该引用变量取访问对象的属性和方法,必然产生NullPointException

3.继承

从一个现有的类派生出一个新的类
一个类继承另外一个类,被继承的这个类称为父类(基类),新的类称为子类(派生类)
继承的语法:
class 子类 extends 父类{

}
子类拥有父类的所有属性和方法 子类实例化的对象,也是父类类型的对象
同时,子类可以定义自己的属性和方法
继承的意义
1.代码的复用
2.功能的扩展

4.子类的构造方法

----子类没有提供构造方法时,JVM会默认生成一个无参的构造方法
子类中会隐式调用父类的无参构造方法(如下)
class Child extends Father{
  Child(){
   super(); //隐式调用父类的构造方法
  }
}
如果父类没有无参的构造方法,那么子类就会报错
解决方法
1.给父类写入一个无参的构造方法
2.子类显示调用父类中的有参构造方法
  super(实参); //只能放在构造方法的第一行

5.父类类型的引用变量引用子类类型

父类类型的引用变量可以引用子类对象
通过父类类型的引用变量只能访问父类的属性和方法
每一个子类对象中,都有一个父类子对象
父类对象不一定是子类对象(饮料和可乐的关系)
子类对象一定是父类类型对象 即子类对象可以被父类类型引用

6.重写

子类可以重写父类中同名的方法
要求:
1.方法名相同
2.参数列表相同
3.返回值类型
  a.如果是基本数据类型 返回值必须一致
  b.如果是引用数据类型 子类重写方法的返回值类型可以是父类返回值类型的子类类型
4.子类重写方法的访问控制属性不能比父类的狭窄
5.子类不能声明比父类抛出更多的异常

7.多态

用父类类型的引用变量引用子类对象时,调用的是子类的重写的方法,这种现象称为多态
多态现象的基础:构成重写 父类类型引用子类对象
多态属于运行时语法:
  编译之后,没有绑定调用具体哪个方法,只有在运行时,才能确定调用哪个方法

面向对象的三大特征:封装、继承、多态

8.java的单一继承

一个类只能继承另外一个类,不能同时继承多个类(爹只有一个)

9.访问控制属性

public default protected private
一个类或者类里面的属性和方法可以通过访问控制属性来限制访问
封装:
把一类事物共同具有的特点抽象成属性,把行为抽象为方法,并加以访问控制属性的限制

位置 public protected 默认 private
本类中 Yes Yes Yes Yes
本包的子类中 Yes Yes Yes No
其他包的子类中 Yes Yes No No
本包中 Yes Yes Yes No
其他包的非子类中 Yes No No No

为什么不选择默认的访问控制属性?
  默认的访问控制属性以包为范围,不方便开发
访问控制权限有宽到窄:
public > protected > 默认 > private
public    完全公开
protected  本包中,或者子类中可以访问
默认    本包中即可访问
private   本类中
一个.java文件中只能有一个public修饰的类,而且这个类和文件名相同

10.package import

每一个java的开头都是package 包名;
一个类的全名其实包括了类名,例如在DAY1这个包里面定义一个Point类,那么类名是DAY1.Point
包的出现是为了区分类,避免类名相同而产生错误
如果要在一个包中,需要使用其他包中的类
 import 包名.类名;
 import 包名.*;

11.static

1.不可以修饰局部变量
2.修饰属性时,表示类属性,即该属性属于类,不属于对象;
  该类所有的对象共享一份
  可以直接通过 类名.类属性 的方式直接访问
  也可以通过 对象.类属性 进行访问
3.修饰方法时,表示类方法也称静态方法,即该方法属于类,不属于对象;
  可以通过 类名.类方法(实参) 调用静态方法
  也可以通过 对象.类方法(实参) 调用静态方法
类方法(静态方法)中只能访问 静态属性或者调用静态方法
不能访问成员属性和调用成员方法
类方法中没有this引用变量

成员属性和成员方法至少要有对象才能访问或者调用
4.修饰语句块
静态语句块 有且仅会执行一次
只在类加载时执行 .class文件加载到内存中
一个类只会被加载一次 所以静态语句块只会执行一次
一个类中可以有多个静态语句块 从上往下依次加载
父类会比子类先加载
常用于加载 图片、音乐、视频 等资源

12.final

1.final修饰局部变量
  局部变量不可以二次赋值
2.final修饰成员变量
  只能 直接初始化、构造方法中初始化、语句块中初始化三者选其一
3.final修饰方法
  方法不可被重写
4.final修饰类
  该类不可被继承
  String类除外
5.final和static一起修饰的属性 表示常量,类似于宏定义
  Math.PI
  对于final和static修饰的属性,只能直接初始化或者在静态语句块中初始化

13.语句块

在类里,方法外
形如:{
 //普通语句块 成员语句块
 //执行语句块
}
普通语句块,每次实例化一个对象就会执行一次 和 静态语句块有很大差别
每次实例化对象时语句执行顺序:
父类语句块–>父类构造方法–>子类语句块–>子类构造方法

你可能感兴趣的:(JAVA学习,java学习笔记,面向对象,封装继承多态)