小白的20天Java学习打卡day14

太原理工大学机器人团队20天学习打卡day14


从昨天开始使用的都是myeclipse,今天主要学习的时面向对象的封装性以及构造方法


1、面向对象的封装性

①测试类

	public class User {
	//年龄
	int age;
}
//用户测试类
public class UserTest {

	public static void main(String[] args) {
		// 创建User对象
		User user = new User();
		// 访问age
		// 读取年龄值【get】
		System.out.println("该用户年龄:" + user.age);

		// 修改年龄值
		user.age = 20;

		// 读取年龄值
		System.out.println("该用户年龄:" + user.age);
		
		//修改年龄值
        /*
        这里的age属性显然是完全暴露给外程序的,对于程序员来说可以操作User对象当中的所有细节,
        导致User中部分数据不安全。
        不建议这样,建议User类型进行封装,建议在外部程序不能随意访问User对象当中的属性
        这样可以保证属性的安全
        */
		user.age = -100;
	}

}

对于当前程序来说:

User类中的age属性在外部程序中可以随意访问,导致age属性不安全。一个User对象表示一个用户,用户的年龄不可能为负数,上述程序当中年龄值为负数,程序运行时并没有报错,这是当前程序存在的缺陷。

②封装性

面向对象包括三大特征封装,继承,多态

现在讲解封装机制

为什么要封装,封装有什么好处

  • 封装之后,对于那个事物来说,看不到这个事物比较复杂的那一面,只能看到该事物简单的那一面。
  • 复杂性封装,对外提供简单的操作入口。照相机就是一个很好的封装的案例,照相机的实现原理非常复杂,但是对于是用照相机的人来说,操作起来是非常方便非常便捷的。还有电视机也是封装的,电视机内存实现非常复杂,但是对于使用者来说不需要关心内部的实现原理,只需要会操作遥控器就行。
  • 封装之后才会形成真正的对象,真正的独立体
  • 封装之后就意味着以后的程序可以重复使用。并且这个事物应该适应性比较强,在任何场合都可以使用。
  • 封装之后,对于事物本身,提高了安全性。【安全级别高】
封装的步骤
  • 所有属性私有化,使用private关键字进行修饰,private表示私有的,修饰的所有数据只能在本类中访问

  • 对外提供简单的操作入口,也就是说以后外部程序想要访问age属性,必须通过这些简单的入口进行访问

    • 对外提供两个公开的方法,分别是set方法get方法
    • 想要修改属性,调用set方法
    • 想要读取属性,调用get方法
  • set方法的命名规范:

    public void set+属性名首字母大写(形参){

    }

  • get方法的命名规范:

    public 返回值类型 get+属性名首字母大写(){

    }

注意

getter and setter 方法没有static关键字

有static关键字的方法怎么调用:类名.方法名(实参);

没有static关键字的方法怎么调用:引用.方法名(实参);

实例
public class User {
	
	//属性私有化
	private int age;
	
	//set方法没有返回值,因为set方法只负责修改数据
	/*
	public void setAge(int age){
		age = age;//java有就近原则,这里其实并没有给age属性赋值,这里的age都是局部变量age
	}
	*/
	
	//setter
	public void setAge(int a){
		//编写代码进行安全控制
		if(a < 0||a > 150){
			System.out.println("对不起,您输入的年龄不合法");
			return;
		}
		
		//程序可以执行到这里的话,说明a年龄是合法的,则进行赋值运算
		age = a;
	}
	
	//getter
	public int getAge(){
		return age;
	}

}
public class Usertest {

	public static void main(String[] args) {
		// 创建User对象
		User user = new User();
		
		//编译报错,age属性私有化,在外部程序中不能直接访问
		//从此之后age属性非常安全,但是有点太安全了
		//对于目前的程序来说age属性彻底访问不到了
		//System.out.println("该用户年龄:" + user.age);
		
		//修改
		user.setAge(-100);
		
		//读取
		System.out.println(user.getAge());
	}

}

2、构造方法

构造方法又被称为构造函数/构造器/Constructor

①构造方法的语法结构

[修饰符列表] 构造方法名(形式参数列表){
	构造方法体;
}

②普通方法的语法结构

[修饰符列表] 返回值类型 方法名(形式参数列表){
	方法体;
}

③区别

  • 对于构造方法来说,返回值类型不需要指定,并且也不能写void,只要写上void这个方法就变成了普通方法。
  • 对于构造方法来说,构造方法的方法名必须和类型保持一致

④构造方法的作用

  • 构造方法存在的意义是,通过构造方法的调用,可以创建对象。
  • 创建对象的同时,初始化实例变量的内存空间

⑤构造方法怎么调用

  • new 构造方法名 (实参列表);

⑥构造方法调用执行结束后有没有返回值

  • 每一个构造方法实际上执行结束之后都有返回值,但是这个return 值;这样的语句不写。构造方法结束的时候java程序自动返回值,并且返回值类型是构造方法所在类的类型。由于构造方法的返回值类型就是类本身,所以返回值类型不需要编写

当一个类中没有任何构造方法的话,系统默认给该类提供一个无参数的构造方法,这个构造方法被称为缺省构造器

当一个类显示的将构造方法定义出来了,那么系统则不再默认为这个类提供缺省构造器。建议开发中手动的为当前类提供无参数构造方法。因为无参数构造方法太常用了。

构造方法支持重载机制,在一个类当中编写多个构造方法,这多个构造方法显然构成了方法重载

⑦成员变量之实例变量

  • 属于对象级别的变量,这种变量必须现有对象才能有实例变量。

  • 实例变量在没有手动赋值时,系统赋默认值,那么这个系统默认赋值是在什么时候完成的呢?

    是在类加载的时候吗?

    • 不是,因为类加载的时候只加载了代码片段,还没来得及创建对象,所以此时实例变量并没有初始化。
    • 实际上,实例变量的内存空间是在构造方法执行的过程中完成开辟的
    • 系统赋默认值的时候也是在构造方法执行过程当中完成赋值的
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值