[Java学习笔记]-Java对象和类

Java是完全面向对象的高级语言,其基本的操作基本都是针对相应的对象和类。面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。对应面向对象的语言,还有一种面向过程的语言,如C语言。面向对象的语言是在面向过程语言的基础上发展而来的。面向对象(OOP,全称为Object-Oriented-Programer,下文简称为OOP)相对于面向过程的语言而言,其优势在于很多问题的解决方法被封装在对象里,有时只需要创建这样的对象就可以解决我们的问题,而不必关心其具体实现细节,这很明显给开发带来了极大的方便。

在面向过程的语言中,著名的匈牙利数学家计算机学家冯诺依曼有一个经典的观点:算法+数据结构=程序。在这种编程语言下,程序员必须首先确定如何操作数据,也即把解决问题的具体过程实现即算法,之后再考虑如何组织数据。而OOP却调换了这个次序,把数据放在了第一位,然后再考虑算法。

下面就是Java语言中重要的几个概念:类class、对象object、方法method

1.类class

1.1什么是类

类(class),就是构造对象的模板和蓝图。通俗的讲,类是人类大脑对应现实生活中很多个体表现出来的共性的特点抽象出来在意识领域代表该个体的一个概念。举例来说,人不是自然界存在的概念,“人”只是我们对于我们人类的抽象描述,它代表一个个体,也可以表示我们整个人类群。当我们把说到人类时,不是说某个具体的人,而是泛指。

1.2如何声明一个类

在Java中声明定义一个自定义类的格式很简单:class classname{}。

这里出现了一个单词class,这是Java的关键字,定义类时必须写上,classname就是一个名称。它是一个合法的Java标识符。再就是一对“{}”,定界符,表示类的主体。当然,这里省略了可以修饰类的修饰符如,权限修饰符public等。

1.3类有什么好处

我觉得“类”的引入,在编程语言中是很大的进步。因为,类就像一个可以快速生产对象的工厂。由类构造对象的过程我们称为创建类的实例。类有三大特点:封装、继承、多态。这三大特性构成了使用类的好处。后面对具体举例说明。

2.对象object

2.1什么是对象

对象,是现实中具体的事物。如,美国总统奥巴马。在OOP中对象才是真正解决问题的。而在面向过程语言中,我们的问题全抛给了程序员,往往是程序员编好具体对应的程序来解决该类问题。OOP中问题的解决方法都封装在对象里,都写在了类主体里面。程序员有时并不需要去编写很多代码来解决手边的问题,只有有解决这样问题的类存在,程序只需要在程序中创建类对象,直接调用对象来处理。

2.2如何创建一个对象实体

在Java中,创建对象也很简单。只要一个操作符new即可。如,创建一个日历类对象:new GregorianCalendar();

2.3对象的三大特征

2.3.1对象的行为——可以对对象施加那些操作?可以对对象施加那些方法?

2.3.2对象的状态——当施加那些方法后,对象如何响应?

2.3.3对象的标识——如何辨识具有相同行为而状态不同的对象?

3.方法method

3.1什么是方法

方法,顾名思义就是解决问题的方式。在C语言中,方法一般叫函数。必须明确的是,函数也即方法,是解决具体问题的代码级的东西。这里就是程序员的工作内容。所有的计算机语言,在这里都是一样的,都是程序员按照计算机思维遵循语言本身的语法编写的一行行代码。

3.2方法的写法

有过学习C语言的人,知道方法或函数的定义很简单。在Java中具体定义格式: 返回值类型 函数名称(参数表列){语句;…}

同样,这里也省略了一些可以修饰方法的修饰符,像修饰访问权限的关键字public。

4.Java语法-对象和类

4.1对象和对象变量(类类型变量)

我们知道要想使用对象,则事先必须构造好对象,并指定其初始状态,然后再对对象应用方法。在Java语言中,使用构造器(constructor)来构造新实例。构造器是一个特殊的方法,专门用来在创建新对象时对对象进行的个性化初始化。可以这样说,构造器也称构造方法是面向对象使用的。现在可以进行创建一个对象了。具体操作如下:

//现在我们开始使用new操作符和构造器来创建对象
Date time = new Date();
new 操作符用于创建类的实例也就是对象,但不是所有的类都需要使用到new,比如,如果创建String字符串类型的对象,直接赋值即可完成创建。如果使用了new 操作符,往往后面还会有一个类似函数的带圆括号的部分,这是类的构造器部分,可以对新创建的类的对象实现一些必要的初始化工作。
匿名对象:如果一个对象只需要使用一次,可以不必为其命名。使用new Date();即可创建一个匿名的Date类对象。
对象变量:time 就是一个Date类的对象变量,也称类类型变量。可以对比下,基本数据类型变量的定义。
//现在我们看看基本数据类型的变量的声明
int age = 18;
在这里,我们可以把int看成和Date相同的功能,即表明age的类型,很明显数字18是一个独立对象,只不过没有使用new操作符罢了。

