黑马程序员技术交流社区

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

作者: 清香白莲    时间: 2015-4-3 09:13
标题: Java自学笔记03—对象与类(上)
面向对象程序设计概述面向过程:程序=算法+数据结构
面向对象:程序=对象+对象+…
面向对象将问题域划分成一个个对象,并将与特定问题相关的算法与数据结构封装在特定的对象中。
类是构造对象的模板。
类的三个主要特性:
封装,继承,多态。
对象对象是类的实例。
对象的三个主要特性:
行为,状态,标识。
使用预定义类Java类库中有上千种类,要想使用它们,首先构造对象,指定其初始状态,然后,对对象应用方法。例:
Date birthday = new Date();
String s = new Date().toString();
对象与对象变量对象是堆内存中的实体。
对象变量存在于栈内存,是对对象实体的引用,或者说对象变量的值就是对象实体的内存地址。
更改器方法与访问器方法通常给访问器方法名加前缀get,get方法仅查看并返回对象的状态。
通常给更改器方法名加前缀set,set方法对对象的状态进行修改。
  1. import java.text.DateFormatSymbols;
  2. import java.util.*;

  3. public class HelloJava
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                 GregorianCalendar d = new GregorianCalendar();
  8.                
  9.                 int today = d.get(Calendar.DAY_OF_MONTH);
  10.                 int month = d.get(Calendar.MONTH);
  11.                
  12.                 d.set(Calendar.DAY_OF_MONTH, 1);
  13.                
  14.                 int weekday = d.get(Calendar.DAY_OF_WEEK);
  15.                
  16.                 int firstDayOfWeek = d.getFirstDayOfWeek();
  17.                
  18.                 int indent = 0;
  19.                 while (weekday != firstDayOfWeek)
  20.                 {
  21.                         indent++;
  22.                         d.add(Calendar.DAY_OF_MONTH, -1);
  23.                         weekday = d.get(Calendar.DAY_OF_WEEK);
  24.                 }
  25.                
  26.                 String[] weekdayNames = new DateFormatSymbols().getShortWeekdays();
  27.                 do
  28.                 {
  29.                         System.out.printf("%4s", weekdayNames[weekday]);
  30.                         d.add(Calendar.DAY_OF_MONTH, 1);
  31.                         weekday = d.get(Calendar.DAY_OF_WEEK);
  32.                 }
  33.                 while (weekday != firstDayOfWeek);
  34.                 System.out.println();
  35.                 for (int i = 1; i <= indent; i++)
  36.                         System.out.print("    ");
  37.                
  38.                 d.set(Calendar.DAY_OF_MONTH, 1);
  39.                 do
  40.                 {
  41.                         int day = d.get(Calendar.DAY_OF_MONTH);
  42.                         System.out.printf("%3d", day);
  43.                        
  44.                         if (day == today)
  45.                                 System.out.print("*");
  46.                         else
  47.                                 System.out.print(" ");
  48.                        
  49.                         d.add(Calendar.DAY_OF_MONTH, 1);
  50.                         weekday = d.get(Calendar.DAY_OF_WEEK);
  51.                        
  52.                         if (weekday == firstDayOfWeek)
  53.                                 System.out.println();
  54.                 }
  55.                 while (d.get(Calendar.MONTH) == month);
  56.                
  57.                 if (weekday != firstDayOfWeek)
  58.                         System.out.println();
  59.         }
  60. }
复制代码
用户自定义类
class ClassName
{
field1
field2

constructor1
constructor2

method1
method2

}
  1. import java.util.*;

  2. public class HelloJava
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 Employee[] staff = new Employee[3];
  7.                 staff[0] = new Employee("Carl Cracker", 75000, 1987, 12, 15);
  8.                 staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
  9.                 staff[2] = new Employee("Tony Tester", 40000, 1990, 3, 15);
  10.                
  11.                 for (Employee e : staff)
  12.                         e.raiseSalary(5);
  13.                
  14.                 for (Employee e : staff)
  15.                         System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ",hireDay=" + e.getHireDay());
  16.         }
  17. }

  18. class Employee
  19. {
  20.         private String name;
  21.         private double salary;
  22.         private Date hireDay;
  23.        
  24.         public Employee(String n, double s, int year, int month, int day)
  25.         {
  26.                 name = n;
  27.                 salary = s;
  28.                 GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
  29.                 hireDay = calendar.getTime();
  30.         }
  31.        
  32.         public String getName()
  33.         {
  34.                 return name;
  35.         }
  36.        
  37.         public double getSalary()
  38.         {
  39.                 return salary;
  40.         }
  41.        
  42.         public Date getHireDay()
  43.         {
  44.                 return hireDay;
  45.         }
  46.        
  47.         public void raiseSalary(double byPercent)
  48.         {
  49.                 double raise = salary * byPercent / 100;
  50.                 salary += raise;
  51.         }
  52. }
复制代码
静态域与静态方法
静态域可以将类中的域分为静态域和实例域。
实例域是指本类所有对象都各自拥有的域。
静态域是指本类所有对象都共享的域。
实例域属于对象,存储在堆中。
静态域属于类,存储在静态存储区中。
只要类已经载入内存,即使还没有创建对象,静态域也已经存在了。
静态方法可以将类中的方法分为实例方法和静态方法。
调用实例方法,须用对象.实例方法的形式,调用时,将在栈内存中开辟空间。
调用静态方法,可用类名.静态方法的形式,静态方法随着类的加载已经存在于静态存储区,不会在调用时开辟内存。
静态方法可以访问本类的静态域,但不能访问本类对象的实力域。
main方法每一个类可以有一个main方法,这个特性常用于对类进行单元测试。

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

  20. class Employee
  21. {
  22.         private static int nextId = 1;
  23.        
  24.         private String name;
  25.         private double salary;
  26.         private int id;
  27.        
  28.         public Employee(String n, double s)
  29.         {
  30.                 name = n;
  31.                 salary = s;
  32.                 id = 0;
  33.         }
  34.        
  35.         public String getName()
  36.         {
  37.                 return name;
  38.         }
  39.        
  40.         public double getSalary()
  41.         {
  42.                 return salary;
  43.         }
  44.        
  45.         public int getId()
  46.         {
  47.                 return id;
  48.         }
  49.        
  50.         public void setId()
  51.         {
  52.                 id = nextId;
  53.                 nextId++;
  54.         }
  55.        
  56.         public static int getNextId()
  57.         {
  58.                 return nextId;
  59.         }
  60.        
  61.         public static void main(String[] args)
  62.         {
  63.                 Employee e = new Employee("Harry", 50000);
  64.                 System.out.println(e.getName() + " " + e.getSalary());
  65.         }
  66. }
复制代码





作者: 清香白莲    时间: 2015-4-3 09:15
感觉从地址的角度来理解Java面向对象机制会比较顺利。




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