Java封装

241 阅读1分钟

将类的某些信息隐藏在类内部,不允许外部程序直接访问

通过该类提供的方法来实现对隐藏信息的操作和访问

隐藏对象的信息

留出访问的接口

实现步骤

1.修改属性的可见性(设为private,限定只能在当前类内访问)

private String name;

2.创建getter/setter方法(设为public,用于属性的读写)

3.在getter/setter方法中加入属性控制语句(对属性值的合法性进行判断)

        //创建get/set方法
	//在get/set方法中添加对属性的限定
	public void setName(String name) {
		this.name=name;
	}
	public String getName() {
		return "我是:"+this.name;
	}

                one.setName("嘟嘟");
		System.out.println(one.getName());

快速创建getter/setter方法:空白区域-右键Source-Generate Getters and Setters

只有getXXX方法的属性是只读属性

只有setXXX方法的属性是只写属性

加入属性控制语句:

        public int getMonth() {
		return month;
	}
	public void setMonth(int month) {
		if(month<=0) {
			System.out.println("年龄不能为负数");
		}else {
			this.month = month;
		}
	}

                one.setMonth(3);
		if(one.getMonth()==0) {
			return;
		}
		System.out.println(one.getMonth());

利用带参构造方法对成员属性进行赋值时,同样建议采用get/set方法进行属性控制

        public Cat(int month) {
		//this.month=month;
		this.setMonth(month);
	}

Cat one = new Cat(10);
//或者改为
Cat one = new Cat(-10);

public class Message {
	public Message(MessageYonghu a,MessageYonghu b) {
		if((a.getName()==b.getName())&(a.getCode()==b.getCode())){
			System.out.println("================");
			System.out.print("完全一致");
		}else {
			System.out.println("================");
			System.out.print("用户名或密码不一致");
		}
	}
}

public class MessageYonghu {
	private String name;
	private int code;
	public MessageYonghu(String a,int b){
		this.code=b;
		this.name=a;
	}
	public String getName() {
	return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getCode() {
		return code;
	}
	public void setCode(int code) {
		this.code = code;
	}
}

public class MessageTest {
	public static void main(String[] args) {
		MessageYonghu c = new MessageYonghu("Lucy", 13456);
		MessageYonghu d = new MessageYonghu("Mike", 123456);
		System.out.println("用户名:" + c.getName());
		System.out.println("密码:" + c.getCode());
		System.out.println("用户名:" + d.getName());
		System.out.println("密码:" + d.getCode());
		Message s = new Message(c, d);
	}
}

使用包进行类管理

Java中一个包里不能存在同名类

包的命名(全部英文小写):域名倒序+模块+功能

package com.imooc.animal;//定义包

必须放在Java源文件中的第一行

一个Java源文件中只能有一个package语句

建议每个包内存储信息功能单一

XXX cannot be resolved to a type无法解析的一种类型(俗称:找不到)

如何跨包调用?

import com.imooc.animal.*;//加载com.imooc.animal下所有类
import com.imooc.animal.Cat;//加载com.imooc.animal下指定的Cat类

建议采用“import 包名.类名;”的方式加载,提高效率

//直接加载com.imooc.animal.CatTest
com.imooc.animal.CatTest tex=new com.imooc.animal.CatTest();

//会报错,程序无法分辨两个不同包下的Cat类
import com.imooc.animal.Cat;
import com.imooc.mechane.Cat;

加载类的顺序跟import导入语句的位置无关,先去找能够直接解析的类

import com.imooc.animal.Cat;//只执行它的Cat类,因为以类名导入优先级最高
import com.imooc.mechane.*;

com.imooc.mechane.Cat cat=new com.imooc.mechane.Cat();//强制执行包mechane下的Cat类

import 包名.*;只能访问指定包名下的类,无法访问子包下的类

static关键字

//static:静态 静态成员、类成员 无论在该类中实例化多少个对象,对于静态成员price,他们都会共用同一块存储空间
//类加载时产生,彻底销毁时释放,生命周期长
public static int price;

                //类外静态成员访问方式
		//类.成员
		Cat.price=30;
		//对象.成员
		cat.price=1000;

通过该类实例化的所有对象都共享类中静态资源,任一对象中信息的修订都将影响所有对象。

static+属性=静态属性/类属性

static+方法=静态方法/类方法

static不能修饰类以及方法内的局部变量

在成员方法中,可以直接访问类中静态成员(属性和方法)

静态方法中不能直接访问同一个类的非静态成员和方法,只能直接调用同一个类的静态成员和方法

只能通过对象实例化后,对象.成员方法的方式访问非静态成员和方法

静态方法中不能使用this

public static void eat() {
                //类内非静态成员访问方式:生成对象,通过对象访问
		Cat temp=new Cat();
		temp.run();
                temp.name="dudu";
		this.name="dudu";//报错
		name="dudu";//报错
		price=1300;
	}

不允许在方法内定义静态变量,如static int test=10;错误

{
}//普通代码块,定义在方法内部,顺序执行代码

{
}//构造代码块(创建对象时调用,优先于构造方法执行)定义在类内部,
//可以给普通成员和静态成员赋值
//与构造方法的区别在于,构造方法是在new执行时有选择性的调用带参或者无参构造,而构造代码块则是,在每个对象实例化时都一定会执行

static{
}//静态代码块(类加载时调用,优先于构造代码块执行)定义在类内部,
//只能给静态成员赋值,除非对象实例化

 无论产生多少类实例,静态代码块只执行一次,仅希望执行一次的代码可以放在静态代码块中

执行优先级:静态代码块>构造代码块>构造方法

不能在静态代码块声明静态成员,可以声明非静态成员

静态代码块中生命的成员,在外部无法进行访问

方法内定义的局部变量,作用范围为:自定义位置起,至方法结束。在此期间,不允许方法中普通代码块内存在局部变量的声明