首页 > 技术文章 > 面向对象编程(二)封装--构造方法,this关键字,static关键字,方法重载

wzy330782 2016-03-17 22:27 原文

面向对象三大特点:封装、继承、多态

封装概念

①   将东西包装在一起,然后以新的完整形式呈现出来:

将方法和字段一起包装到一个单元中,单元以类的形式实现;

②   信息隐藏,隐藏对象的实现细节,不让外部直接访问到;

③   将数据和方法包装进类中,加上具体实现的隐藏,共同被称作封装,其结果是一个同时带有特征和行为的数据类型;

④   定义类,定义其属性、方法的过程称为封装类;

 

信息隐藏式OOP最重要的功能之一,也是使用访问修饰符的原因;

信息隐藏的原因包括:

①   对模块的任何实现细节所作的更改不会影响使用该模块的代码;

②   防止用户意外修改数据;

③   是模块易于使用和维护;

 

访问修饰符

①   public:该类或非该类都均可访问;

②   private:只有该类可以访问;

③   protected:该类及其子类的成员可以访问,同一个包中的类也可以访问;

④   默认:同一包中的类可以访问;

 

属性封装的实现

①   修改属性的可见性来限制对属性的访问;

②   为每个属性创建一对赋值(setter)方法和取值(getter)方法,用于公开对这些属性的访问接口;

③   在setter和getter方法中,根据需要加入对属性操作的限制;

要点:除非必须公开底层实现细节,否则应该将所有属性指定为private加以封装;使用属性封装,通过增加数据访问限制,增强了类的可维护性;

 

封装方法的目的

①   隐藏方法实现细节(方法体),向外部提供公开接口(方法头),以供安全;

②   简化调用,方便修改维护;

③   根据需要,可以私有化方法以供类内部使用----帮助方法help;

 1 public class TeacherDemo
 2 {
 3     public static void main(String []agrs){
 4         Teacher t=new Teacher();
 5         //t.name="张三";//不能直接赋值
 6         t.setName("张三");
 7         System.out.println(t.getName());
 8         t.setAge(10);
 9         System.out.println(t.getAge());
10     }
11 }
12 
13 class Teacher
14 {
15     private String name;
16     private int age;
17     public void setName(String tname){
18         name=tname;
19     }
20     public String getName(){
21         return name;
22     }
23     public void setAge(int tage){
24         if(tage<25)
25         {
26             System.out.println("年龄太小了");
27             age=25;
28         }
29         else
30         {
31             age=tage;
32         }
33     }
34     public int getAge(){
35         return age;
36     }
37 }
View Code

 

类的构造方法的概念和作用

①   构造方法负责对象初始化工作,为对象的属性赋合适的初始值;

②   创建对象时,其类的构造方法确保在用户操作对象之前,系统保证初始化的进行;

构造方法的语法规则

①   构造方法名与类名相同

②   没有返回类型

③   方法实现主要为字段赋初值

构造方法的调用和特别:new操作符(返回新建实例的引用)

无参构造方法

 1 public class ConstructorDemo
 2 {
 3     public static void main(String []agrs){
 4         Person p=new Person();//实例化的时候是有初始值的int默认0,String默认null
 5         p.setName("张三");
 6         p.setAge(10);
 7         System.out.println(p.toString());
 8     }
 9 }
10 
11 //当一个类没有显示声明一个构造方法时,系统会有一个默认的无参构造方法
12 class Person
13 {
14     private String name;
15     private int age;
16     private String city;
17     
18     //默认的构造方法,实例化时候会调用,此处不写也可以,系统已默认写好
19     public Person(){
20         System.out.println("Person");
21     }
22     
23 
24     public void setCity(String pcity){
25         city =pcity;
26     }
27     public String getCity(){
28         return city;
29     }
30     
31     public void setName(String pname){
32         name=pname;
33     }
34     public String getName(){
35         return name;
36     }
37     
38     public void setAge(int page){
39         age=page;
40     }
41     public int getAge(){
42         return age;
43     }
44     
45     public String toString()
46     {
47         return "名字:"+name+",今年"+age+"岁,家住"+city;
48     }
49 }
View Code

