zoukankan      html  css  js  c++  java
  • JavaSE对象


    对象与对象变量

    要想使用对象,就必须首先构造对象,并指定其初始状态。然后,对对象应用方法。在Java 程序设计语言中,使用构造器(constructor)构造新实例。构造器是一种特殊的方法,用来构造并初始化对象。

    • 造器的名字应该与类名相同。以Date类为例,其构造器名为Date。要想构造一个Date对象,需要在构造器前面加上new 操作符,如下所示:
    new Date()
    
    • 使用构造器创建的对象可以多次使用,只需将其对象存放到一个变量中:
    Date now = new Date();
    // 对 对象进行调用
    String time = now.toString();
    
    • 象与对象变量之间有一个重要的区别:下面语句定义了一个对象变量now,它可以引用Date类型的对象。但是,一定要认识到:变量deadline 不是一个对象,实际上也没有引用对象。此时,不能将任何Date方法应用于这个变量上
    Date time; // now doesn't refer to any object
    String s = time.toString(); // 编译错误
    
    • 先初始化变量now:以下代码使两个对象变量(now、time)都指向了Date对象,注意:对象变量并没有实际包含一个对象,而仅仅引用一个对象,
    // 使用构造器创建对象变量
    now = new Date();
    
    // 或者让该变量引用其他对象变量
    now = time;
    

    在 Java 中,任何对象变量的值都是对存储在另外一个地方的一个对象的引用,new操作符的返回值也是一个引用。

    • 下列代码有两个部分。表达式 new Date() 构造了一个 Date 类型的对象,并且它的值是对新创建对象的引用。这个引用存储在变量 birthday 中!
    Date birthday = new Date();
    

    隐式参数和显示参数

    • 方法用于操作对象以及存取它们的实例域

    例如:以下示例。raiseSalary方法有两个参数。第一个参数称为隐式 (implicit) 参数,是出现在方法名前的 Employee 类对象 jason。第二个参数位于方法名后面括号中的数值,这是一个显式 (explicit ) 参数

    public class Employee{
        
        int salary;
        
        ...
        
        public void raiseSalary(double byPercent)
            {
                double raise = salary * byPercent / 100;
                salary += raise;
            }
    }
       
    ...
    Employee jason = new Employee();
    jason.raiseSalary(5)
    

    基于类的访问权限

    • 方法可以访问所调用对象的私有数据。一个方法可以访问所属类的所有对象的私有数据
    class Employee
    {
        public boolean equals(Employee other)
        {
            return name.equals(other.name) ;
        }
    }
    

    私有方法

    • 在实现一个类时,由于公有数据非常危险,所以应该将所有的数据域都设置为私有的
    • 尽管绝大多数方法都被设计为公有的,但在某些特殊情况下,也可能将它们设计为私有的。

    例如: 可能希望将一个计算代码划分成若干个独立的辅助方法。通常, 这些辅助方法不应该成为公有接口的一部分,这是由于它们往往与当前的实现机制非常紧密,或者需要一个特别的协议以及一个特别的调用次序。最好将这样的方法设计为private的。在Java中,为了实现一个私有的方法, 只需将关键字public 改为private 即可


    final实例域

    • 可以将实例域定义为final。构建对象时必须初始化这样的域。也就是说, 必须确保在每一个构造器执行之后,这个域的值被设置,并且在后面的操作中,不能够再对它进行修改。
    • 例如,可以将Employee类中的name域声明为final,因为在对象构建之后,这个值不会再被修改,即没有setName 方法。
    class Employee
    {
        private final String name;
        ...
    }
    

    静态域与静态方法

    静态域

    • 如果将域定义为static,每个类中只有一个这样的域。而每一个对象对于所有的实例域却都有自己的一份拷贝

    例如: 假定需要给每一个雇员赋予唯一的标识码。这里给Employee类添加一个实例域id 和一个静态域nextld

    class Employee
    {
        private static int nextId = 1;
        
        private int id;
        ...
    }
    
    • 现在,每一个雇员对象都有一个自己的id域,但这个类的所有实例将共享一个nextId域。

    如果有1000个Employee类的对象,则有1000个实例域id。但是,只有一个静态域nextld。即使没有一个雇员对象,静态域nextId也存在。它属于类,而不属于任何独立的对象。

    静态常量

    • 静态变量使用得比较少,但静态常量却使用得比较多

    例如: 在Math类中定义了一个静态常量,在程序中,可以采用Math.PI的形式获得这个常量

    public class Math
    {
        public static final double PI = 3.14159265358979323846;
    }
    
    • 如果关键字 static被省略,PI就变成了Math类的一个实例域。需要通过Math 类的对象访问PI,并且每一个Math 对象都有它自己的一份PI 拷贝。

    静态方法

    • 静态方法是一种不能向对象实施操作的方法
    • Math 类的pow 方法就是一个静态方法。表达式Math.pow(x,a),在运算时,不使用任何Math 对象,换句话说,没有隐式的参数

    例如: Employee类的静态方法不能访问Id实例域,因为它不能操作对象。但是静态方法可以访问自身类中的静态域

    public static int getNextId()
    {
        return nextId; // returns static field
        
    }
    
    ...
    
    int n = Employee.getNextId(); //可以通类名调用上面的方法
    
    • 以下情况使用静态方法
      • 一方法不需要访问对象状态,其所需参数都是通过显式参数提供(例如: Math.pow )
      • 一个方法只需要访问类的静态域( 例如:Employee.getNextld )

    main 方法

    • main 方法也是一个静态方法,它不对任何对象进行操作
    • 在启动程序时还没有任何一个对象。静态的 main 方法将执行并创建程序所需要的对象
    public class Application
    {
        public static void main(String[] args)
        {
            // construct objects here
        }
    }
    

    对象构造

    重载

    待续

    默认域初始化

    如果在构造器中没有显式地给域赋予初值,那么就会被自动地赋为默认值: 数值为0、布尔值为false、对象引用为null

    无参数的构造器

    • 对象由无参数构造函数创建时, 其状态会设置为适当的默认值
    • 如果在编写一个类时没有编写构造器,那么系统就会提供一个无参数构造器

    例如:Employee 类的无参数构造函数

    public Employee()
    {
        name = "";
        salary = 0;
        hireDay = LocalDate.now();
    }
    

    调用另一个构造器

    关键字this 引用方法的隐式参数。然而,这个关键字还有另外一个含义,如果构造器的第一个语句形如this(...),这个构造器将调用同一个类的另一个构造器

    • 当调用new Employee(60000)时,Employee(double)构造器将调用Employee(String,double)构造器
    public Employee(double s)
    {
        // calls Employee(String, double)
        this("Employee #" + nextId, s);
        nextld++;
    }
    

    初始化块

    • 在一个类的声明中,可以包含多个代码块。只要构造类的对象,这些块就会被执行

    例如: 无论使用哪个构造器构造对象,id域都在对象初始化块中被初始化。首先运行初始化块,然后才运行构造器的主体部分

    class Employee
    {
        private static int nextId;
        private int id;
        private String name;
        private double salary;
        
        // object initialization block
        {
            id = nextId;
            nextId++;
        }
        
        public Employee(String n, double s)
        {
        
            name = n;
            salary = s;
            
        }
        
        public Employee()
        {
        name = "";
        salary = 0;
        }
        ...
    }
    
  • 相关阅读:
    C# 用装饰模式
    31天重构学习笔记4. 降低方法
    JData 使用教程 对输入数据进行验证(服务端验证)
    sql over的作用及用法
    31天重构学习笔记3. 提升方法
    《博客园精华集》
    const和static readonly 区别
    JData 使用教程(四) 对输入数据进行验证(客户端验证)
    用JQuery制作简单实用的下拉菜单
    图片压缩后,依然很大的解决方案
  • 原文地址:https://www.cnblogs.com/code-duck/p/13226844.html
Copyright © 2011-2022 走看看