面向对象——封装

突如其来的空闲时间真是让人不知所措,所以临时决定再写点什么东西。

面向对象(OOP)(Object Oriented Programming)是以对象为中心,把一项工程看做是由一个个对象组成,这些对象之间存在的关系构成了整个项目。可以说,这是一种更加符合我们习惯的思想,可以将复杂的事情简单化。
面向对象的三大基本特征:封装(encapsulation)、继承(inheritance)、多态(polymorphism)
这次先写写封装

1、封装的好处

1.安全
2.隔离变化
3.操作简单
4.可重复使用

2、封装的原则

把隐藏的的隐藏起来,该暴露的暴露出来。

3、封装的入门

常规写法:用private修饰属性,为每个属性提供对应的get和set方法(偷懒小技巧:鼠标右键→Source→Generate Getters and Setters…)
(ps:private表示私有属性,public表示公有属性)

3.1、代码实例

public class Dog {
	private int age;// 私有属性
	private String name;
	// 提供公有的get/set方法
	public void setAge(int age) {
		this.age=age;
	}
	public int getAge() {
		return age;
	}
	public void setName(String name) {
		this.name=name;
	}
	public String getName() {
		return name;
	}
	// 成员方法
	public void howl() {
		System.out.println("小狗在嚎叫");
	}
}

测试

public class DogTest {

	public static void main(String[] args) {
		Dog dog = new Dog();// 创建对象
		
		dog.setName("单身狗");// 调用公有方法,给成员变量赋值
		dog.setAge(21);
		
		String name = dog.getName();// 获取实例变量的值
		int age=dog.getAge();
		System.out.println(name);
		System.out.println(age);
		
		dog.howl();// 调用成员方法
	}
}

3.2、入门小结

1.封装可以隐藏该类一些功能的实现。在允许调用者通过事先实现的方法访问类的功能和数据的同时,限制对类中数据的不合理访问;
2.对数据进行检查,有利于保护对象信息的完整和合理性;
3.便于对代码的修改和维护,提高代码的可维护性。

4、this关键字

this表示当前对象或可理解为正在创建的对象。

4.1、this关键字与成员变量赋值

public class Dog {
	private int age;
	private String name;
	public void setAge(int age) {
		this.age=age;
	}
	public int getAge() {
		return age;
	}
	public void setName(String name) {
		this.name=name;
	}
	public String getName() {
		return name;
	}
}

4.2、this关键字与类中方法的互调

public class Dog {
	private int age;
	private String name;
	
	public void howl() {
		System.out.println("小狗在嚎叫");
		this.eat();
	}
	public void eat() {
		System.out.println("小狗在吃骨头");
	}
}

4.3、this关键字与构造方法

注意:this语句在调用其他构造函数时必须在该构造函数中处于第一条有效语句,一旦在它前面有任何有效语句,都会造成编译错误

public class Employee {
	private String name;
	private int salary;
	/*
	 * 执行顺序:
	 * 		Employee()→Employee(String n)→Employee(String n,int s)
	 * 最终状态:
	 * 		name的值为Employee,salary的值为5000
	 */
	public Employee(String n,int s) {
		name = n;
		salary = s;
	}
	public Employee(String n) {
		this(n,5000);// 调用本类的构造函数Employee(String n,int s)
	}
	public Employee() {
		this("Employee");// 调用本类的构造函数Employee(String n)
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}	
}
public class Test2 {

	public static void main(String[] args) {
		Employee employee = new Employee();
		System.out.println(employee.getName());
		System.out.println(employee.getSalary());
	}
}

结果:
Employee
5000

5、构造函数

5.1、构造函数的作用

1.对对象的属性进行初始化或者进行初始化的工作;
2.与new一起使用来创建对象。

5.2、构造函数的特点

1.方法名与类名一致,且不提供任何数据类型的返回值;
2.没有返回值,可以只写一个return;
3.在一个类中如果没有显示任何构造器,系统会提供一个默认的无参构造器(正常情况下是隐藏起来的);
4.在一个类中如果声明了任何构造器,系统就不会提供默认的无参构造器(这点要注意!!!)。

5.3、构造函数的实例

代码

