Java类与对象-2

简介: 在面向对象程序设计中,类是程序的基本单元。Java是完全面向对象的编程语言,所有程序都是以类为组织单元的。回想自己写过的每一个程序,基本框架是不是都如示例1所示的结构。

11.3 Java是面向对象的语言

在面向对象程序设计中,类是程序的基本单元。Java是完全面向对象的编程语言,所有程序都是以类为组织单元的。回想自己写过的每一个程序,基本框架是不是都如示例1所示的结构。


示例1


public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!!!");
    }
}


分析示例1 ,程序框架最外层的作用就是定义了一个类HelloWorld,第1章曾提到HelloWorld是一个类名,原因就在此。


11.3.1 Java 的类模板

学习了类、对象的相关知识,那么如何在Java中描述它们呢?


Java中的类将现实世界中的概念模拟到计算机中,因此需要在类中描述类所具有的属性和方法。Java的类模板如下所示。


语法


public class <类名>{


//定义属性部分


属性 1 的类型属性 1;


属性 2 的类型属性 2;


……


属性 3 的类型属性 3;


//定义方法部分


方法 1;


方法 2;


……


方法 n;


}


在Java中要创建一个类,需要使用一个class、一个类名和一对大括号。


其中,class是创建类的关键字。在class前有一个public,表示"公有"的意思。编写程序时,要注意编码规范,不要漏写public。在class关键字的后面要给定义的类命名,然后写上一对大括号,类的主体部分就写在{}中。类似于给变量命名,类的命名也要遵循一定的规则。


不能使用Java中的关键字。

不能包含任何嵌入的空格或点号 "." ,以及除下划线 "_"、字符 "$" 外的特殊字符。

不能以数字开头。

规范:


类名通常由多个单词组成,每个单词的首字母大写。

另外,类名应该简洁而有意义,尽量使用完整单词,避免使用缩写词,除非该缩写词已被广泛使用,如HTML、HTTP、IP等。

11.3.2 如何定义类

类定义了对象将会拥有的属性和方法。定义一个类的步骤如下。


1.定义类名

通过定义类名,得到程序最外层的框架。


语法


public class 类名{
}


2. 编写类的属性

通过在类的主体中定义变量来描述类所具有的静态特征(属性),这些变量称为类的成员变量。


3. 编写类的方法

通过在类中定义方法来描述类所具有的行为,这些方法称为类的成员方法。


知道了定义一个类的步骤,下面看一个具体例子。


问题:在不同的北大青鸟培训中心(北京中心、杭州中心等),学员们会感觉到相同的教学环境和教学氛围,用类的思想输出培训中心的信息。



分析:在定义类之前,首先要从问题中找出对象和类,进而分析它所具有的属性和方法。一般利用问题描述中的名词和名词短语来识别对象和类。例如,用特指名词(张浩、我的家、第六次比赛)识别对象,用复数名词(人们、顾客、开发商)及泛指名词(每一个人、不同的教员、一台计算机)识别类。对上面的问题,北京中心和杭州中心是特指名词,这样得到两个对象;不同的北大青鸟培训中心是泛指名词,可以抽象成类。对于每个中心,都具有“中心名称”、“教室数目”和“机房数目”,它们所具有的行为都有“展示本中心的信息”。通过上面的分析,抽象出了这个类的(部分)属性和行为,如图11.6所示,下一步就可以定义类了。根据定义类的步骤,编写代码,如示例2所示。


school类


属性:


中心名称


教室数量


机房数目


方法:


展示中心信息


图11.6 School类的属性和方法


示例2


School类的showCenter()方法


School类的三个属性


public class School {
    String schoolName;            //中心名称
    int classNumber;              //教室数目
    int labNumber;                //机房数目
 //定义北大青鸟中心的方法
    public void showCenter() {
        System.out.println(schoolName + "培训中心\n" + "配备: " +
                classNumber + "教" + labNumber + "机");
    }
}


示例2定义了一个School类,并且定义了三个成员变量:schoolName、classNumber、labNumber。另外,定义了一个类的方法,方法名是showCenter()。这个方法的作用是显示中心的信息,即中心名称及教室和机房的配置情况。第12章将详细讲解如何编写类的方法,这里只对showCenter))方法进行简单说明,该方法代码如下。


