黑马程序员:Java之介绍对象、封装、构造函数、构造代码块及this关键字

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

什么是面向对象?

面向对象是一种将复杂的东西简单化的思想,有三个特征:封装、继承、多态

从生活出发,理解类与对象的关系

类:对现实生活中事物的描述,描述包含事物的属性和行为

对象:这类事物,实实在在存在的个体

举个简单的例子:

技术主管吩咐开发专员开发一个功能模块。

开发专员就是一个对象,技术主管只要通过这个对象就可以实现想要的功能,而开发专员具体怎么开发技术主管不需要知道。

成员变量与成员函数

上面讲到类就是对事物的描述,包含事物的属性和行为,即变量与方法,定义的变量为成员变量,方法为成员函数。

成员变量与局部变量的作用范围

  • 成员变量:成员变量作用于整个类中
  • 局部变量:局部变量作用于函数中或语句中(for语句)

成员变量与局部变量在内存中的位置

  • 成员变量:在堆内存中,随对象的存在而存在。不赋值也可参与运算,堆内存中的变量会自动默认初始化
  • 局部变量:存在栈内存中。不赋值是不能参与运算的。栈内存中的变量不会默认初始化

建立对象的方法:

1
Person p =  new  Person();

注:对象存在与堆内存中,p是一种类类型变量,属于一种引用型变量,p引用堆内存中的new Person()

 

匿名对象

格式:new Person();

匿名对象的使用方式

  • 当对对象的方法只调用一次时,可以用匿名对象来完成,这样写比较简化。
  • 可以将匿名对象作为实际参数进行传递。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public  static  void  main(String[] args)
    {
         show( new  Car());
    }
    public  static  void  show(Car c)
    {
         c.num =  3 ;
         c.color =  "black" ;
         c.run();
    }

注:如果对一个对象进行多个成员调用,必须给这个对象起个名字。

 

封装(Encapsulation)

封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。

好处:将变化隔离,便于使用,提高重用性,提高安全性。

封装原则:将不需要对外提供的内容都隐藏起来,可通过private私有化

把属性都隐藏,提供公共方法对其访问。

 

构造函数

特点:

  • 函数名与类名相同
  • 不用定义返回值类型
  • 不可以写return语句
  • 每个类都有一个默认的构造函数Person(){},默认构造函数看不到,定义了就成自定义构造函数了,默认构造函数的权限随着类的变化而变化
  • 多个构造函数式以重载的形式存在
  • 若写了带有参数的构造函数即指定构造函数(Person(int x){}),一定要自定义Person(){} 这个原来被默认的构造函数,否则在很多时候会出错,比如new Person(); 这时候会初始化Person(int x){},而因对象没传入参数而编译出错;再比如存在继承关系的时候,自定义构造函数中存在super();会因定义了Person(int x){}而没定义Person(){}导致“无法将类 Person中的构造器 Person应用到给定类型”错误

作用:给对象进行初始化(对象一建立,就会调用与之对应的构造函数)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class  Person
{
     Person()
     {
         System.out.println( "person ren" );
     }
}
class  PersonDemo
{
     public  static  void  main(String[] args)
     {
         Person p =  new  Person();  //结果:person ren
     }
}

构造函数和一般函数的执行时间

  • 构造函数:对象一建立就运行,给对象初始化,一个对象建立,构造函数只执行一次。

  • 一般函数:当被调用时才执行。可被对象调用多次。

什么时候定义构造函数?

当分析事物时,该事物本身存在一些特性或者行为,那么将这些内容定义在构造函数中

 

构造代码块

作用:给对象进行初始化

对象一建立就运行,而且优先于构造函数执行。

构造代码块和构造函数的区别

  • 构造代码块是给所有对象进行统一初始化
  • 构造函数是给对应的对象初始化


this关键字

this代表它所在函数所属对象的引用。哪个对象在调用this所在的函数,this就代表哪个对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class  Person
{
     private  String name;
     private  int  age;
     Person(String name)
     {
         this .name = name;  //当局部变量名与成员变量名想同时,方法内的变量会优先认为为局部变量。可通过this关键字来定义其变量为对象所属的成员变量。当不存在局部变量与成员变量相同时,可不使用this,但是使用this阅读性更好
     }
     Person(String name, int  age)
     {
         this (name);
         this .age = age;
     }
     public  void  speak()
     {
         System.out.println( "name=" + this .name+ "\tage=" + this .age);
     }
}
 
class  PersonDemo
{
     public  static  void  main(String[] args)
     {
         Person p =  new  Person( "onename" );
         Person p1 =  new  Person( "twoname" , 13 );
         p.speak();
         p1.speak();
     }
}

this的应用:本来函数中用到本类对象时,使用this关键字引用

this语句,用于构造函数之间互相调用 this(name); 构造函数之间调用只能用this。

this语句只能放在函数的第一行。原因是初始化的动作先执行,再执行赋值的初始化

注意:this语句调用得注意避免出现死循环

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值