博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

JavaSE - 04类及成员

Posted on 2020-11-30 22:39  Kingdomer  阅读(7)  评论(0编辑  收藏  举报

JavaSE - 04类及成员 

(1)面向对象的三条主线 

  • Java类及类的成员:  属性、方法、构造器;代码块、内部类
  • 面向对象的三大特性: 封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)、【抽象】
  • 其他关键字:        this、super、static、final、abstract、interface、package、import

(1.1)面向过程(POP)与面向对象(OOP)

  • 面向对象: Object Oriented Programming     性能比面向对象高;单片机、嵌入式开发、Linux/Unix等开发。 
  • 面向过程: Procedure Oriented Programming  易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 
"面向过程"的编程思想 强调的是功能行为, 以函数为最小单位, 考虑怎么做。 
"面向对象"的编程思想: 强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
 

(2)面向对象的要素

> 类(Class)和对象(Object)是面向对象的核心概念。
  • 类是一类事物的描述,是抽象的、概念上的定义
  • 对象是实际存在的该类事物的每个个体,因而也称为 实例(instance)。

> 万事万物皆对象。

> 面向对象程序设计的重点是类的设计。

> 设计类,就是设计类的成员。
 

(3)Java类及类的成员

(3.1)常见的类的成员

  • 属性:对应类中的成员变量; 属性 = 成员变量 = field  = 域、字段
  • 行为:对应类中的成员方法; 方法 = 成员方法 = method = 函数

(3.2)类和对象的使用

创建类的对象 = 类的实例化 = 实例化类
  • 创建类,设计类的成员
  • 创建类的对象
  • 通过"对象.属性" 或 "对象.方法"调用对象的结构

创建了一个类的多个对象,每个对象都会独立的拥有一套类的属性。(非static的)。修改一个对象的属性a,不影响另外一个对象属性a的值。

public class Person {
    // 属性
    String name;
    boolean isMale;
    int age = 1;

    public void eat(){
        System.out.println("吃饭......");
    }

