面向对象-封装_构造函数

匿名对象
直接在堆中创建对象,没有任何引用,调用方法完成后就会被垃圾回收器回收!
应用场景:当只需要调用类中一次方法时,可以使用匿名对象!
每new一个匿名对象,都会从新创建一个对象!
1
2
3
4
new  Person().run();
new  Person().setName( "小明" );
new  Person().getName();
   
创建了三个匿名对象,且当语句执行完毕后,该匿名对象便会成为垃圾。

this关键字
this表示当前对象,this关键字只能在方法内部使用,表示对“调用方法的哪个对象”的引用;
在构造器中调用构造器,可以使用this关键字;
例如调用无参构造器,可以在有参构造器中加入this();
练习:比较两个人的年龄是否相同
1
2
3
public  boolean  compareAge(Person person){
         return  this .age==person.age;
     }
this可以代表当前调用方法的对象,per1.compareAge(per2),方法中的this.age等价于per1.age;


基本数据类型和引用数据类型参数传递过程
基本数据类型形式参数的改变不会影响实际参数,因为形式参数的作用域值局限于方法内部;
应用数据类型参数传递的是对象的地址,当修改对象的内容时,会导致实际引用对象的改变;
1
2
3
4
5
6
7
8
public  static  void  main(String[] args) {
     int  number= 5 ;
     modifyParams(number);
     System.out.println(number); //syso.out输出为5,形参改变不能导致实参改变
}
public  static  void  modifyParams( int  number){
     number+= 5 ;
}
基本数据类型形参改变不能导致实参改变
引用数据类型示例
1
2
3
4
5
6
7
8
9
public  static  void  main(String[] args) {
     Person per1= new  Person();
     per1.setAge( 18 );
     modifyParam(per1);
     System.out.println(per1.getAge()); //syso.out输出为20,引用传递的参数为对象地址,直接修改的堆内存中的对象
}
public  static  void  modifyParam(Person person){
     person.setAge( 20 );
}
引用传递的参数为对象地址,直接修改的堆内存中的对象


封装
是指隐藏对象的属性和实现细节,仅对外提供公共访问方式
常见的封装体:
函数就是一个封装体
类也是一个封装体
数组也是一个封装体
举例:
机箱
机箱就是对CPU、主板、风扇的封装,它隐藏了CPU、主板、风扇等细节,提供了一个电源作为公共访问方式。
封装的好处:
  1. 提高代码复用性,可以将重复率高的代码封装到一个方法中,需要用到就直接调用方法即可。
  2. 隐藏了实现细节,对外提供了公共访问方式,便于调用者的使用。
  3. 提高了安全性,使用private进行封装,只有本类中成员可以访问!
用private关键字修饰的变量叫做私有化变量,私有是封装的一种体现。
使用private修饰的字段, 必须有setter和getter方法作为公共的访问方式

封装是面向对象的基本特征之一
面向对象有三大基本特征: 封装、继承、多态

构造函数:
使用构造函数初始化对象
一:对象通过new关键字分配内存空间, 默认初始化,并且字段被付默认值;
二: 构造函数初始化,传入到构造函数的实参修改对象中字段的初始化值;使用 this.字段代表当前对象的字段
1
Person person= new  Person( "lisi" );

创建对象时,为了使对象描叙更准确,需要对对象初始化。
构造函数可以对对象初始化。
初始化内容语句在方法体当中实现。

当类中不存在构造函数时, new person()语句会自动调用类中 隐式的person(){};构造方法
当类中存在构造函数 person(int age,String name){};时,便 不存在隐式的person(){};构造方法,需要开发者自己提供person(){};无参构造方法

隐式的无参构造函数时编译器编译java文件为class文件时,编译器发现类中没有构造方法, 会自动添加隐式构造方法;
当类中已经存在了构造方法,编辑器就不会自动添加隐式构造方法;
编译器还会在默认main方法结尾默认添加return语句;

构造函数的一些细节
1、一个类中可以有多个构造函数,它们以重载形式体现(重载:方法签名相同,参数不同)
2、构造函数也有return语句,不过是用来结束方法;
3、构造函数能被private修饰,但是被私有后不能在其它程序中创建本类对象。(一般对象工厂会私有化构造函数,将创建对象的方法保存在静态方法中)
1
2
3
public  static  Person generatePerson(){
     return  new  Person();
}
1
Person person=Person.generatePerson();


在构造方法中可以调用其它构造方法,调用时,构造方法必须放在第一行;
原因是:初始化动作要先执行;
在构造函数中调用其它构造函数,需要使用this()关键字;
1
2
3
4
5
public  Person(String name,  int  age) {
     this (name); //初始化name字段,必须放在第一行
     this .name=name; //给name字段赋值
     this .age = age;
}


构造方法的递归,构造方法不停的压栈,导致栈内存溢出;
1
2
3
4
5
6
7
Person(){
     this ( "lisi" ); //调用Person("lisi"){}
};
Person(String name){
     this (); //调用Person(){}
     this .name=name;
};

this关键字小细节
每一个成员方法都包含有this关键字,this关键字所指向的地址就是当前对象的地址;
1
person.method();

person.method()等价于this.method();




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值