6 面向对象之类和对象

时间:2021-07-29 16:29:49

1 面向对象和面向过程的区别

  两者都是软件开发思想,先有面向过程,后有面向对象。在大型项目中,针对面向过程的不足推出了面向对象开发思想。

区别:

  1)编程思路不同: 面向过程以实现功能的函数开发为主,而面向对象要首先抽象出类、属性及其方法,然后通过实例化类、执行方法来完成功能。

  2)封装性:都具有封装性,但是面向过程是封装的是功能,而面向对象封装的是数据和功能。

  3)面向对象具有继承性和多态性,而面向过程没有继承性和多态性,所以面向对象优势是明显。

2 类和对象

  对象:客观存在的实体(一个具体的事物)。

  类:具有相同特征和共同行为对象的集合。是人类脑海中一个抽象的概念,代表的是一种"共性".

  类中的成员:1.成员属性(描述外部特征) 2.成员方法(描述功能行为)

3 定义和访问类

  1)定义一个类:

    [修饰符] class 类名{

       //1.属性的定义:与定义变量类似

        [修饰符] 数据类型 属性名;

        //2.方法的定义

       [修饰符] 返回值类型 方法名(形参列表){

        //方法体;

        }

     }

2)访问类中成员

  a.访问属性:

       创建对象(创建实例):类名 对象名 = new 类名();

           赋值: 对象名.属性=值;

    属性(成员变量):作用域范围是在整个类体.

  b.调用方法

      静态方法(使用static修饰的方法):类名.方法名()

      普通方法(非static修饰的方法):对象名.方法名();

4 变量的作用域

  变量声明的位置不同会导致其作用域不同。

  局部变量:在方法内部声明的变量,其作用域仅限于当前方法使用。

  成员变量:在类中声明的属性,其作用域可以在当前类中使用。

区别:

   1.作用域不同:成员变量的作用域是在整个类体,局部变量的作用域在当前方法

   2.是否有默认初始值:成员变量是有默认的初始值,局部变量没有默认初始值。

      eg:int类型默认初始值为0  double类型默认初始值为0.0  boolean类型默认为false String默认为null

   3.是否能使用修饰符(public/private/protected/默认):成员变量:可以添加public等修饰符,局部变量不能。

   4.在内存中保存的位置不同:成员变量保存到堆中,局部变量保存到栈。

5构造方法

  构造方法(构造器):是一种特殊的方法,主要用于为成员变量初始化(为成员变量赋初始值)。

特征:

  1.方法名必须与类名相同。

  2.没有返回值类型。void也是一种返回值类型。

  构造的作用:为成员变量赋初始化值。

  语法: [修饰符] 类名([形参列表]){

  

        }

  构造方法使用new关键字进行调用。

  如果没有显式定义构造方法,虚拟机会自动添加无参构造,但是一旦显式定义了构造方法,虚拟机在编译时将不同添加无参构造(默认无参构造失效),如果需要调用无参构造就必须自己定义。

  构造方法是可以重载(方法名相同,参数列表不同)。

6 this关键字

  this关键字:代表当前对象本身

   1)用于区分成员变量和局部变量。

   2)可以使用this访问当前对象的成员变量和成员方法(可以使用this调用属性和方法)  this.方法名()或this.属性

   3)可以使用this调用构造方法,必须作为构造方法的第一行语句。

  public Dog(String name,String bland,int age){

    this.name=name;

    this.bland=bland;

    this.age=age;

  }

  public void test(){

  }

  this.name ;访问属性

  this.test(); 调用方法

7 值传递和引用传递

  数据类型可以分为基本数据类型和引用数据类型

  如果将基本类型作为方法参数属于值传递:方法执行结束后不会保留执行结果。

  如果将引用数据类型作为方法参数,属于引用传递,方法执行结束后会保留执行结果。