4.2数据封装及公共访问器方法

建议绝大部分实例域的访问权限最好定义为private。因为如果定义为public则任何类都可以随意访问并修改实例域,这不仅是非常危险的,而且违背了Java语言的封装性。如果我们把数据进行封装,那么问题又来了,外部类不可避免地要访问数据,又不希望外部类随意访问修改域,那么该怎么做?

这时,我们就应该给要封装的数据域提供一个公共的对外的接口:访问器方法和更改器方法。通常,我们习惯在访问器方法名前面加上前缀get,在更改器方法名前面加上前缀set。

  • 示例代码
import java.util.GregorianCalendar;
import java.util.Calendar;
import java.util.Date;
class Employee
{
    //instance fields,实例域,成员变量
    private String name;
    private double salary;
    private Date hireDay;

    //constructors,构造器
    public Employee(String name,double salary,int year,int month,int day)
    {
        this.name = name;
        this.salary = salary;
        GregorianCalendar gc = new GregorianCalendar(year,month-1,day);
        this.hireDay = gc.getTime();
    }

    //instance methods,成员方法
    //以下全是访问器方法
    public String getName()
    {
        return this.name;
    }
    public double getSalary()
    {
        return this.salary;
    }
    public Date getHireDay()
    {
        return this.hireDay;
    }
}
public class EmployeeDemo
{
    public static void main(String[] args)
    {
        Employee[] staff = new Employee[3];

        staff[0] = new Employee("丁敏",2000.0,2015,7,10);
        staff[1] = new Employee("贺鹏飞",3000.0,2015,8,2);
        staff[2] = new Employee("姚文鑫",3120.0,2016,6,16);
        for(Employee e:staff)
        {
            System.out.println("Name:"+e.getName()+" Salary:"+e.getSalary()+" HireDay:"+e.getHireDay());
        }
    }
}
  • 代码执行结果

4.4用户自定义类

4.4.1实例域

前面已经创建过实例域,就是成员变量。该域往往是类的实例的具备的属性、状态。它们绝大部分为基本数据类型。

4.4.2构造器

构造器,就是创建类对象的工厂。构造器一般有以下特点:

1)和类名同名;

2)没有返回值;

3)支持无参,多参的参数表列;

4)总是伴随new操作符一起调用;

5)每个类可以有一个以上的构造器方法。

4.4.3隐式参数

在这里,隐式参数指的是this关键字。this的作用有二个:

1)用于区分形参局部变量和实例域(成员变量),如下方法中如果没有this就难以区分name是传入的name局部变量还是对象的实例域

//你能分清哪个name是局部变量name?哪个是实例域name?
public void  method(String name){
    name = name;
}

//如果把上面的函数改成如下格式,很容易分清name所属
public void method(String name){
    this.name = name;
}

//当然,很多程序员习惯在局部变量名前加上前缀a
public void method(String aName){
    name = aName;
}

2)this第二个用法就是在多个构造器之间相互调用充当构造器本身

//假设这里二个构造器
public Employee(String name,int age){
    this.name = name;
    this.age = age;
}

//这是另一个构造器,如果不使用this关键字
public Employee(String name,int age ,String sex){
    this.name = name;
    this.age = age;
    this.sex = sex;
}

//很显然,这样就出现代码重复,显得冗余,如果使用this关键字则
public Employee(String name,int age ,String sex){
    this(name,age);//这里调用另一个构造器
    this.sex = sex;
}

4.5静态修饰符static

静态修饰符,static可以修饰实例域,可以修饰成员方法。必须明确的一点是,static声明的东西是面向类存在的。就是类的生存周期就是static修饰的东西的生存周期。static修饰的东西不是依赖于对象存在,而是优先于对象存在。

  • 示例代码
import java.util.Random;
class StaticBlock
{
    //inistance field,实例域,成员变量
    private String name;
    private int id;
    private static int nextId;

    //constructors,构造器
    StaticBlock(){}
    StaticBlock(String aName)
    {
        name = aName;
        System.out.println("我是构造器,我是在执行完初始化块之后再执行");
    }

    //initialization block,初始化块,构造代码块
    {
        name = "丁敏";
        id = nextId;
        nextId++;
        System.out.println("我是初始化块也叫构造代码块,面向对象,没有静态初始化块则我是最先执行");
    }

    //static initialization block,静态初始化块,静态构造代码块
    static{
        Random generator = new Random();
        nextId = generator.nextInt(10000);
        System.out.println("我是静态初始化块,面向类,我比初始化块更早执行且无论new多次我只执行1次");
    }

    //instance method,成员方法
    public String getName()
    {
        return name+"#"+id;
    }
}
class StaticBlockDemo
{
    public static void main(String[] args)
    {
        System.out.println(new StaticBlock().getName().toString());
        System.out.println(new StaticBlock("王祥").getName().toString());
    }
}
  • 程序执行结果