    public void sleep(){
        System.out.println("睡觉......");
    }
}
//--------------------------------------------------
public class PersonTest {
    public static void main(String[] args) {
        Person p1 = new Person();
        // 调用对象的结构: 属性、方法
        // 调用属性: "对象.属性"
        p1.name = "Tom";
        p1.isMale = true;
        p1.eat();
        p1.sleep();
        System.out.println(p1.name); // Tom

        Person p2 = new Person();
        System.out.println(p2.name);  //null
// 将p1变量保存的对象地址赋值给p3,导致p1和p3指向堆空间中同一个对象实体。 Person p3 = p1; System.out.println(p3.name); // Tom p3.age = 10; System.out.println(p1.age); // 10 } }

 

(3.3)对象的创建和使用:内存解析
 
匿名对象的使用
理解: 创建对象时,没有显式的赋给一个变量名。即为匿名对象。
特征: 匿名对象只能调用一次。
使用:
 

(4)类中的属性

属性(成员变量) vs 局部变量
> 相同点:
  • 定义变量的格式: 数据类型  变量名 = 变量值
  • 先声明,后使用
  • 变量都有其对应的作用域
> 不同点: 
  • 在类中声明的位置的不同
    • 属性: 直接定义在类的一对{}内
    • 局部变量: 声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量。
  • 关于权限修饰符的不同
    • 属性: 可以声明属性时,指明其权限,使用权限修饰符。常用的权限修饰符: private、public、缺省、protected。
    • 局部变量不可以使用权限修饰符。
  • 默认初始化值的情况
    • 属性: 类的属性,根据其类型,都有初始化值。
      • 整型(byte、short、int、long)   0
      • 浮点型(float、double)         0.0
      • 字符型 (char)                 0 或('\u0000')
      • 布尔型(boolean)               false
      • 引用数据类型(类、数组、接口)     null
    • 局部变量: 没有默认初始化值。意味着,调用局部变量之前,一定要显式赋值。形参在调用时,需赋值。
  • 在内存中加载的位置
    • 属性:     加载到堆空间中(非static)
    • 局部变量:  加载到栈空间

(5)类的成员之二: 方法(method)

(5.1)方法: 描述类应该具有的功能

  • public void eat() {}
  • public void sleep() {}
  • public String getName(){}
  • public String getNation(String nation) {}

(5.2)方法声明

权限修饰符  返回值类型  方法名(形参列表){  // static、final、abstract 修饰方法
    方法体
}
  • 权限修饰符: 默认方法的权限修饰符先使用public。4种:private、public、缺省、protected。
  • 返回值类型: 有返回值 vs  无返回值
    • 方法有返回值,必须在方法声明时,指定返回值的类型。方法中,使用return 返回指定类型的变量或常量。
    • 方法没有返回值,在方法声明时,使用void表示。方法中,不需要使用return。 如果使用的话,"return ;" 表示结束方法。
  • 方法名: 属于标识符,遵循标识符的规则和规范,"见名知意"
  • 形参列表: 方法可以声明0个,1个或多个形参。 格式: 数据类型1  形参1, 数据类型2 形参2,......
  • 方法体: 方法功能的体现。
return 关键字:
  • 使用范围: 在方法体重
  • 作用: 结束方法; 针对有返回值类型的方法,使用 "return 数据" 方式返回所要的数据。
  • 注意点: return 关键字后面不可以声明执行语句。
方法的使用中,可以调用当前类的属性或方法。特殊的:方法A 又调用了方法A:递归方法。方法中,不可以定义方法。
 

(6)方法进阶

(6.1)方法的重载(overload)

> 概念: 同一类中,允许存在一个以上的同名方法,只要他们的参数个数或者参数类型不同即可。
> 特点: 与权限修饰符、返回值类型、形参变量名、方法体无关,只看参数列表,且参数列表必须不同。调用时,根据方法参数列表的不同来区分。
> 实例:
  • int add(int x, int y) { return x+y;}           // 返回两个整数的和
  • int add(int x, int y, int z) { return x+y+z;}  // 返回三个整数的和
  • double add(double x, double y) { return x+y;}  // 返回两个小数的和

 

(6.2)可变形参的方法

JavaEE 5.0 提供了 Varargs(variable number of arguments)机制,允许直接定义能和多个实参相匹配的形参。从而,可以用一种更简单的方式,来传递个数可变的实参。
//JDK5.0之前:采用数组形参来定义方法,传入多个同一类型变量。   
public static void test(int a, String[] books);
//JDK5.0:采用可变个数形参来定义方法,传入多个同一类型变量。   
public static void test(int a, String ... books);
 
使用方式: 
  • 可变个数形参的格式: 数据类型 ... 变量名
  • 当调用可变个数形参的方法时,传入的参数个数可以是:0、1、2、...
  • 可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载
  • 可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载。
  • 可变个数形参在方法的形参中,必须声明在末尾。
  • 可变个数形参在方法的形参中,最多只能声明一个可变形参。
 

(6.3)方法参数的值传递机制

  • 方法,必须由其所在类或对象调用才能有意义。方法含有参数:
    • 形参:方法声明时的参数
    • 实参:方法调用时实际传给形参的参数值
  • Java里方法的参数传递方式只有一种: 值传递。将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。
    • 形参是基本数据类型: 将实参基本数据类型变量的"数据值"传递给形参。赋值的是变量保存的数据值。
    • 形参是引用数据类型: 将实参引用数据类型变量的"地址值"传递给形参。

 

(6.4)递归(recursion)方法

递归方法: 一个方法体内调用它自身。
方法递归包含了一种隐含的循环,他会重复执行某段代码,但这种重复执行无须循环控制。
递归一定要向已知方向递归,否则递归会变成无穷递归,类似于死循环。