黑马程序员技术交流社区

标题: Java自学笔记03—对象与类(下) [打印本页]

作者: 清香白莲    时间: 2015-4-3 09:25
标题: Java自学笔记03—对象与类(下)
方法参数
一个方法不能修改一个基本数据类型的参数。
一个方法可以改变一个对象参数的状态。
一个方法不能让对象参数引用一个新的对象。
总之,调用方法时,参数的传递方式是值传递。
当参数是引用数据类型时,实际传递的是所引用内存实体的地址值。
  1. public class HelloJava
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 System.out.println("Testing tripleValue:");
  6.                 double percent = 10;
  7.                 System.out.println("Before: percent=" + percent);
  8.                 tripleValue(percent);
  9.                 System.out.println("After: percent=" + percent);
  10.                
  11.                 System.out.println("\nTesting tripleSalary:");
  12.                 Employee harry = new Employee("Harry", 50000);
  13.                 System.out.println("Before: salary=" + harry.getSalary());
  14.                 tripleSalary(harry);
  15.                 System.out.println("After: salary=" + harry.getSalary());
  16.                
  17.                 System.out.println("\nTesting swap:");
  18.                 Employee a = new Employee("Alice", 70000);
  19.                 Employee b = new Employee("Bob", 60000);
  20.                 System.out.println("Before: a=" + a.getName());
  21.                 System.out.println("Before: b=" + b.getName());
  22.                 swap(a, b);
  23.                 System.out.println("After: a=" + a.getName());
  24.                 System.out.println("After: b=" + b.getName());
  25.         }
  26.        
  27.         public static void tripleValue(double x)
  28.         {
  29.                 x = 3 * x;
  30.                 System.out.println("End of method: x=" + x);
  31.         }
  32.        
  33.         public static void tripleSalary(Employee x)
  34.         {
  35.                 x.raiseSalary(200);
  36.                 System.out.println("End of method: salary=" + x.getSalary());
  37.         }
  38.        
  39.         public static void swap(Employee x, Employee y)
  40.         {
  41.                 Employee temp = x;
  42.                 x = y;
  43.                 y = temp;
  44.                 System.out.println("End of method: x=" + x.getName());
  45.                 System.out.println("End of method: y=" + y.getName());
  46.         }
  47. }

  48. class Employee
  49. {
  50.         private String name;
  51.         private double salary;

  52.         public Employee(String n, double s)
  53.         {
  54.                 name = n;
  55.                 salary = s;
  56.         }
  57.        
  58.         public String getName()
  59.         {
  60.                 return name;
  61.         }
  62.        
  63.         public double getSalary()
  64.         {
  65.                 return salary;
  66.         }
  67.        
  68.         public void raiseSalary(double byPercent)
  69.         {
  70.                 double raise = salary * byPercent / 100;
  71.                 salary += raise;
  72.         }
  73. }
复制代码
对象构造
如果多个方法有相同的名字,不同的参数,便产生了重载。
如果在构造器中没有显示地给域赋予初值,那么就会被自动地赋为默认值:数值为0,布尔值为false,对象引用为null。
如果类中没有构造器,系统会提供一个无参数的构造器,这个构造器将所有实力域设置为默认值。如果类中有构造器,系统不会提供构造器。
如果构造器的参数名与实例域名相同,可以采用this指针完成初始化,例如:
public Employee(String name, double salary)
{
this.name = name;
this.salary = salary;
}
如果构造器的第一个语句形如this(…),这个构造器将调用同一个类的另一个构造器。这种处理方式使得对公共构造器代码部分只编写一次即可。
还可以使用初始化块初始化域,初始化块先于构造器执行。
  1. import java.util.*;

  2. public class HelloJava
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 Employee[] staff = new Employee[3];
  7.                
  8.                 staff[0] = new Employee("Harry", 40000);
  9.                 staff[1] = new Employee(60000);
  10.                 staff[2] = new Employee();
  11.                
  12.                 for (Employee e : staff)
  13.                         System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary=" + e.getSalary());
  14.         }
  15. }

  16. class Employee
  17. {
  18.         private static int nextId;
  19.        
  20.         private int id;
  21.         private String name = "";
  22.         private double salary;
  23.        
  24.         static
  25.         {
  26.                 Random generator = new Random();
  27.                 nextId = generator.nextInt(10000);
  28.         }
  29.        
  30.         {
  31.                 id = nextId;
  32.                 nextId++;
  33.         }

  34.         public Employee(String n, double s)
  35.         {
  36.                 name = n;
  37.                 salary = s;
  38.         }
  39.        
  40.         public Employee(double s)
  41.         {
  42.                 this("Employee #" + nextId, s);
  43.         }
  44.        
  45.         public Employee()
  46.         {
  47.                
  48.         }
  49.        
  50.         public String getName()
  51.         {
  52.                 return name;
  53.         }
  54.        
  55.         public double getSalary()
  56.         {
  57.                 return salary;
  58.         }
  59.        
  60.         public int getId()
  61.         {
  62.                 return id;
  63.         }
  64. }
复制代码

标准Java包处于java和javax包层次中。使用包的主要原因是确保类名的唯一性。从编译器的角度看,嵌套的包之间没有任何关系。
使用import语句导入特定类或整个包,使用import static …导入静态方法和静态域。
使用package语句将类放入包中。

  1. import com.horstmann.corejava.*;

  2. import static java.lang.System.*;

  3. public class HelloJava
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                 Employee harry = new Employee("Harry Hacker", 50000, 1989, 10, 1);
  8.                
  9.                 harry.raiseSalary(5);
  10.                
  11.                 out.println("name=" + harry.getName() + ",salary=" + harry.getSalary());
  12.         }
  13. }
复制代码
  1. package com.horstmann.corejava;

  2. import java.util.*;

  3. public class Employee
  4. {
  5.         private String name;
  6.         private double salary;
  7.         private Date hireDay;
  8.        
  9.         public Employee(String n, double s,int year, int month, int day)
  10.         {
  11.                 name = n;
  12.                 salary = s;
  13.                 GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
  14.                 hireDay = calendar.getTime();
  15.         }
  16.        
  17.         public String getName()
  18.         {
  19.                 return name;
  20.         }
  21.        
  22.         public double getSalary()
  23.         {
  24.                 return salary;
  25.         }
  26.        
  27.         public Date getHireDay()
  28.         {
  29.                 return hireDay;
  30.         }
  31.        
  32.         public void raiseSalary(double byPercent)
  33.         {
  34.                 double raise = salary * byPercent / 100;
  35.                 salary += raise;
  36.         }
  37. }
复制代码
没有指定public或private的类,方法,域可以被同一个包中的所有方法访问。




作者: 清香白莲    时间: 2015-4-3 09:28
帖子的默认排序是按最后回复排序,建议新人发完帖后自行回复一次。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2