类和对象

1.概念:

  类:构造对象的模板或蓝图,构建对象的过程称为创建对象的实例。

  封装:将数据和行为组合在一个包中,并对对象的使用者隐藏数据的实现方式。主要用途是提高类的重用性和可靠性。

  实例域:对象中的数据。

  数据域:类中的数据。

  静态域:使用static修饰的数据。

2.对象:

  对象的三个主要特性:

    行为:对象的方法;状态:每个对象的实例域值的集合;标识:用于辨别不同的对象;

3.类之间的关系:

  依赖(uses-a):一个类的方法操作另一个类的对象;(应当适当的降低依赖,减少耦合)

  聚合(has-a):A类对象包含B类对象(A类数据域中包含B类对象);

  继承(is-a):A类扩展B类;

4.对预定义类的使用:

  1.使用java.util.date类:(线程不安全)

  2,使用java.time.localdate类(线程安全)

  任何对象变量的值都是对存储在另外一个地方的一个对象的引用

5.自定义类:

   自定义类一般有自己的实例域和实例方法

  注意:在一个源文件中,只能有一个公共类,但可以有任意数目的非公有类。

6.关于构造器:

  1.构造器与类同名

  2.每个类可以有一个以上的构造器

  3.构造器可以有一个或者多个参数

  4.构造器没有返回值

  5.构造器总是伴随着new操作一起调用

7.显式参数和隐式参数:

  显式参数:方法参数;

  隐式参数:本对象的参数(一般this代表隐式参数);

  

1 public Person(int name) {
2    this.name = name;    //this.name是隐式参数,name是显式参数
3 }

8.封装的优点:

  1.改变内部实现,除了该类的方法外,不会影响其他代码。

  2.更改器方法可以执行错误检查。

  注意:不要编写返回引用可变对象的访问器方法(破坏封装),需要返回一个可变对象的引用时,首先对他进行克隆。

  

class Employee {
    private Date hireDay;

    public Date getHireDay() {
       return hireDay;    //直接返回了可变对象的引用             
      //  return (Date) hireDay.clone();    //正确的做法
    }
}
public class EmployeeDemo {
    public static void main(String[] args) {
        Employee employee = new Employee();
        Date hireDay = employee.getHireDay();
        hireDay.setTime(10000);       //不通过更改器方法直接访问了对象的实例域,因此破坏了封装
    }
}

9.基于类的访问权限:

  一个方法能够访问所属类的所有对象的私有数据。

 

1 public class Employee {
2     private String name;
3     public boolean equals(Employee boss){
4         return this.name.equals(boss.name);     //不但访问了该对象的私有数据name而且访问了boss对象的私有数据name
5     }
6 }

10.final实例域

  构建对象时必须初始化这样的域,也就是说必须确保在构造器执行之后,这个域的值被设置,并且在后面的操作中,不能再对它进行修改。

  注意:final大部分都应用于修饰基本类型域或者不可变类型的域(如果这个类的所有方法都不用能改变其对象,这种类就是不可变类)。

     如果修饰可变类,只能限制变量不再指向其他对象,不能限制对该对象的修改。

11.静态域和静态方法

  静态域:属于类,不属于任何独立的对象。

  静态常量: 相对于静态变量,静态常量使用的更为频繁,例如Math.PI 。被final修饰的数据域可以设置为公有。

·  静态方法:不能对对象实施操作的方法

      设计成为静态方法的条件:

        1.一个方法不需要访问对象的状态,所需要的参数都通过显式参数进行提供。

        2.一个方法只需要访问类的静态域。

12.方法参数(关于Java是值传递还是引用传递)

  值调用:表示方法接收的是调用者提供的值。

  引用调用:表示方法接收的是调用者提供的变量地址。

  注意:Java中只有值传递,没有引用传递,方法得到的是所有参数的值的一个拷贝。

  Java中参数的使用情况:

  1.一个方法不能修改一个基本数据类型的参数;

  2.一个方法可以改变一个对象参数的状态;

·   3.一个方法不能让对象参数引用一个新的对象;

  

 1 public class ParamTest {
 2     public static void main(String[] args) {
 3         //1.方法不能修改基本数据类型的参数
 4         double percent = 10;
 5         System.out.println("Before percent = " + percent);
 6         tripleValue(percent);
 7         System.out.println("After percent = "+ percent);
 8         //2.一个方法可以改变一个对象参数的状态;
 9         Employee employee = new Employee("Harry",5000);
10         System.out.println("Before: salary = " + employee.getSalary());
11         tripleSalary(employee);
12         System.out.println("After: salary = " +employee.getSalary());
13         //3.一个方法不能让对象参数引用一个新的对象;
14         Employee a = new Employee("Alice",1000);
15         Employee b = new Employee("Bob",2000);
16         System.out.println("Before of method: a = " +  a.getName());
17         System.out.println("Before of method: b = " + b.getName());
18         swap(a,b);
19         System.out.println("After of method: a = " +  a.getName());
20         System.out.println("After of method: b = " + b.getName());
21 
22     }
23     public static void tripleValue(double x){
24         x = 3 * x;
25         System.out.println("end of method: x = " + x);
26     }
27     public static void tripleSalary(Employee x){
28         x.raiseSalary(200);
29         System.out.println("end of method: salary = " + x.getSalary());
30     }
31 
32     public static void swap(Employee x,Employee y){
33         Employee temp = x;
34         x = y;
35         y = temp;
36         System.out.println("end of method: x = " +  x.getName());
37         System.out.println("end of method: y = " + y.getName());
38     }
39 
40 }
41 class Employee{
42     private String name;
43     private double salary;
44 
45     public Employee() {
46     }
47 
48     public Employee(String name, double salary) {
49         this.name = name;
50         this.salary = salary;
51     }
52 
53     public String getName() {
54         return name;
55     }
56 
57 
58     public double getSalary() {
59         return salary;
60     }
61 
62     public void raiseSalary(double byPercent) {
63         double raise = salary*byPercent/100;
64         salary += raise;
65     }
66 }

  运行结果:

    Before percent = 10.0
    end of method: x = 30.0
    After percent = 10.0
    Before: salary = 5000.0
    end of method: salary = 15000.0
    After: salary = 15000.0
    Before of method: a = Alice
    Before of method: b = Bob
    end of method: x = Bob
    end of method: y = Alice
    After of method: a = Alice
    After of method: b = Bob

13.对象的构造:

  重载:方法名相同,参数列表不同,与返回值类型无关。

  无参构造器:如果没有给出构造方法会自动提供无参构造,如果自定义了有参构造,则系统不再自动提供无参构造。

  调用另一个构造器:可以使用this关键字,调用另外的构造器。

14.类的设计技巧:

  1.一定要保证数据私有;

  2.一定要对数据进行初始化;

  3.不要再类中使用过多的基本类型(如果基本类型多可以抽取出一个新的类);

  4.不是所有的域都需要独立的域访问器和域更改器;

  5.将职责过多的类进行分解;

  6.类名和方法名要能体现他们的职责;

  7.优先使用不可变的类(可以减少线程安全问题);

  

    

  

posted @ 2020-11-25 15:36  Learn丶馒头  阅读(125)  评论(0)    收藏  举报