java基础08_面向对象(上-03)

245 阅读6分钟

1.封装与权限

1.1 问题引入:

当我们创建一个类的对象以后,我们可以通过"对象.属性"的方式,对对象的属性进行赋值。这里,赋值操作要受到属性的数据类型和存储范围的制约。除此之外,没其他制约条件。

但是,在实际问题中,我们往往需要给属性赋值加入额外的限制条件。这个条件就不能在属性声明时体现,我们只能通过方法进行限制条件的添加。(比如:setLegs()同时,我们需要避免用户再使用"对象.属性"的方式对属性进行赋值。则需要将属性声明为私有的(private)。

-->此时,针对于属性就体现了封装性。(private:有,但是不一定能用)

1.2封装性思想具体的代码体现:

体现一:将类的属性xxx私化(private),同时,提供公共的(public)方法来获取(getXxx)和设置(setXxx)此属性的值

private double radius;
public void setRadius(double radius){
	this.radius = radius;
}
public double getRadius(){
	return radius;
}

体现二:不对外暴露的私有的方法 体现三:单例模式(将构造器私有化) 体现四:如果不希望类在包外被调用,可以将类设置为缺省的。

1.3.权限

image.png

image.png

1.4使用

package oop02;

public class Person {

	private int age;
	
	public void setAge(int a ) {
		if(a < 0 || a >130) {
			System.out.println("输入数据不合理~!");
		}else {
			age = a;
		}
	}
	
	public int getAge() {
		return age;
	}
}

package oop02;

public class PersonTest {

	public static void main(String[] args) {
		
		Person p = new Person();
		
		int age = p.getAge();
		System.out.println(age);//0
		
		p.setAge(6);
		System.out.println(p.getAge());//6

	}
}

2.构造器(类的结构③;①②属性方法)

2.1构造器的作用:

  • 1.创建对象:new+构造器
  • 2.初始化对象的信息
Person p = new Person();//Person()就是构造器
Person p = new Person(“Tom”);//对应相应的构造器

2.2使用说明:

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

2.3举例

//属性
//构造器
public Person(){
		System.out.println("Person().....");
	}
//方法
//修改上题中类和构造器,增加name属性,使得每次创建Person对象的同时初始化对象的age属性值和name属性值。
	public Person(String s,int a) {
		name = s;
		age = a;
	}
  
  //Test
Person p1 = new Person("mk",18);
System.out.println("name:"+p1.getName()+",age:"+p1.getAge());
	        
        

2.4编写两个类,TriAngle和TriAngleTest,其中TriAngle类中声明私有的底边长base和高height,同时声明公共方法访问私有变量。此外,提供类必要的构造器。另一个类中使用这些公共方法,计算三角形的面积。

package oop02;

public class TriAngle {
	
/*编写两个类,TriAngle和TriAngleTest,
 * 其中TriAngle类中声明私有的底边长base和高height,同时声明公共方法访问私有变量。
 * 此外,提供类必要的构造器。
 * 另一个类中使用这些公共方法,计算三角形的面积。
 */
	
	private double base;
	private double height;

	//构造器
	public TriAngle() {}
	public TriAngle(double b,double h) {
		base = b;
		height = h;
	}
	
	public void setBase(double b) {
		base = b;
	}
	public double getBase() {
		return base;
	}
	
	
	public void setHeight(double h) {
		height = h;
	}
	public double getHeight() {
		return height;
	}
	
	
}

package oop02;

public class TriAngleTest {
	

	public static void main(String[] args) {
		TriAngle t = new TriAngle();
		t.setBase(5);
		t.setHeight(3);
		System.out.println("base:"+t.getBase()+",height:"+t.getHeight());
	
	
		TriAngle t1 = new TriAngle(5.5,4);
		System.out.println("base:"+t1.getBase()+",height:"+t1.getHeight());

		double t1area = t1.getBase()*t1.getHeight()/2;
		System.out.println("t1area:"+t1area);
	}
	
	
	
	
}

2.5 总结:属性赋值的先后顺序

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

2.6JavaBean

JavaBean是一种Java语言写成的可重用组件。

所谓javaBean,是指符合如下标准的Java类:

- 类是公共的
- 有一个无参的公共的构造器
- 有属性,且有对应的get、set方法
- 用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以

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

image.png

3 关键字this

3.1this理解

  • 它在方法内部使用,即这个方法所属对象的引用;
  • 它在构造器内部使用,表示该构造器正在初始化的对象。
public void setBase(double base) {
	this.base = base;
    }

3.2this使用

this 可以调用类的属性、方法和构造器

什么时候使用this关键字呢?

当在方法内需要用到调用该方法的对象时,就用this。

具体的:我们可以用this来区分属性和局部变量。

类的方法中,我们可以使用"this.属性"或"this.方法"的方式,调用当前对象属性或方法。但是,通常情况下,我们都择省略"this."。特殊情况下,如果方法的形参和类的属性同名时,我们必须显式的使用"this.变量"的方式,表明此变量是属性,而非形参

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

3.3this调用构造器:

  1. 我们在类的构造器中,可以显式的使用"this(形参列表)"方式,调用本类中指定的其他构造器
  2. 构造器中不能通过"this(形参列表)"方式调用自己
  3. 如果一个类中有n个构造器,则最多有 n - 1构造器中使用了"this(形参列表)"
  4. 规定:"this(形参列表)"必须声明在当前构造器的首行
  5. 构造器内部,最多只能声明一个"this(形参列表)",用来调用其他的构造器。你喜欢女孩A,女孩A喜欢女孩B,可以,你不能喜欢女孩A和女孩B。

3.4this练习

4.关键字import,package

4.1package

使用说明:

  1. 为了更好的实现项目中类的管理,提供包的概念
  2. 使用package声明类或接口所属的包,声明在源文件的首行
  3. 包,属于标识符,遵循标识符的命名规则、规范(xxxyyyzzz)、“见名知意”
  4. 每"."一次,就代表一层文件目录。 举例 image.png

常见包 image.png

4.2import导入

  1. 在源文件中显式的使用import结构导入指定包下的类、接口
  2. 声明在包的声明和类的声明之间
  3. 如果需要导入多个结构,则并列写出即可
  4. 可以使用"xxx.*"的方式,表示可以导入xxx包下的所结构
  5. 如果使用的类或接口是java.lang包下定义的,则可以省略import结构
  6. 如果使用的类或接口是本包下定义的,则可以省略import结构
  7. 如果在源文件中,使用了不同包下的同名的类,则必须至少一个类需要以全类名的方式显示。
  8. 使用"xx."方式表明可以调用xxx包下的所结构。但是如果使用的是xx子包下的结构,则仍需要显式导入
  9. import static:导入指定类或接口中的静态结构:属性或方法。

5.MVC

image.png