总结:通过Java语法的学习,掌握好Java的语法基础,才能写出高质量的代码。要记得这些语法一点不犯错,这几乎是不可能的,只有在遇到问题时,不断解决问题,这样才能真正掌握Java的语言。最有效的一点时,编译器会告诉我们那里有问题,该怎么解决。有时,还得自己先猜想这样可不可以,再通过编写相应的测试用例来验证猜想,这也是快速提高的方法之一。当然,好记性不如烂笔头,要多记更要多敲代码。

时间: 2024-11-17 03:13:42

[Java学习笔记]-Java对象和类的相关文章

java学习笔记07--日期操作类

java学习笔记07--日期操作类 一.Date类 在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可. [java] view plaincopy public class T { public static void main(String[] args) { Date date  = new Date(); System.out.println("当前日期:"+date); //当前日期:Thu May 16 23:00:57 CST 

Java学习笔记_23_List接口实现类

23.List接口实现类: List接口继承了Collection接口,它是一个允许存在重复项的有序集合. 1>实现类ArrayList: ArrayList类支持可随需要而增长的动态数组.数组列表以一个原大小被创建,当超过了它的大小, 类集自动增大,当对象被删除后,数组就可以缩小. 优点:ArrayList类对于使用索引取出元素用较高的效率,他可以用索引快速定位对象. 缺点:ArrayList类对于元素的删除或插入速度较慢. 构造方法: · ArrayList(): 构造一个初始容量为10的空

javascript学习笔记---ECMAScriptECMAScript 对象----定义类或对象

使用预定义对象只是面向对象语言的能力的一部分,它真正强大之处在于能够创建自己专用的类和对象. ECMAScript 拥有很多创建对象或类的方法. 原始的方式 因为对象的属性可以在对象创建后动态定义(后绑定),类似下面的代码: var oCar = new Object; oCar.color = "blue"; oCar.doors = 4; oCar.mpg = 25; oCar.showColor = function() { alert(this.color); };不过这里有一

java学习笔记(三)类,对象,包

在面向对象编程中,程序不是围绕着要解决的任务来设计,而是围绕着要解决的问题的对象来设计. 类:是具有相同属性和行为的一组对象的集合,类中要包含这个类的属性和方法,但并不是所有的类都必须包含属性和方法. 例:编写一个学生类,学生拥有学号,姓名,年龄,性别等. /** *学生类 */ public class Student{ /* 属性 */ public int stuNo; public String name; public int age; public String sex; /* 方法

疯狂java学习笔记之面向对象-定义类、方法、构造器

Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. java程序中,类是最小的程序单位 - 所有的java程序都必须从定义类开始 定义类的语法格式: [修饰符]  class  类名{ //0 ~ N 个 Field 定义 //0 ~ N 个 方法定义 //0 ~ N个 构造器定义 } 一个类中最多只能出现五种成分:Field.方法.构造器 一个类最常见

Java学习笔记----Java基础11 对象引用

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们之前一直在使用“对象”这个概念,但没有探讨对象在内存中的具体存储方式.这方面的讨论将引出“对象引用”(object reference)这一重要概念. 对象引用 我们沿用之前定义的Human类,并有一个Test类: public class Test { public static void main(String[] args) { Human aPerson = new

[Java学习笔记] Java核心技术 卷1 第四章

第4章 对象与类 4.1 类和对象的基本概念 描述了类和对象的基本概念,以及类之间的关系介绍. 程序中的很多对象来自于标准库,还有一些自定义的. 结构化程序设计:通过设计一系列的过程(算法),选择合适的存储方式来解决问题. 算法+数据结构 4.1.1 类/封装/继承 类是构造对象的模板,由类构造对象的过程称为创建类的实例. 封装:也称为数据隐藏.从形式上看,封装不过是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式.优点4.2.3 实例域:对象中的数据. 方法:操纵数据的过程.

Java学习笔记七——数组工具类Arrays

数组工具类Arrays Java提供的Arrays类里包含的一些static修饰的方法可以直接操作数组.若将里面的方法用熟的话,那开发效率会大大提高.下面介绍其中的方法. List<T> asList(T... a) 作用:将指定数组或数组元素,转换成固定大小的List. 用法: String[] strArr = { "aaa", "bbb", "vvv" }; //用法1:参数是数组引用 List<String> li

Java学习笔记五:复用类

当我们在使用第三方或者其他人已经写好的类时,通常有两种方法: (1).组合:在新的类中产生现有类的引用. (2).继承:按照现有类的类型创建新类.   1.组合 简单理解就是新类中,创建一个变量,变量的引用为现有类. 我们在很多场景下都是用到组合,如: public class Lesson_04_Extend { private Extend1 extend1; // 组合方式,创建成员变量(UML 组合关系) public void print(Extend1 extend2) // (UM