一、封装

特性:安全、将变化隔离、便于使用、提供重复性

 

例子

[root@bch04 java]# cat EmployeeDemo.java 
class Employee {
    private String id;
    private String name;
    private String gender;
 
    //提供公有的set和get方法
    //public 成员修饰符,公共的,谁都可以访问
    //private 成员修饰符,私有的,只有自己可以访问
 
    public void setName(String n) {
        name = n;
    }
 
    public void setId(String i) {
        id = i;
    }
    
    public void setGender(String gen) {
        if ("male".equals(gen) || "female".equals(gen)) {
            gender =gen;
        } else {
            System.out.println("please input \"male\" or \"female\"");  
        }
 
    }
    
 
    public String getName() {
        return name;
    }
 
    public String getId() {
        return id;
    }
 
    public String getGender() {
        return gender;
    }
 
 
    public void work() {
        System.out.println(id +":" +name +":" +gender +":" +"working");
    } 
}
 
public class EmployeeDemo {
public static void main(String[] args) {
 
        //创建对象
        Employee tom = new Employee();
 
        //调用公有方法,给成员赋值变量
        tom.setName("tom");
        tom.setId("1");
        tom.setGender("male");
 
        //获取实例变量的值
        System.out.println(tom.getName());
        System.out.println(tom.getId());
        System.out.println(tom.getGender());
 
        //调用成员方法
        tom.work();
    }
 
}
 
//运行结果 
[root@bch04 java]# java EmployeeDemo 
tom
1
male
1:tom:male:working

 

[root@bch04 java]# cat Demo.java 
class Calculator {
    public String name = "my Carculator";
    public double num1;
    public double num2;
    public char option;
 
    public void init(double a, char op, double b) {
        num1 = a;
        num2 = b;
        option = op;
    }
  
    public void calculate() {
        switch (option) {
            case '+': System.out.println(name +":" +num1 +"+" +num2 +"=" +(num1+num2));
                      break;
            case '-': System.out.println(name +":" +num1 +"-" +num2 +"=" +(num1-num2));
                      break;
            case '*': System.out.println(name +":" +num1 +"*" +num2 +"=" +(num1*num2));
                      break;
            case '%': System.out.println(name +":" +num1 +"%" +num2 +"=" +(num1%num2));
                      break;
            case '/': if (num2 != 0) {
                             System.out.println(name +":" +num1 +"/" +num2 +"=" +(num1/num2));
                         } else {
                             System.out.println("num2 can not be 0 !");     
                         }
                         break;
            default : System.out.println("null");
        } 
 
    }
 
}
 
class Demo {
    public static void main(String[] args) {
        Calculator cal = new Calculator();
        cal.init(10 ,'%' ,3);
        cal.calculate();
        System.out.println("bye");
    } 
}
 
//运行结果 
[root@bch04 java]# java Demo
my Carculator:10.0%3.0=1.0
bye


  

二、构造方法

1. 定义:

对象创建出来时,没有值:

1.png


对象创建出来时,有值:

2.png


构造方法作用:对对象进行初始化

3.png      

  

2. 构造函数的特点:

1)在对象建立时由jvm调用,给对象初始化

2)在创建对象时调用

3)函数名与类名一致

4)没有返回值类型

5)当类中没有定义构造函数时,系统默认加上一个空参数的构造函数,有则覆盖

6)一个类中可以定义多个构造函数,以进行不同的初始化,以重载的形式体现

 

 

3. 构造代码块的特点:

1)给所有的对象进行统一初始化

2)创建对象时就运行,优先于构造函数

3)一般用于将所有构造方法中公共的信息抽取出来

4)与构造函数区别:全部对象和部分对象的区别

 

例子

[root@bch04 java]# cat Demo9.java 
class Boy {
  String name;
  int age;
  String gender;
 
   // 构造代码块,给所有对象进行初始化
  {
       System.out.println("哭。。。");
  }
     
  Boy() {
       System.out.println("无参构造");
  }
 
  Boy(String n, int a, String g) {
       name = n;
       age = a;
       gender = g;
       System.out.println("有参构造");
  }
 
  void run() {
       System.out.println("跑...");
  }
 
}
 
public class Demo9 {
  public static void main(String[] args) {
       System.out.println();
       Boy b = new Boy();
       Boy b2 = new Boy("jack", 1, "男");
  }
}
 
//运行结果
[root@bch04 java]# java Demo9
 
哭。。。
无参构造
哭。。。
有参构造


 

三、this关键字

1)表示所在函数所属对象的引用

2this只能在非静态中(没有static修饰)函数使用

3)构造函数间相互调用必须放在构造函数的第一个语句中

4)可以解决构造函数中对象属性和函数形参的同名问题

 

class Person {
       String name;
       int age;
 
       Person() {
       }
 
       Person(String n){
              name=n;
       }
 
       Person(String n, int a) {
              //构造函数不能直接通过函数名直接调用,编译报错!!!
              Person(n);
              age = a;
       }
}

 

例子

//在构造函数中打印this与创建对象时打印对象名p,结果一样,说明this和p是一样,都是内存地址值
class Student {
    String name;
    String gender;
    int age;
 
    Student() {
    }
 
    Student(String name) {
       this();
       this.name = name;
    }
 
    Student(String name, String gender, int age) {
       this(name);
       System.out.println(this);  //Student@659e0bfd
       this.gender = gender;
       this.age = age;
    }
 
    void speak() {
       run();
       System.out.println("姓名:" + name + " 性别:" + gender + " 年龄:" + age
              + " 嘿嘿");
    }
 
    void run() {
       System.out.println("run.....");
    }
 
}
 
class Demo2 {
    public static void main(String[] args) {
       Student p = new Student("tom", "male", 28);
       System.out.println(p); // Student@659e0bfd
       p.speak();
    }
}
 
//运行结果
[root@bch04 java]# java Demo2
Student@659e0bfd
Student@659e0bfd
run.....
姓名:tom 性别:male 年龄:28 嘿嘿