Java学习笔记——面向对象(封装与隐藏)

本文详细介绍了Java中的封装性概念,包括属性的私有化、getter和setter方法的使用,以及权限修饰符的作用。通过Person类的例子展示了如何限制属性赋值并实现数据验证。此外,还探讨了构造器的功能,如初始化对象和属性,并讲解了this关键字的用途,特别是在构造器中的应用。最后提到了包和import关键字在组织和导入类中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面向对象的特征一:封装与隐藏

一、问题的引入

  1. 为什么要引入封装性
    程序设计追求“高内聚,低耦合”。
  • 高内聚:类的内部数据操作细节自己完成,不允许外部干涉
  • 低耦合:仅对外暴露少量的方法用于使用
    隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的思想。
  1. 当我们创建一个类的对象以后,我们可以通过“对象.属性”的方式,对对象的属性进行赋值。这里,赋值操作要受到属性的数据类型和存储范围的制约。除此之外,没有其他制约条件。但是,在实际问题中,我们往往需要给属性赋值加入额外的限制条件。这个条件就不能在属性声明时体现,只能通过方法进行限制条件的添加。(比如:setLegs)。同时,我们需要避免用户再使用“对象.属性”的方式进行赋值,则需将属性声明为私有的(private)—>此时,针对属性就体现了封装性。

二、封装性的体现

我们将类的属性xxx私有化(private),同时,提供公共的(public)方法来获取(getxxx)和设置(setxxx)此属性的值。
拓展:封装性的体现:①如上 ②不对外暴露的私有方法 ③单例模式…
封装性的体现,需要权限修饰符来配合。

三、权限修饰符

1. Java规定的4种权限

从小到大排列:private、缺省、protected、public
在这里插入图片描述

2.4种权限可以用来修饰类和类的内部结构:属性、方法、构造器、内部类

具体的,4种权限都可以用来修饰类的内部结构:属性、方法、构造器、内部类
修饰类的话,只能使用:缺省、public

总结封装性:Java提供了四种权限修饰符来修饰类及类的内部结构,体现类及类的内部结构在被调用时的可见性的大小。

四、类的结构之三:构造器(或构造方法、constructor)的使用

1.构造器的作用

  1. 创建对象
  2. 初始化对象的属性

2.说明

  1. 如果没有显式的定义类的构造器的话,则系统默认提供一个空参的构造器
  2. 定义构造器的格式:权限修饰符 类名(形参列表){}
  3. 一个类中定义的多个构造器,彼此构成重载
  4. 一旦显式的定义了类的构造器之后,系统就不再提供默认的空参构造器。
  5. 一个类中,至少会有一个构造器。
package com.lijing.exer1;

/*
 * 
 * 1.创建程序,在其中定义两个类:Person和PersonTest类。定义如下:
 * 用setAge()设置人的合法年龄(0~130)岁,用getAge()返回人的年龄。
 * 
 * 在PersonTest类中实例化Person类的对象b,调用setAge()和getAge()方法,体会Java的封装性
 * 
 * 2.练习2
 * 2.1 在1中定义的Person类中添加构造器,利用构造器设置所有人的属性为18
 * 2.2修改上题中类和构造器,增加name属性,使得每次创建Person对象的同时初始化对象的age属性值和name属性值
 */
public class Person {

	private int age;
	private String name;

	// 2.1
	public Person() {
		age = 18;
	}

	// 2.2
	public Person(String n, int a) {
		name = n;
		age = a;

	}

	public void setAge(int a) {
		if (a < 0 || a > 130) {
//			throw new RuntimeException("传入的数据非法");
			System.out.println("传入的数据非法");
			return;
		}
		age = a;
	}

	public int getAge() {
		return age;
	}
	
	public void setName(String n) {
		name=n;
	}
	
	public String getName(String n) {
		return name;
	}

}
package com.lijing.exer1;
/*
 * 
 * 1.创建程序,在其中定义两个类:Person和PersonTest类。定义如下:
 * 用setAge()设置人的合法年龄(0~130)岁,用getAge()返回人的年龄。
 * 
 * 在PersonTest类中实例化Person类的对象b,调用setAge()和getAge()方法,体会Java的封装性
 * 
 */
public class PersonTest {

	public static void main(String[] args) {
		Person b = new Person();
		b.setAge(20);
		int age1 = b.getAge();
		System.out.println("age: " + age1);

		// 构造器创建对象2.1
		Person person = new Person();
		System.out.println(person.getAge());

		// 构造器创建对象2.2
		Person person1 = new Person("aliee", 18);
		System.out.println(person1.getName(null) + "\t" + person1.getAge());
	}
}

3.总结:属性赋值过程(先后顺序)

  1. 默认初始化
  2. 显式初始化
  3. 构造器中赋值
  4. 通过“对象.属性”或“对象.方法”的方式,进行赋值

以上操作的先后顺序:1→2→3→4

4.JavaBean

JavaBean是一种Java语言写成的可重用组件。所谓JavaBean,是指符合如下标准的Java类:

  • 类是公共的
  • 一个无参的公共的构造器
  • 属性,且对应的get、set方法

