Java 基础——类和对象

Java作为一种面向对象语言。支持以下基本概念:

•多态
•继承
•封装
•抽象
•类
•对象
•实例
•方法
•消息解析

本节我们重点研究类与对象的概念。

对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。

类:类是一个模板,它描述一类对象的行为和状态。

Java中的对象

现在让我们深入了解什么是对象。看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。所有这些对象都有自己的状态和行为。
拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。
对比现实对象和软件对象,它们之间十分相似。
软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。
在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。

Java中的类

类可以看成是创建Java对象的模板。
通过下面一个简单的类来理解下Java中类的定义:

[java] view plaincopy
  1. public class Dog{  
  2.    String breed;  
  3.    int age;  
  4.    String color;  
  5.    void barking(){  
  6.    }  
  7.      
  8.    void hungry(){  
  9.    }  
  10.      
  11.    void sleeping(){  
  12.    }  
  13. }  


一个类可以包含以下类型变量:

局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。

成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。

类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。

一个类可以拥有多个方法,在上面的例子中:barking()、hungry()和sleeping()都是Dog类的方法。 


构造方法

每个类都有构造方法。如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法。
在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。
下面是一个构造方法示例:

[java] view plaincopy
  1. public class Puppy{  
  2.    public puppy(){  
  3.    }  
  4.   
  5.    public puppy(String name){  
  6.       // 这个构造器仅有一个参数:name  
  7.    }  
  8. }  
Java也支持单例类,这种类只允许你创建单个实例。

创建对象

对象是根据类创建的。在Java中,使用关键字new来创建一个新的对象。创建对象需要以下三步:

声明:声明一个对象,包括对象名称和对象类型。

实例化:使用关键字new来创建一个对象。

初始化:使用new创建对象时,会调用构造方法初始化对象。

下面是一个创建对象的例子:

[java] view plaincopy
  1. public class Puppy{  
  2.    public Puppy(String name){  
  3.       //这个构造器仅有一个参数:name  
  4.       System.out.println("Passed Name is :" + name );   
  5.    }  
  6.    public static void main(String []args){  
  7.       // 下面的语句将创建一个Puppy对象  
  8.       Puppy myPuppy = new Puppy( "tommy" );  
  9.    }  
  10. }  
编译并运行上面的程序,会打印出下面的结果:

[java] view plaincopy
  1. Passed Name is :tommy  


访问实例变量和方法

通过已创建的对象来访问成员变量和成员方法,如下所示:

[java] view plaincopy
  1. /* 实例化对象 */  
  2. ObjectReference = new Constructor();  
  3. /* 访问其中的变量 */  
  4. ObjectReference.variableName;  
  5. /* 访问类中的方法 */  
  6. ObjectReference.MethodName();  

例子

下面的例子展示如何访问实例变量和调用成员方法

[java] view plaincopy
  1. public class Puppy{  
  2.    int puppyAge;  
  3.    public Puppy(String name){  
  4.       // 这个构造器仅有一个参数:name  
  5.       System.out.println("Passed Name is :" + name );   
  6.    }  
  7.   
  8.    public void setAge( int age ){  
  9.        puppyAge = age;  
  10.    }  
  11.   
  12.    public int getAge( ){  
  13.        System.out.println("Puppy's age is :" + puppyAge );   
  14.        return puppyAge;  
  15.    }  
  16.   
  17.    public static void main(String []args){  
  18.       /* 创建对象 */  
  19.       Puppy myPuppy = new Puppy( "tommy" );  
  20.       /* 通过方法来设定age */  
  21.       myPuppy.setAge( 2 );  
  22.       /* 调用另一个方法获取age */  
  23.       myPuppy.getAge( );  
  24.       /*你也可以像下面这样访问成员变量 */  
  25.       System.out.println("Variable Value :" + myPuppy.puppyAge );   
  26.    }  
  27. }  
编译并运行上面的程序,产生如下结果:

[java] view plaincopy
  1. Passed Name is :tommy  
  2. Puppy's age is :2  
  3. Variable Value :2  


源文件声明规则


在本节的最后部分,我们将学习源文件的声明规则。当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则。

1)一个源文件中只能有一个public类
2)一个源文件可以有多个非public类
3)源文件的名称应该和public类的类名保持一致。例如:源文件中public类的类名是Employee,那么源文件应该命名为Employee.java。
4)如果一个类定义在某个包中,那么package语句应该在源文件的首行。
5)如果源文件包含import语句,那么应该放在package语句和类定义之间。如果没有package语句,那么import语句应该在源文件中最前面。
6)import语句和package语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。
类有若干种访问级别,并且类也分不同的类型:抽象类和final类等。