public String showCenter() {
    //方法体  
}


编写showCenter()方法时,大家只需要在 "方法体" 部分写出自己要实现的功能即可,showCenter是方法名。在Java中,一个简单方法的框架如下所示。


语法


访问修饰符 返回值类型 方法名(){


//方法体


}


访问修饰符限制了访问该方法的范围,如public,还有其他的访问修饰符,会在以后学习。返回值类型是方法执行后返回结果的类型,这个类型可以是基本类型,或者是引用类型,也可以没有返回值,此时必须使用void来描述。方法名一般使用一个有意义的名字描述该方法的作用,其命名应符合标识符的命名规则。


说明


这里介绍一下Camel(骆驼)命名法和Pascal (帕斯卡)命名法。


骆驼命名法:方法或变量名的第一个单词的首字母小写,后面每个单词的首字母大写,如 showCenter、userName 等。

帕斯卡命名法:每一个单词的首字母都大写,如类名School等。在Java中,定义类的属性和方法使用骆驼命名法,定义类使用帕斯卡命名法。

11.3.3 如何创建和使用对象

定义好了 School类,下面就可以根据定义的模板创建对象了。类的作用就是创建对象。由类生成对象,称为类的实例化过程。一个实例也就是一个对象,一个类可以生成多个对象。创建对象的语法如下。


语法


类名 对象名 = new 类名() ;


在创建类的对象时,需要使用Java的new关键字。例如,创建School类的一个对象。


School center = new School()


center对象的类型就是School类型。使用new创建对象时,我们并没有给它的数据成员赋一个特定的值。考虑到每个对象的属性值可能是不一样的,所以在创建对象后再给它的数据成员赋值。


在Java中,要引用对象的属性和方法,需要使用操作符。其中,对象名在圆点的左边,属性或方法的名称在圆点的右边。


语法


对象名.属性       //引用对象的属性


对象名.方法名()   //引用对象的方法


例如,创建School类的对象center后,就可以给对象的属性赋值或调用方法,代码如下。


center .name  ="北京中心”;  //给 name 属性赋值


center. showCenter () ;  //调用  showCenter () 方法


掌握了如何创建类的对象,下面就来解决11.3.2节中的问题。


示例3


public class InitialSchool {
   public static void main(String[] args) {
      School center = new School();
      System.out.println("***初始化成员变量前***");
      center.showCenter();
      center.schoolName = "北京中心";       //给schoolName属性赋值
      center.classNumber = 10;         //给classNumber属性赋值
      center.labNumber = 10;          //给labNumber属性赋值
      System.out.println("\n***初始化成员变量后***");
      center.showCenter();
   }
}

程序运行结果如图11.7所示。


下面分析示例3的代码。这里新创建了 Initialschool类,用它来测试School类。大家知道,执行程序需要一个入口。因此,像以前编写过的程序一样,在main()方法中编写代码来使用School类。


图11.7示例3的运行结果


说明:main()方法是程序的入口,可以出现在任何一个类中,但要保证一个Java类中只有一个main()方法。因此,我们可以将main()方法写在School类中。但这里,我们将main()方法放在了 Initialschool类中,目的是使不同的类实现不同的功能。


在示例3的main()中,有以下三点需要大家注意。


使用关键字new创建类的对象 "center"。

School center = new School();


使用操作符访问类的属性。

center.schoolName = "北京中心";    //给schoolName属性赋值
center.classNumber = 10;           //给classNumber属性赋值
center.labNumber = 10;             //给labNumber属性赋值

使用操作符访问类的方法。

center.showCenter();


下面分析运行结果。showCenter()方法返回一个字符串,由图11.7可知,在没有初始化成员变量时,String类型的schoolName变量的值为null (空),而两个整型变量classNumber和labNumber的值是0。为什么呢?这是因为在定义类时,如果没有给属性赋初始值,Java会给它一个默认值,如表11一2所示。


表11-2 Java数据类型的默认值



image.png


提示:


