Skip to content

封装

封装

面向对象三大特征:封装,继承,多态

将类的某些信息隐藏在类的内部,不允许外部程序直接访问这些信息,外部只能通过该类提供的特定方法来实现对隐藏信息的操作和访问。

java
public class Test {
	public static void main(String[] args) {
//		Student.age = 1;
		Student student = new Student();
    student.id = 1;
		student.age = 11;
		student.name = "张三";
		student.show();

		Student student2 = new Student();
     student.id = 2;
		student2.age = 20;
    student2.name = "李四";
		student2.show();
	}
}
java
public class Student {
	private static int id;
	private String name;
	public int age;
	
	static {
		System.out.println("代码块");
	}
	
	public void show() {
		System.out.println("学生信息如下:");
		System.out.println("编号:"+getId());
		System.out.println("姓名:"+getName());
		System.out.println("年龄:"+getAge());
	}

如何实现封装:

1.修改属性的访问权限,设置为private(私有) 2.创建公有public的getter和setter方法 getter:让外部来获取属性的方法 setter:让外部来修改属性的方法 3.setter方法中加入属性控制语句,以确保属性的正确性和合理性。

java
public class Student {
	private static int id;
	private String name;
	public int age;
	
	static {
		System.out.println("代码块");
	}
	
	public void show() {
		System.out.println("学生信息如下:");
		System.out.println("编号:"+getId());
		System.out.println("姓名:"+getName());
		System.out.println("年龄:"+getAge());
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		if(age < 0) {
			System.out.println("输入的年龄有误,已赋默认值16");
			this.age = 16;
		}else {
			this.age = age;
		}
	}
}
java
 public class Test {
	public static void main(String[] args) {
		Student.age = 1;
		Student student = new Student();
		student.age = 11;
		student.setId(1);
		student.setName("张三");
		student.setAge(-20);
		student.show();
		Student student = new Student();
		student.age = 1;
		System.out.println("student的年龄是:"+student.age);
		Student student2 = new Student();
		student2.age = 2;
		System.out.println("student的年龄是:"+student.age);
		System.out.println("student2的年龄是:"+student2.age);
	}
}

static修饰符,表示静态修饰符

可以修饰: 1.成员变量 静态变量,可通过类名直接访问 2.成员方法 静态方法,可通过类名直接调用 3.代码块:写在类中,方法之外,并且用{} 包裹起来的一段代码。当程序中访问该类时,自动执行代码块中的语句。

静态代码块,当JVM加载该类时,执行该代码,并且只执行一次。

类变量(成员变量)和实例变量

用static修饰的成员变量也叫做类变量 表示该变量不再属于某个对象了,而是属于该类,所有的对象共享该属性,内存中只有1份。

没有被static修饰的成员变量也叫做实例变量,一个对象对应一个,内存中有N份。

静态方法:

不能直接访问该类的实例属性 可以访问该类的实例化对象的实例属性

不能直接访问该类的实例方法 可以访问该类的实例化对象的实例方法

不能使用this关键字: this指的是当前的实例对象,而静态关键字描述的是一种共有的信息,不属于任何一个实例对象,属于类,被所有的实例对象所共用, this表示实例,static表示非实例,所以二者不能兼容。

java
public class Test {
	public static void main(String[] args) {
		User user = UserTools.getUserById(2);
		System.out.println(user);
	}
}
java
public class UserTools {
	//定义一个集合Map(类似数组数据结构的一个容器),集合中填入多个User对象,供外部使用
	private static Map<Integer,User> map;
	static {
		map = new HashMap<Integer,User>();
		//创建多个User对象,填入到map中
		map.put(1, new User(1,"张三",22));
		map.put(2, new User(2,"李四",22));
		map.put(3, new User(3,"王五",22));
	}
	
	public static User getUserById(int id) {
		return map.get(id);
	}
}

静态代码块

JVM加载类时,执行了静态代码块, 如果有多个静态代码块,按顺序执行

类的构造方法用于创建类的实例对象,类的 静态代码块用于初始化类,给类的静态变量赋值。

例1:

使用封装实现电子宠物系统的企鹅类正确输入年龄 保证年龄的有效值(0-10),否则取默认值6。

java
public class Penguin {
	private int age;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		if(age>=0 && age <= 10) {
			this.age = age;
		}else {
			this.age = 6;
		}
	}

	@Override
	public String toString() {
		return "Penguin [age=" + age + "]";
	}
	
}
java
public class Test2 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("欢迎来到电子宠物系统");
		System.out.print("请输入企鹅的年龄:");
		int age = scanner.nextInt();
		Penguin penguin = new Penguin();
		penguin.setAge(age);
		System.out.println(penguin);
	}
}

例2:

模拟实现投票,多个选民进行投票,每个选民只能投一次,并且当投票总数大于100时,停止投票。

java
public class Person {
	private static int vote;
	public void vote() {
		vote++;
	}
	public int getVote() {
		return vote;
	}
	
}
java
public class Test3 {
	public static void main(String[] args) {
		//多个选民投票
		while(true) {
			Person person = new Person();
			person.vote();
			if(person.getVote() > 100) {
				break;
			}
			System.out.println("当前的票数是:"+person.getVote());
		}
		System.out.println("投票结束!");
	}
}