Java(9)封装

1.面向对象的第一大特征:封装性

  • 当我创建了对象以后,我如果直接通过“对象名.属性名”的方式去对属性赋值的话,可能会出现一些不符合
  • 实际情况的问题,所以我们不考虑使用“对象名.属性名”的方式赋值,而是通过“对象名.方法名”的方式进行赋值,
  • 因为我们可以在方法里面加大量的业务逻辑对属性值进行限制
解决方式:
  • 使用封装
    *1.将属性私有化
    *2.提供公用的(getting setting)方法实现调用和赋值

比如:(一个学生类)
年龄age如果只写成int 类型,那在用对象名.属性名的方法赋值的时候写-1也是可以的,但是与现实情况不符,所以采用封装。将属性私有化,提供公用的get set方法调用和赋值(读写)。

//学生类
public class Student {
	
	int stuNo;//学号
	String stuName;//姓名
	//private:修饰符权限:用private修饰符的属性和方法只能在类的内部访问,出了此类就不能调用了
	private int age;//年龄
	
	//个人描述
	public void desc(){
		System.out.println("我的学号"+stuNo+",我的姓名是:"+stuName+",我今年:"+age+"岁");
	}
	
	//赋值
	public void setAge(int age1){
		if(age1>0 && age1<=150){
			age=age1;
			
		}else {
			System.out.println("请输入合法年龄!!!");
		}
	}

	//取值
	public int getAge(){
		return age;
	}

测试一下:

public class TestStudent {

	public static void main(String[] args) {
		//创建学生对象
		Student stu=new Student();
		
		//给属性赋值
		stu.stuNo=1001;
		stu.stuName="刘能";
		
		//调用setAge方法对年龄赋值
		stu.setAge(19);
		System.out.println(stu.getAge());
		stu.desc();
	}

}

如果setAge里19换成-1就会提示请输入合法年龄。


遇到问题:学生类中有太多的属性及对应的set方法,在初始化时容易忘记,有没有可能简化对象的初始化代码?

2.构造方法

在我们使用类的时候会使用一个特殊的方法叫构造方法,也叫构造器

(1)作用

:构造方法就是专门创建对象的方法,当我们在new的时候其实调用就是构造方法。

(2)如果创建构造方法呢?

public 构造方法名(参数){ }

注意:

  • 1.构造方法不能写返回值
  • 2.构造方法名必须和你当前的类名一模一样,大小写都得一样
  • 构造方法是一个方法,那么他可以进行方法重载吗?
  • 可以
(3)构造方法的作用
  • 1.定义无参构造方法,可以new对象
  • 2.定义有参构造方法,可以在new对象的同时给属性赋值

注意:

  • 如果类中没有定义构造方法,系统会自动给我提供一个无参的构造方法,
  • 如果类中自己定义了有参构造方法,它会把系统提供的无参构造方法覆盖掉,需要手动再提供一个无参构造方法。

例如:
(一个学校类,两个属性,校名,地址)

private String name;//校名
private String address;//地址

创建一个 构造方法

//构造方法
		public School(){
			System.out.println("构造方法执行了");
		}

可以重载

//重载的构造方法
		public School(String name1){
			System.out.println("一个参数的构造方法执行了");
			name=name1;
		}
		

两种赋值方法:
① 使用get-set方法赋值(只能赋值单个值)

//第一种使用set方法给属性赋值,只能赋值单个值
		public void setName(String name1){
			name=name1;
		}

		public String getName(){
			return name;
		}
		public void setAddress(String address1){
			address=address1;
		}
		public String getAddress(){
			return address;
		}

②使用构造方法赋值

//第二种使用构造方法给属性赋值
		public School(String n,String a){
			name=n;
			address=a;
		}

测试一下:

public class TestSchool {

	public static void main(String[] args) {
		
		School sc1=new School("枣庄学院");  //很明显这是有参的那个构造方法(重载的)的赋值。所以输出:一个参数的构造方法执行了。
		
		System.out.println(sc1.getName());  //输出了学校名字“枣庄学院”

		System.out.println("=======使用set方法给属性赋值=========");
		//创建school对象
		School sc=new School();//new 后面的这个方法就是构造方法(无参数,赋值取值使用get-set,且一次只能赋值一个)
		sc.setName("国际希望小学");
		sc.setAddress("山东");
		System.out.println("校名:"+sc.getName()+",地址:"+sc.getAddress());
		
		
		System.out.println("============使用构造方法给属性赋值=================");
		//new对象的同时给属性赋值,省去了set方法的麻烦,针对多个属性同时赋值的场合
		School sc2 = new School("北京XX","北京海淀区");   //针对多个属性同时赋值的场合
		//如果单个变量值需要改变用set方法
		sc2.setAddress("山东济宁");
		System.out.println("校名:"+sc2.getName()+",地址:"+sc2.getAddress());	
	}
}

在这里插入图片描述

3.this关键字

当局部变量和成员变量重名时,方法中会根据“就近原则”使用局部变量的值。
如果想要区分的话我们可以使用this关键字。

(1)格式

this.成员变量名

this可以理解为当前使用的对象或者正在创建的对象,通过哪个对象调用的方法谁就是this。

(2)this作用:
  • 1.可以修饰属性、方法、构造方法
  • 2.this可以理解为当前使用的对象或者正在创建的对象,通过那个对象调用的方法谁就是this
  • 3.可以在构造方法中通过“this(形参)”的方式调用本类中其他重载的构造方法
  • 注意:在构造方法内部必须写在首行

举个例子:

一个人,属性有自己的名字,和年龄。

public class Person {
	private String name;//自己的名字
	private int age;
	
	public void setName(String name){
		this.name=name;
		
	}
	
	public String getName(){
		return name;
		
	}
	
	public void setAge(int age) {
		this.age = age;
	}
	
	public int getAge() {
		return age;
	}  //这是有参的get-set方法。可以使用快捷键,不用自己敲。
	
	
	//创建打招呼 方法
	public void sayHello(String name){//对方的名字
		System.out.println(this.name+"对"+name+"说:你好啊!");
		//当前对象的吃饭方法  (方法调用方法)
		this.eat();
	}
	
	public void eat(){
		System.out.println("吃饭了");
	}
	
	//-------------------------------------------------------------------------
	//如果类中自己定义了有参构造方法,它会把系统提供的无参构造方法覆盖掉,需要手动再提供一个无参构造方法。
	
	public Person() {
		System.out.println("Person无参构造方法");
	}
	
	public Person(String name) {
		this.name = name;
		System.out.println("Person带name参数的构造方法");
	}
	
	public Person(int age) {
		this.age = age;
		System.out.println("Person带age参数的构造方法");
	}
	
	public Person(String name,int age){
//		this(name) ;3.可以在构造方法中通过“this(形参)”的方式调用本类中其他重载的构造方法
// *   注意:在构造方法内部必须写在首行
		this(age);
	this.name=name;
//		this.age =age;

		System.out.println("Person带name,age参数的构造方法");
	}
	
}

测试一下:

public class TestPerson {

	public static void main(String[] args) {
		
		//创建对象
		Person p=new Person();
		p.setName("赵四");//设置自己的名字
		p.sayHello("刘能");//设置对方的名字
		
		
		Person p1=new Person("张三",12);
		System.out.println("姓名:"+p1.getName()+",年龄"+p1.getAge());
	}

}

输出结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LIUBLOGS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值