带参构造方法

 1 public class ConstructorDemo
 2 {
 3     public static void main(String []agrs){
 4         //带参调用,若不写参数会报错,因为Person中只有一个带参的构造方法
 5         Person p=new Person("张三",10,"杭州");
 6         //1、在堆中开辟空间,给属性分配默认的初始值
 7         //2、假设属性一开始就赋值了,就进行赋值工作
 8         //3、调用构造方法对属性进行初始化
 9         System.out.println(p.toString());
10     }
11 }
12 
13 class Person
14 {
15     private String name="李四";
16     private int age;
17     private String city;
18     
19     //带参数的构造方法
20     public Person(String pname,int page,String pcity ){
21         name=pname;
22         age=page;
23         city=pcity;
24     }
25     
26     public void setCity(String pcity){
27         city =pcity;
28     }
29     public String getCity(){
30         return city;
31     }
32     
33     public void setName(String pname){
34         name=pname;
35     }
36     public String getName(){
37         return name;
38     }
39     
40     public void setAge(int page){
41         age=page;
42     }
43     public int getAge(){
44         return age;
45     }
46     
47     public String toString()
48     {
49         return "名字:"+name+",今年"+age+"岁,家住"+city;
50     }
51 }
View Code

 

this关键字

特点:

①在类的方法中使用的this关键字代表的是调用此方法的对象的引用;

②this可以看作是一个变量,它的值是当前对象的引用;

③使用this可以处理方法中的成员变量和形参同名的问题;

④当方法内需要用到调用该方法的对象时,就可以用this;

⑤在类的构造方法中可以调用this([参数列表])来调用该类的指定构造方法。

 1  public class ConstructorDemo
 2 {
 3     public static void main(String []agrs){
 4         Person p=new Person("张三",10,"杭州");
 5         System.out.println(p.toString());
 6     }
 7 }
 8 
 9 
10 class Person
11 {
12     private String name="李四";
13     private int age;
14     private String city;
15     
16     //构造方法
17     public Person(){
18         System.out.println("无参构造方法");
19     }
20     
21     //带参数的构造方法
22     public Person(String name,int age,String city ){
23         
24         this();//表示调用当前对象的无参构造方法,必须写在第一句
25         
26         //此处将形参名称写成age与属性名相同
27         //age=age;//此处不会对属性重新赋值age=0
28         this.age=age;//此处对属性重新赋值age=10,this代表p    
29         this.name=name;
30         this.city=city;
31         
32     }
33     
34     public void setCity(String city){
35         this.city=city;
36     }
37     public String getCity(){
38         return city;
39     }
40     
41     public void setName(String name){
42         this.name=name;
43     }
44     public String getName(){
45         return name;
46     }
47     
48     public void setAge(int age){
49         this.age=age;
50     }
51     public int getAge(){
52         return age;
53     }
54     
55     public String toString()
56     {
57         //默认前面都是有this的,可写可不写
58         System.out.println(this.getAge());
59         return "名字:"+this.name+",今年"+age+"岁,家住"+city;
60     }
61 }
View Code

 

static关键字

特点:

①用来修饰类的成员----修饰成员变量的称之为类变量(静态变量),修饰成员方法的称之为类方法(静态方法);

②当类被加载时就会被加载,优先于对象的存在;

③用来修饰语句块----称之为静态代码块。先于构造方法之前执行,只会执行一次,用来对静态成员做初始化;

④静态修饰的成员被所有的对象共享;

⑤调用的时候可以直接通过类名.成员来进行访问

static关键字注意事项

①   静态方法中只能访问外部的静态成员;

②   静态方法中不能出现this;

 