除了上面提到的几种类型,Java还有一些特殊的类,如:内部类、匿名类。


Java包

包主要用来对类和接口进行分类。当开发Java程序时,可能编写成百上千的类,因此很有必要对类和接口进行分类。 


Import语句

在Java中,如果给出一个完整的限定名,包括包名、类名,那么Java编译器就可以很容易地定位到源代码或者类。Import语句就是用来提供一个合理的路径,使得编译器可以找到某个类。

例如,下面的命令行将会命令编译器载入java_installation/java/io路径下的所有类
import java.io.*;


一个简单的例子

在该例子中,我们创建两个类:Employee和EmployeeTest。

首先打开文本编辑器,把下面的代码粘贴进去。注意将文件保存为Employee.java。

Employee类有四个成员变量:name、age、designation和salary。该类显式声明了一个构造方法,该方法只有一个参数。

[java] view plaincopy
  1. import java.io.*;  
  2. public class Employee{  
  3.    String name;  
  4.    int age;  
  5.    String designation;  
  6.    double salary;  
  7.    // Employee 类的构造器  
  8.    public Employee(String name){  
  9.       this.name = name;  
  10.    }  
  11.    // 设置age的值  
  12.    public void empAge(int empAge){  
  13.       age =  empAge;  
  14.    }  
  15.    /* 设置designation的值*/  
  16.    public void empDesignation(String empDesig){  
  17.       designation = empDesig;  
  18.    }  
  19.    /* 设置salary的值*/  
  20.    public void empSalary(double empSalary){  
  21.       salary = empSalary;  
  22.    }  
  23.    /* 打印信息 */  
  24.    public void printEmployee(){  
  25.       System.out.println("Name:"+ name );  
  26.       System.out.println("Age:" + age );  
  27.       System.out.println("Designation:" + designation );  
  28.       System.out.println("Salary:" + salary);  
  29.    }  
  30. }  

程序都是从main方法开始执行。为了能运行这个程序,必须包含main方法并且创建一个实例对象。

下面给出EmployeeTest类,该类实例化2个Employee类的实例,并调用方法设置变量的值。

将下面的代码保存在EmployeeTest.java文件

[java] view plaincopy
  1. import java.io.*;  
  2. public class EmployeeTest{  
  3.   
  4.    public static void main(String args[]){  
  5.       /* 使用构造器创建两个对象 */  
  6.       Employee empOne = new Employee("James Smith");  
  7.       Employee empTwo = new Employee("Mary Anne");  
  8.   
  9.       // 调用这两个对象的成员方法  
  10.       empOne.empAge(26);  
  11.       empOne.empDesignation("Senior Software Engineer");  
  12.       empOne.empSalary(1000);  
  13.       empOne.printEmployee();  
  14.   
  15.       empTwo.empAge(21);  
  16.       empTwo.empDesignation("Software Engineer");  
  17.       empTwo.empSalary(500);  
  18.       empTwo.printEmployee();  
  19.    }  
  20. }  

编译这两个文件并且运行EmployeeTest类,可以看到如下结果:

[java] view plaincopy
  1. C :> javac Employee.java  
  2. C :> vi EmployeeTest.java  
  3. C :> javac  EmployeeTest.java  
  4. C :> java EmployeeTest  
  5. Name:James Smith  
  6. Age:26  
  7. Designation:Senior Software Engineer  
  8. Salary:1000.0  
  9. Name:Mary Anne  
  10. Age:21  
  11. Designation:Software Engineer  
  12. Salary:500.0  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

报告显示Q2 Android平板电脑全球市场份额达67%

网易科技讯 7月30日消息,据国外媒体报道,市场调研公司Strategy Analytics最新公布的报告显示,2013年第二季度平板电脑全球出货量达到5170万台,比去年同期的3610万台增长43%,其中Android、iOS和Windows平板电…

活期储蓄账目管理系统

基本要求:实现储户开户、销户、存入、支出等活动。要求能查找储户的账户,实现存款、取款、插入、删除等操作。具体功能如下:(1)实现储户开户。(2)实现储户销户。(3)向某账…

面向过程 VS 面向对象

面向过程(Process Oriented)这个词是在面向对象(Object Oriented)出现之后为与之相对而提出的。其实它在以前基本被叫做“结构化编程”。 早期的程序设计,大量使用共享变量(全局变量)和GOTO语句…

一、OpenStack架构

DashBoardHorizon提供WEB界面ComputerNova计算也就是虚拟机NetworkingNeutron提供给nova网络支持Object StorageSwift提供对象存储Block StorageCinder提供云硬盘给nova,同时备份到SwiftIdentity SserviceKeystone提供所有组件的认证Image ServiceGlance提供给nova镜…