public class Dog {
	private String name;
	private int age;
	public Dog() {
		super();
		System.out.println("这是无参构造函数");
	}
	public Dog(String name,int age) {
		System.out.println("这是有参构造函数");
		this.name=name;
		this.age=age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

执行

public class Test {

	public static void main(String[] args) {
		Dog dog1 = new Dog();// 无参构造函数
		dog1.setName("落花");
		dog1.setAge(2);
		System.out.println(dog1.getName());
		System.out.println(dog1.getAge());
		System.out.println("==========");
		Dog dog2 = new Dog("流水", 3);// 有参构造函数
		System.out.println(dog2.getName());
		System.out.println(dog2.getAge());
	}
}

结果

这是无参构造函数
落花
2
==========
这是有参构造函数
流水
3

温馨提示:为了您和您的程序代码的安全,请永远手动给出无参构造函数

5.4、构造函数的重载

在一个类中可以定义多个构造函数,这就是构造函数的重载。(ps:构造函数的重载在上面其实也出现过ヾ(≧▽≦*)o)

public class Employee {
	private String name;
	private int salary;
	
	public Employee() {
		name = null;
	}
	public Employee(String n,int s) {
		name = n;
		salary = s;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}	
}
public class Test2 {

	public static void main(String[] args) {
		Employee employee = new Employee();
		// 由于没有参数,所以调用 Employee()
		System.out.println(employee.getName());
		System.out.println(employee.getSalary());
		System.out.println("-----");
		Employee employee2 = new Employee("A",5000);
		// 由于参数是String、int,所以调用 Employee(String n,int s)
		System.out.println(employee2.getName());
		System.out.println(employee2.getSalary());
	}
}

6、static关键字

static主要用于修饰类的属性和方法,实现类的静态属性和静态方法共享

6.1、静态声明

1.静态属性
在普通属性的声明中,加上static关键字就是属性声明为静态属性。

public class Demo {
	public static int number = 2;
}

2.静态方法
在普通方法的声明中,加上static关键字就是方法声明为静态方法。

public class Demo {
	public static int sum(int x,int y) {
		return x+y;
	}
}

3.访问静态属性和静态方法
访问静态属性和静态方法时,不需要使用对象实例进行引用,只需要类名引用。

public class UseDemo {

	public static void main(String[] args) {
		System.out.println(Demo.number);
		int a = 10;
		int b = 5;
		System.out.println(Demo.sum(a, b));
	}
}
结果:
2
15

4.静态代码块
静态代码块随着类的初始化而初始化,只执行一次。

public class StaticDemo {
	// 静态代码块在加载类的字节码后立即执行,不需要创建对象实例
	static {
		System.out.println("static block 1");
	}
	static {
		System.out.println("static block 2");
	}
	// 通常使用static和final配对定义常量
	public static final double pi = 3.1415;
	public StaticDemo() {
		System.out.println("构造函数的调用");
	}
	
	public static void main(String[] args) {
		System.out.println("StaticDemo.pi:"+StaticDemo.pi);
	}
}

6.2、静态与实例

静态属性和静态方法是属于类范围的,称为类属性或类方法。
实例属性和实例方法是属于对象范围的,称为实例属性或实例方法。
1.定义

public class StaticAndInstance {
	public StaticAndInstance(int id) {
		this.id = id;
	}
	
	private int id;
	public int getId() {
		return id;
	}

	public static final double pi = 3.1415;
	public static void testStatic() {
	}
}

2.存放位置
静态属性和静态方法:随着类的加载保存在方法区。
实例属性和实例方法:随着对象的建立存在于堆内存。

3.生命周期
实例变量和对象实例的生命周期是相同的。实例变量的内存空间技术在对象的内存空间中,是在JVM的堆中分配的。
静态变量和类的生命周期是相同的。通常将类加载到方法区后,知道JVM停止前,它都是一直存在的。

4.访问方式
静态属性的生存期不依赖于对象,可以在各个实例之间共享,其他的类不用实例化即可调用它们。

	public static void main(String[] args) {
		// 静态调用,不用创建相应的对象实例
		System.out.println(StaticAndInstance.pi);
		StaticAndInstance.testStatic();
		
		// 实例调用,一定要创建对象实例
		StaticAndInstance instance1 = new StaticAndInstance(1);
		System.out.println(instance1.getId());
	}

5.常见错误提示
实例方法可以访问实例变量和静态变量;
静态方法不能直接访问实例属性和实例方法;
在静态方法中创建对象后调用实例方法;
在静态方法中只能访问静态变量和静态方法;
只能在实例方法中使用this,静态方法中不能使用;

6.3、注意事项

1.在static方法中只能访问static属性和static方法,不能访问类的实例变量和成员方法;
2.static修饰的方法不能被改写或覆盖。因为静态方法是类方法,是属于类的,和对象无关;
3.static方法内部不能有this和super;
4.访问静态变量和方法:类名.静态成员。

好家伙,我后悔了,这临时决定写的博客差点把我人都写没了o((⊙﹏⊙))o.。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值