非静态

 1 public class StaticDemo
 2 {
 3     public static void main(String []agrs){
 4         Account acc1=new Account();
 5         acc1.number1++;
 6         acc1.showNumber1();
 7         acc1.showNumber2();
 8         
 9         Account acc2=new Account();
10         acc2.showNumber1();
11         acc2.showNumber2();
12     }
13 }
14 
15 class Account
16 {
17     public int number1=1;
18     public int number2=2;
19     public void showNumber1()
20     {
21         System.out.println(number1);
22     }
23     public void showNumber2()
24     {
25         System.out.println(number2);
26     }
27 }
View Code

静态1

 1 public class StaticDemo
 2 {
 3     public static void main(String []agrs){
 4         Account acc1=new Account();
 5         acc1.number1++;
 6         acc1.showNumber1();
 7         //acc1.showNumber2();
 8         
 9         
10         Account acc2=new Account();
11         acc2.showNumber1();
12         //acc2.showNumber2();
13     }
14 }
15 
16 class Account
17 {
18     public static int number1=1;//静态变量(类变量),它不属于任何一个对象,被多个对象共享
19     public int number2=2;
20     public void showNumber1()
21     {
22         System.out.println(number1);
23     }
24     public void showNumber2()
25     {
26         System.out.println(number2);
27     }
28 }
View Code

静态2

 1 public class StaticDemo
 2 {
 3     public static void main(String []agrs){
 4         Account.number1++;
 5         System.out.println(Account.number1);
 6         Account.showNumber1();
 7         
 8         Account acc1=new Account();
 9         acc1.showNumber2();
10         
11         Account acc2=new Account();
12         acc2.showNumber2();
13     }
14 }
15 
16 class Account
17 {
18     public static int number1=1;//静态变量(类变量),它不属于任何一个对象,被多个对象共享
19     public int number2=2;
20     //静态方法中不能使用非静态的变量
21     //静态方法中不能使用this
22     public static void showNumber1()
23     {
24         //showNumber2();//报错
25         System.out.println(number1);
26         //System.out.println(this.number2);//报错 
27     }
28     
29     //非静态的方法可以访问静态的内容和非静态的属性和方法
30     public void showNumber2()
31     {
32         showNumber1();
33         System.out.println(number2);
34         System.out.println("非静态方法访问静态变量:"+number1);
35     }
36     
37     //构造方法
38     public Account(){
39         System.out.println("constructor");
40     }
41     
42     //static语句块
43     //在类被加载时就会执行,只会执行一次,用来对静态的变量赋值
44     //优先于构造方法执行
45     static{
46         System.out.println("static");
47         number1=100;
48     }
49 }
View Code

 

方法重载

多数程序设计语言要求为每个方法(函数)提供一个独一无二的方法名,不存在方法重载的概念

在Java中,规定方法签名是解析方法的规则而不是方法名,为方法重载开创了条件

方法重载使得在一个类中,方法名相同而参数列表不同的方法可同时存在,代表相似的行为和功能

 

重载overload概念:同一类中,同名不同参的方法称为重载方法

注意:仅有返回类型不同的方法不能称为重载,即方法重载必须方法签名不同

 1 public class OverloadDemo{
 2     public static void main(String []agrs){
 3         Printer p=new Printer(2000);
 4         p.print("hello");    
 5         p.print(10);
 6         p.print("hello",10);
 7     }
 8 }
 9 
10 class Printer{
11     private String brand="联想";
12     private double price;
13     
14     public Printer(double price){
15         this.price=price;
16     }
17     
18     public Printer(String brand,double price){
19         this.brand=brand;
20         this.price=price;
21     }
22 
23     public void print(String content){        
24         System.out.println("字符串"+content);
25     }
26     
27     public void print(int content){        
28         System.out.println("整型"+content);
29     }
30     
31     public void print(String str,int content){        
32         System.out.println(str+"--"+content);
33     }
34     
35     public int print(int content,double d){        
36         return content;
37     }
38 }
View Code

 

推荐阅读