Java 三大特性 —— 多态

Java中多态性的实现 一、什么是多态 1.面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。 2.多态的定义:指允许不同类的对象对同一消息做出响应…

linux /proc/cpuinfo文件分析

为什么80%的码农都做不了架构师?>>> 基于不同指令集(ISA)的CPU产生的/proc/cpuinfo文件不一样,基于X86指令集CPU的/proc/cpuinfo文件包含如下内容: processor  : 0vendor_id  :…

Java 高级类(下) —— 内部类和匿名类

Java内部类(Inner Class),类似的概念在C里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入…

wcf会话、实例化、并发

在asp.net中含有会话,是保存值,供所有的程序使用,同样在wcf中也有会话,供多个客户端使用。 会话的支持通常在契约定义的开始标出,如下 [ServiceContract(Namespace "http://Microsoft.ServiceModel.Samples"…

Java 高级类(上) —— 抽象类和接口

在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 抽象类往往用来表征我们在对问题领域进行分析、 设…

【Git入门之五】版本管理

2019独角兽企业重金招聘Python工程师标准>>> 1.版本回退 我们先看一下从项目开始到现在做了什么操作。 [cpp] view plaincopy #总共是4个操作 $ git log --prettyoneline c5c83cfcdb25c67a5c66b4fe3844d0ea912830ec remove JackyData03 a25c58804cb3f4045564fc0e…

Java 进阶——单例模式

一、单例模式概念及特点 Java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。 单例模式有一下特点: 1、单例类只能有一个实例。 2、单例类必须自己自己创建自己的唯一实例。 3、单例类必须给所有其…

异步网络消息处理框架

最近一段时间将原来写的kendynet网络框架重写了大部分的代码,让提供的接口更清晰,对用户更友好。 整个框架的架构分层3层: 1)单线程,基于原始数据流的网络接口,在这一层上,没有提供封包的处理,定时器事件等等。使用者可…

Java 关键字—— static 与 final

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。 被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例&am…

Linux 小记录

<1>bzero 原型&#xff1a;extern void bzero(void *s, int n);用法&#xff1a;#include <string.h> 功能&#xff1a;置字节字符串s的前n个字节为零。 说明&#xff1a;bzero无返回值。 LINUX平台支持bzero的&#xff0c;但是其并不在ANSI C中定义&…

平面设计师的自我修养是什么样子的?

首先让我们来定义设计的概念&#xff0c;因为这是一切后续讨论的基础。我认为比较适用的定义是&#xff1a;赋予自然或社会中的资源或元素以新的秩序&#xff0c;从而来解决特定的问题。我不想用诸如“设计是人类区别动物的属性”这类未经实证的乱贴标签的话来强调设计的重要性…

Java 三大特性之——继承

继承(inheritance)是面向对象的重要概念。继承是除组合(composition)之外&#xff0c;提高代码重复可用性(reusibility)的另一种重要方式。我们在组合(composition)中看到&#xff0c;组合是重复调用对象的功能接口。我们将看到&#xff0c;继承可以重复利用已有的类的定义。 类…

基于Linux的 Open×××网络之网络架构应用实例

基于Linux的 Open网络之网络架构应用实例Open 概述Open 是一个开源的加密隧道构建工具&#xff0c;基于 OpenSSL 的 SSL/TLS 协议&#xff0c;可以在 Internet中实现点对点的 SSL 安全连接。使用 Open 的好处是安全、易用和稳定&#xff0c;且认证方式灵活&#xff0c;具备实现…

Java 进阶——自动装箱和自动拆箱

1、什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。 一般我们要创建一个类的对象实例的时候&#xff0c;我们会这样&#xff1a; Class a new Class(parameter); 当我们创建一个Integer对象时&#xff0c;却可以这样&…

基于KVM的虚拟化研究及应用

引言 虚拟化技术是IBM在20世纪70年代首先应用在IBM&#xff0f;370大型机上&#xff0c;这项技术极大地提高了大型机资源利用率。随着软硬件技术的迅速发展&#xff0c;这项属于大型机及专利的技术开始在普通X86计算机上应用并成为当前计算机发展和研究的一个热点方向。目前&am…

Java 进阶—— super 和 this 的用法

一、this Java关键字this只能用于方法方法体内。当一个对象创建后&#xff0c;Java虚拟机&#xff08;JVM&#xff09;就会给这个对象分配一个引用自身的指针&#xff0c;这个指针的名字就是this。因此&#xff0c;this只能在类中的非静态方法中使用&#xff0c;静态方…