在Idea中使用操作符引用类的属性和方法时,发现Idea会弹出一个下拉菜单,如图11.8所示,其中列出了所有的属性和方法。用户只需要选择想要引用的选项就可以了,这是Idea给用户提供的便捷。


图11.8自动提示


11.3.4 综合示例

前面定义了 School类,下面学习如何定义学员类和教员类。


问题:


编写学员类,输出学员相关信息,如图11.9所示。

编写教员类,输出教员相关信息,如图11.10所示。


图11.9输出学员信息                     图11.10输出教员信息


分析:


由图11.9可知,学员类包含的属性有姓名、年龄、班级、爱好;包含的方法为显示个人信息,如示例4所示。

由图11.10可知,教员类包含的属性有姓名、专业方向、教授课程、教龄;包含的方法为显示个人信息,如示例5所示。

示例4


学员类:


public class Student {
    String name;   //姓名
    int age;      //年龄
    String classNo;    //班级
    String hobby;  //爱好
    public void show(){
        System.out.println(name + "\n年龄:" + age + "\n就读于:" +
                classNo + "\n爱好:" + hobby);
    }
}

输出学员信息:


public class InitialStudent {
    public static void main(String args[]){
        Student student = new Student();   //创建对象
        student.name = "张浩";            //给各个属性赋值
        student.age = 10;
        student.classNo = "S1班";
        student.hobby = "篮球";
        student.show();                   //调用方法
    }
}


示例5


教员类:


public class Teacher {
    String name;   //姓名
    String major;  //专业方向
    String courses;    //教授课程
    int schoolAge; //教龄
    //输出信息方法
    public void show(){
        System.out.println(name + "\n专业方向:" + major +
                "\n教授课程:" + courses + "\n教龄:" + schoolAge);
    }
}


输出教员信息:


public class InitialTeacher {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();   //创建对象
        teacher.name = "王老师";           //给各个属性赋值
        teacher.major = "计算机";
        teacher.courses = "使用Java语言理解程序逻辑";
        teacher.schoolAge = 5;
        teacher.show();                   //调用方法
    }
}

下面通过另外一个例子,巩固类的使用。


问题:一个景区根据游人的年龄收取不同价格的门票,其中大于60岁或小于18岁的免费,18〜60岁的20元。请编写游人(Visitor)类,根据年龄段决定能够购买的门票价格并输出。用户输入n则退出程序。


分析:首先要找出与要解决问题有关的对象并抽象出类。很明显,根据要解决的问题,可以得到游人类,该类可以有姓名和年龄两个属性。让用户输入年龄,利用选择结构解决,如示例6所示。


示例6


游人类:


package cn.jbit.dlc1;
import java.util.Scanner;
public class Visitor {
    String name;   //姓名
    int age;      //年龄
    public void show(){
        Scanner input = new Scanner(System.in);
        while(!"n".equals(name)){
            if(age>=18 && age<=60){       //判断年龄
                System.out.println(name + "的年龄为:" + age +
                        ",门票价格为:20元\n" );
            }else{
                System.out.println(name + "的年龄为:" + age + ",门票免费\n");
            }
            System.out.print("请输入姓名:");
            name = input.next();         //给name属性赋值
            if(!"n".equals(name)){
                System.out.print("请输入年龄:");
                age = input.nextInt();       //给age属性赋值
            }
        }
        System.out.print("退出程序");
    }
}


输出门票信息:


package cn.jbit.dlc1;
import java.util.Scanner;
public class InitialVistor {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Visitor v = new Visitor();    //创建对象
        System.out.print("请输入姓名:");
        v.name = input.next();       //给name属性赋值
        System.out.print("请输入年龄:");
        v.age = input.nextInt();      //给age属性赋值
        v.show();                       //调用显示信息方法
    }
}


示例6的运行结果如图11.11所示。


为了程序演示的方便,示例6中的代码使用了循环,当ffl户输入n时退出程序。这里主要注意代码中使用new关键字创建对象及给属性赋值两个部分。


图11.11示例6的运行结果


相关文章
|
1月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
153 57
|
6天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
1月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
56 8
|
1月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
1月前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
73 17
|
1月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
54 17
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
135 4
|
1月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
78 2
|
1月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
61 4