用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用Java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。

package com.lijing.test1;

public class Customer {

	private int id;
	private String name;
	
	public Customer() {

	}

	public void seId(int i) {
		id=i;
	}


	public String getId() {
		return id;
	}

	public void setName() {
		name=n;
		return lastName;
	}
	
	public void getName() {
		return name;
	}
	
}

* UML类图

在这里插入图片描述

五、this关键字

  1. this可以用来修饰、调用:属性、方法;构造器

  2. this修饰属性和方法 this理解为:当前对象 或 当前正在创建的对象

    2.1 在类的方法中,我们可以使用“this.属性”或“this.方法”的方式,调用当前对象属性或方法。但是,通常情况下,我们都选择省略“this”。特殊情况下,如果方法的形参和类的属性重名,我们必须显式的的使用“this.变量”的方式,表明此变量是属性,而非形参。
    2.2 在类的构造器中,我们可以使用“this.属性”或“this.方法”的方式,调用当前正在创建的对象的属性或方法。但是,通常情况下,我们都选择省略“this”。特殊情况下,如果构造器的形参和类的属性重名,我们必须显式的的使用“this.变量”的方式,表明此变量是属性,而非形参。

  3. this修饰构造器
    3.1 我们在类的构造器中,可以显式的使用“this(形参列表)”的方式,调用本类中的其他构造器。
    3.2 构造器中不能通过“this(形参列表)”的方式调用自己。
    3.3 如果一个类中有n个构造器,则最多有n-1个构造器使用了“this(形参列表)”。
    3.4 规定:“this(形参列表)”必须声明在当前构造器的首行
    3.5 构造器内部,最多只能声明一个“this(形参列表)”用来构造其他构造器

代码示例:

package com.lijing.java2;

public class PersonTest {

	public static void main(String[] args) {
		Person p1 = new Person();
		p1.setAge(1);
		System.out.println(p1.getAge());
		
		p1.eat();
		System.out.println("*******");
		
		Person p2 = new Person("tom",18);
	}
}

class Person {

	private String name;
	private int age;
	
	public Person() {
		this.eat();
		String info="Person初始化时,需要考虑如下的....(假装有40行代码)";
		System.out.println(info);
	}
	
	public Person(String name) {
		this();  //这句话表示调用上面的person构造器,可以避免40行代码的冗余,根据this()里面形参的样式判断调用的是哪个构造器
		this.name=name;
		//Person初始化时,需要考虑如下的....(假装有40行代码)
	}
	
	public Person(int age) {
		this();
		this.age=age;
		//Person初始化时,需要考虑如下的....(假装有40行代码)
	}

	public Person(String name,int age) {
		this(age);
		this.name=name;
//		this.age=age;
		//Person初始化时,需要考虑如下的....(假装有40行代码)
	}
	
	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return this.name;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getAge() {
		return this.age;
	}
	
	public void eat() {
		System.out.println("人吃饭");
		this.study();
	}
	
	public void study() {
		System.out.println("人学习");
	}
}

六、package&import关键字

package关键字的使用

  1. 为了更好地事项项目中类的管理,提供包的概念
  2. 使用package声明类或接口所属的包,声明在源文件的首行
  3. package:属于标识符,遵循标识符的命名规则、规范、“见名知义”
  4. 每“.”一次,就代表一层文件目录

补充:同一个包下,不能命名同名的接口、类
不同的包下,可以命名同名的接口、类

import关键字

import:导入

  1. 在源文件中显式的使用import结构导入指定包下的类、接口

  2. 声明在包的声明和类的声明之间

  3. 如果需要导入多个结构,则并列写出即可

  4. 可以使用“xxx.*”的方式,表示可以导入xxx包下的所有结构

  5. 如果使用的类或接口是java.lang包下定义的,则可以省略import结构

  6. 如果使用的类或接口是本包下定义的,也可以省略import结构

  7. 如果在源文件中使用了不同包下的同名的类,则必须至少有一个类需要以全类名的方式显示

    Date date=new Date();
    java.sql.Date date1=new java.sql.Date(15255152054425873115L);

  8. 使用“xxx.*”方式表明可以调用xxx包下的所有结构。但是如果使用的是xxx子包下的结构,则仍需要显式导入。

  9. import static:导入指定类或接口中的静态结构:属性、方法

*MVC设计模式

MVC是常用的设计模式之一,将整个程序分为三个层次:数据模型层、视图模型层和控制器层。这种将程序输入输出、数据处理,以及数据的展示分离开来的设计模式使程序结构变得灵活而且清晰,同时也描述了程序各个对象之间的通信方式,降低了程序的耦合性。

模型层 model 主要处理数据

数据对象封装 model.bean/domain
数据库操作类 model.dao
数据库 model.db

视图层 view 显示数据

相关工具类 view.utils
自定义ui view.ui

控制层 controller 处理业务逻辑

应用界面相关 controller.activity
存放fragment controller.fragment
显示列表的适配器 controller.adapter
服务相关的 controller.service
抽取的基类 controller.base

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值