面向对象

来源:互联网 发布:与外国人学外语知乎 编辑:程序博客网 时间:2024/06/07 22:08


类: 
  对某些事物的统称,会包含这是事物的属性和行为
 对象:
  唯一,独立,特殊,的个体

一. 创建对象,对象空间成员变量的默认值
 SuperHero sh = new SuperHero();
 
 在创建对象的时候,没有对对象里面的成员变量进行赋初值操作,所以里面所有的
 成员变量都是 0 值
  常用数据类型的对应 0 值
  int  0
  byte 0
  long 0
  short 0
  
  double 0.0
  float 0.0f
  
  char '\0'
  
  boolean false
  
  String null  //引用数据类型的初值都是null 编号为0的内存
 
二. 成员变量和局部变量的区别
  定义位置的区别:
   1. 成员变量是定义在类里面的
   2. 局部变量是定义在方法里面的普通变量
                                                                
  作用上的区别:
   1. 成员变量是用来描述一类事物的公共属性 
   2. 局部变量是给函数提供一个用来保存数据的变量内存空间,只是当前函数或者代
   码块里面可以使用
  
  初始值的区别:
   1. 成员变量的初始值是在创建对象的时候才有的,如果创建时没有赋初值,那么所
   用的成员变量都是0值
   2. 局部变量在创建的时候,是没有确定值,只能通过赋值操作给予一个确定的数据
   ,在Java中不能使用未赋值局部变量
  
  [生存周期] 
   在代码中 一个变量或者一个对象从创建开始,到销毁结束,这就是他的生存周期
  
  生存周期的区别:
   1. 成员变量的生存周期是随对象创建而生,随着对象的销毁而不复存在【内存的堆
   区】
   2. 局部变量是在声明变量而生,在函数结束或者代码块结束,销毁【内存的栈区】
三. 多类使用
四. 匿名对象
   在Java中有些类创建之后就是调用了某个方法一次,之后再也不使用,这样会导致资源浪费,以及代码的臃肿
 Java提供了一种方式:
  匿名对象!!!
  
  匿名对象的格式:
   new 类名().调用的方法();
   
  作用:
   简化书写
  
  匿名对象的使用场景:
   1. 在代码中,有一些类对象只使用一次,是通过这个类对象来调用这个类的某些方法,这个可以用匿名对象
   类完成
   2. 可以作为函数的实际参数传递
  
五. 封装思想
 面向对象的三大特征:
  1. 封装
  2. 继承
  3. 多态
 
 【问题】
  代码中,程序只会严格的执行数据类型一致化问题,不会判断你书写代码是否符合生活逻辑。
  那么就有可能再赋值或者运算过程中,某些参数或者方法,使用的是不符合业务逻辑
 
 【考虑】
  能不能对于赋值数据,使用数据的方式进行一定程度上的保护
  
 【封装思想】
  
  权限标识符:
   public:公有的,公共属性,用public 修饰的 成员变量和方法是任何人都可以使用的
   
   private:私有的,用private修饰的成员变量或者成员方法只能在本类当中使用,类外不能直接使用
 
  [问题]
   使用private可以把一些成员变量私有化,类外不能轻易的使用,但是赋值和使用遇到了问题?
   
  【set 和  get 方法】
  set方法就是用来在类外【设置】类当中的,用private修饰的成员变量的值
  get方法就是用来在类外【获取】类当中的,用private修饰的成员变量的值
  
  【什么时候用private 封装数据】
  在编程中如果遇到【实体类】,生活中实际存在的类,通常就会被这个类当中的数据全部私有化private
  
  【使用set的好处】
  1. 使用set 可以将数据的赋值操作更加安全和符合业务逻辑
  2. 可以将使用的方法进行保密,只给外部提供了一个使用的接口
  
  【封装的好处】
   1.提供了 代码的安全性
   2.操作数据变的简单
   3.隐藏一部分代码
   
  【要求】
   从今天开始,所用的类,成员变量属性全部用private修饰
 
六. 构造函数
  需求:用Java描述一个Baby类,
 一个孩子出生之前都会有名字,用代码来展示这一过程
 
  【构造函数】
 
   构造函数的功能:初始化类对象
   
   构造函数的格式:
    修饰符 类名() {
     语句体;
    }
    
   构造方法的一些小细节:
    1. 构造方法 没有返回值
    2. 构造方法的函数名必须和类名一致
    3. Java编译器的功能, 当一个类当中没有构造方法的时候,Java编译器会自动帮我们提供一个无参的
    构造方法
    4. 当自定义类中已经存在构造方法,那么Java编译器不会在帮我们提供一个无参的构造方法
    5. 一个类当中可以根据不同的使用情况,定义多个构造方法,这里利用的是Java当中的函数【重载】机制
    
   构造方法和成员方法的区别:
    返回值区别:
     1. 构造函数没有返回值
     2. 普通函数是必须有返回值的,就是真的没有返回值,也要void填充
    
    函数名区别;
     1. 构造函数必须是类名
     2. 普通函数只要符合命名规范就OK
    
    作用区别:
     1. 构造函数是用来创建对象和初始化的!!!
     2. 普通函数想做什么就写什么,可以根据我们的实际需要来定义各种各样的函数
    
    调用方式区别:
     1. 构造函数 实际上的使用者是JVM(Java虚拟机), 是JVM在创建对象的时候要调用的方法
     2. 普通函数只能通过对象或者【类名】来调用这个函数

   
   反编译工具
    javap -c -l -private ***.class
    -c 反编译的选择
    -l 显示行号和本地变量
    -private 显示所有类和成员
    ***.class 就是javap要反编译的class 文件
    [发现]通过反编译能够发现,当类中没有一个构造函数的时候,Java编译器会自动帮我们补充一个
    无参的构造函数
    包名.类名()    //fhdksafjldasjfkldjsal "init"