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

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

一、问题的引入

  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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值