8 内存结构

  1)

   在方法中声明的局部变量保存在栈中,方法执行结束后栈中数据会被回收

  2)堆

   堆中保存的是对象的信息,使用new关键字创建的对象信息。堆中信息会被java的垃圾回收器回收。

  3)方法区

   保存的是类的信息(代码)、静态(static)变量、字符串常量等。

9 static关键字

  1)static修饰的变量为静态变量,类变量

    访问方式:  类名.变量名(推荐)    对象名.变量名

   ①成员变量和全局变量的区别:

      a.在计算机内存中保存的位置不同:

       成员变量保存在堆中,全局变量保存在方法区

      b.保存的份数不同

       成员变量每new一次都开辟空间,保存多份。

       全局变量只有1份

      c.访问方式不同

       成员变量: 对象名.属性,可以使用this关键字。

       全局变量: 类名.属性(推荐) 对象名.属性    

      d.创建时间不同:

       成员变量:只有使用new关键字创建对象时才会在堆中为其分配空间

        全局变量:在类加载时在方法区中分配空间。

  2)使用static关键字可以修饰方法:静态方法或类方法

    特点:静态方法中无法访问非静态的成员变量或方法;但非静态的方法中是可以访问静态的成员

    访问方式: 类名.方法名(推荐) 对象名.方法名

  3)使用static修饰代码块,静态代码块

      语法:static{

         //代码

         }

     执行过程:在类加载时执行静态代码块。静态代码块>普通代码块>构造方法。只会执行1次。

   

   代码块:使用花括号包含的代码。使用比较少。不需要显式调用。

   代码块的执行顺序:在创建实例时执行。代码块在构造方法之前执行,并且按照顺序执行,每创建一个对象就会执行1次。执行多次。

    类中代码的执行顺序: 静态代码块>代码块>构造方法>静态方法或实例方法。

  静态的方法中只能访问静态变量, 非静态的方法可以访问静态或非静态的变量

10 package和import关键字

  1)package关键字主要用于声明包。

   java中的包:类似文件夹

   作用:1.分门别类进行存放数据,方便分类和管理。2.避免命名冲突。

   包的命名规范:所有字母都是小写,多级包名之间利用.进行分割

  java中常见的包: java.lang包之外的其他包下的类,使用时需要导包。

   * java.lang包:java核心类库,String,System,Math... 该包下的类可以直接使用,无需导包。

   * java.util包:工具类。 Arrays,Scanner...

   * java.io包:i(input)/o(output)和java中流的输入和输出相关的类库。

   * java.net包:网络编程相关的类库。

   * java.sql包:与数据库操作相关的类库。

   * java.text包:国际化或格式化输出相关的类库。

   * java.awt包/javax.swing包:图形化界面相关的类库

 

   * 声明包:使用package关键字,必须放在该类的第一行。

   * 语法: package 包名;  eg:cn.zzsxt.oop7;

  2)导入包: import关键字,在使用非当前包下的其他包下的类时需要导包

     方式一: import 包名.*;将整个包导入。 eg: import cn.zzsxt.oop6.*;

     方式二(推荐): import 包名.类名; eg:import cn.zzsxt.oop6.TestStatic;

  

   *直接使用全类名进行访问: 包名.类名;

      cn.zzsxt.oop6.TestStatic testStatic = new cn.zzsxt.oop6.TestStatic();

   *特殊场景:不同的包下存在相同的类名。

       import java.util.*;

       import java.sql.*;

     java.util.Date date = new java.util.Date();

  3)静态导入

    package cn.zzsxt.oop7;

    import static java.lang.Math.*;

    import static java.lang.Math.PI;

    import static java.lang.Math.random;

    静态导入:JDK1.5之后的新增特性。

    语法: import static 包名.类名;

    作用:如果使用静态导入某个类或类中属性和方法,可以直接使用该类中的静态属性或静态方法。

    System.out.println(Math.PI);

     double rand = Math.random();

     System.out.println(rand);

     System.out.println(PI);//使用java.lang.Math类中的静态属性

    System.out.println(random());//使用java.lang.Math中的静态方法

 

}