2、Java对象和类 - 图1

  1. /*定义上图的类*/
  2. public class Dog {
  3. String breed;
  4. int size;
  5. String colour;
  6. int age;
  7. void eat() {
  8. }
  9. void run() {
  10. }
  11. void sleep(){
  12. }
  13. void name(){
  14. }
  15. }

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

  • 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
  • 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
  • 类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。

一个类可以拥有多个方法,在上面的例子中:eat()、run()、sleep() 和 name() 都是 Dog 类的方法。


构造方法

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

下面是一个构造方法示例:

  1. public class Puppy{
  2. public Puppy(){
  3. }
  4. public Puppy(String name){
  5. // 这个构造器仅有一个参数:name
  6. }
  7. }

创建对象

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

  • 声明:声明一个对象,包括对象名称和对象类型。
  • 实例化:使用关键字 new 来创建一个对象。
  • 初始化:使用 new 创建对象时,会调用构造方法初始化对象。
  1. public class Puppy{
  2. public Puppy(String name){
  3. //这个构造器仅有一个参数:name
  4. System.out.println("小狗的名字是 : " + name );
  5. }
  6. public static void main(String[] args){
  7. // 下面的语句将创建一个Puppy对象
  8. Puppy myPuppy = new Puppy( "tommy" );
  9. }
  10. }

访问实例变量和方法

通过已创建的对象来访问成员变量和成员方法

  1. /*实例化对象*/
  2. Object referenceVariable = new Constructor();
  3. /*访问类中的变量*/
  4. referenceVariable.variableName;
  5. /*访问类中的方法*/
  6. referenceVariable.mathodName;

实例

访问实例变量和调用成员方法

  1. public class Puppy{
  2. int puppyAge;
  3. public Puppy(String name){
  4. // 这个构造器仅有一个参数:name
  5. System.out.println("小狗的名字是 : " + name );//name为小狗的名字
  6. }
  7. public void setAge( int age ){
  8. puppyAge = age;//puppyAge为age 年龄
  9. }
  10. public void getAge( ){
  11. System.out.println("小狗的年龄为:" + puppyAge );
  12. }
  13. // public int getAge( ){
  14. // System.out.println("小狗的年龄为 : " + puppyAge );
  15. // return puppyAge;
  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("变量值 : " + myPuppy.puppyAge );
  26. }
  27. }

源文件声明规则

  • 一个源文件中只能有一个 public 类
  • 一个源文件可以有多个非 public 类
  • 源文件的名称应该和 public 类的类名保持一致。例如:源文件中 public 类的类名是 Employee,那么源文件应该命名为Employee.java。
  • 如果一个类定义在某个包中,那么 package 语句应该在源文件的首行。
  • 如果源文件包含 import 语句,那么应该放在 package 语句和类定义之间。如果没有 package 语句,那么 import 语句应该在源文件中最前面。
  • import 语句和 package 语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。

Java包

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

import 语句

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


构造器

构造方法:

  1. public class Student {
  2. public String name;
  3. public int age;
  4. public void eat() {
  5. System.out.println("eat....");
  6. }
  7. //构造器
  8. /**
  9. * 名称与类名相同,没有返回值,不能写void
  10. * 构造器可以重载
  11. * 如果类中没有手动添加构造器,编译器会默认再添加一个无参构造器
  12. * 如果手动添加了构造器(无论什么形式),默认构造器就会消失
  13. */
  14. public Student() {
  15. System.out.println("无参构造器");
  16. }
  17. public Student(int a) {
  18. System.out.println("一个参数的构造器");
  19. age = 15;
  20. }
  21. public Student(int a, String s) {
  22. System.out.println("两个参数的构造器");
  23. age = a;
  24. name = s;
  25. }
  26. }

一个简单的例子

在该例子中,我们创建两个类:EmployeeEmployeeTest
首先打开文本编辑器,把下面的代码粘贴进去。注意将文件保存为 Employee.java。
Employee 类有四个成员变量:name、age、designation 和 salary。该类显式声明了一个构造方法,该方法只有一个参数。

  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 );
  26. System.out.println("年龄:" + age );
  27. System.out.println("职位:" + designation );
  28. System.out.println("薪水:" + salary);
  29. }
  30. }

程序都是从main方法开始执行。为了能运行这个程序,必须包含main方法并且创建一个实例对象。
下面给出EmployeeTest类,该类实例化2个 Employee 类的实例,并调用方法设置变量的值。

  1. public static void main(String[] args){
  2. /* 使用构造器创建两个对象 */
  3. Employee empOne = new Employee("RUNOOB1");
  4. Employee empTwo = new Employee("RUNOOB2");
  5. // 调用这两个对象的成员方法
  6. empOne.empAge(26);
  7. empOne.empDesignation("高级程序员");
  8. empOne.empSalary(1000);
  9. empOne.printEmployee();
  10. empTwo.empAge(21);
  11. empTwo.empDesignation("菜鸟程序员");
  12. empTwo.empSalary(500);
  13. empTwo.printEmployee();
  14. }
  15. }

合并:

  1. import java.io.*;
  2. public class Employee {
  3. String name;
  4. int age;
  5. String designation;
  6. double salary;
  7. String marriage;
  8. // Employee 类的构造器
  9. public Employee(String name) {
  10. //this.name 为String name 的name
  11. this.name = name;
  12. }
  13. // 设置age的值
  14. public void Age(int Age) {
  15. age = Age;
  16. }
  17. /* 设置designation的值*/
  18. public void empDesignation(String empDesig) {
  19. designation = empDesig;
  20. }
  21. /* 设置salary的值*/
  22. public void empSalary(double empSalary) {
  23. salary = empSalary;
  24. }
  25. /*婚姻情况*/
  26. public void Marriage_status(String situation) {
  27. marriage = situation;
  28. }
  29. /* 打印信息 */
  30. public void printEmployee() {
  31. System.out.println("姓名:" + name);
  32. System.out.println("年龄:" + age);
  33. System.out.println("职位:" + designation);
  34. System.out.println("薪水:" + salary);
  35. System.out.println("婚姻情况:" + marriage);
  36. System.out.println("\n");
  37. }
  38. public static void main(String[] args) {
  39. /* 使用构造器创建两个对象 */
  40. Employee empOne = new Employee("雷小喜");
  41. Employee empTwo = new Employee("王明");
  42. Employee empThree = new Employee("夏雨");
  43. // 调用这两个对象的成员方法
  44. empOne.Age(22);
  45. empOne.empDesignation("1号程序员");
  46. empOne.empSalary(50000);
  47. empOne.Marriage_status("未婚");
  48. empOne.printEmployee();
  49. empTwo.Age(21);
  50. empTwo.empDesignation("2号程序员");
  51. empTwo.empSalary(10000);
  52. empTwo.Marriage_status("未婚");
  53. empTwo.printEmployee();
  54. empThree.Age(26);
  55. empThree.empDesignation("3号程序员");
  56. empThree.empSalary(12000);
  57. empThree.Marriage_status("已婚");
  58. empThree.printEmployee();
  59. }
  60. }