JAVA面向对象编程之封装

JAVA之面向对象编程三大特征:封装、继承、多态

JAVA之面向对象编程四大特征:三大特征 + 抽象

一、与其他语言普通封装的区别

(一)普通封装

如果要实现一些功能或者存储一些数据,可以将这些功能和数据集中在一个类中,在需要的时候创建出本类的对象,进行调用(使用)。

(二)java类的封装

作用1:在普通封装的基础上,再进一步对代码进行限制,提高代码数据的安全性

作用2:已经成为了java的开发规范,以后很多框架都要求类进行封装

二、实现形式

(一)步骤1:将所有成员属性私有化   private ,禁止外界直接访问

package demo;

public class Student {
	// 成员属性 学号 姓名 年龄 性别
	private int id;
	private String name;
	private char sex;
	private int age;
}

注意:此时在程序运行的类中main函数运行时,不能直接使用  引用名.属性名  进行调用或赋值

如:

package demo;

public class Demo01 {
	public static void main(String[] args) {
		Student stu = new Student(101,"坤坤",'男',18);
		stu.age = 10086;	
	}
}

此时会报错:

the field Student.age is not visible

 那么,如何调用成员属性呢?

(二)步骤2:为所有的属性对外提供公共的访问方式 进行访问

        1、获取属性的通用方法名:

public 数据类型  getXxx(){}

        2、修改属性的通用方法名:

public 数据类型   SetXxx(){}

         3、Eclipse快速创建方法:

找到标题栏【Source】,在下拉菜单中找到并点击【Generate Getters and Setters...】

在弹出窗口,选择需要自动生成的方法。点击【Generate】按钮即可。

效果:

	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 char getSex() {
		return sex;
	}

	public void setSex(char sex) {
		this.sex = sex;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

三、java 的四大权限修饰符

修饰符当前类同一个包(package)子孙类处于其他包中其他包的其他类
public
protected
(空)
private

  (一)public

        1、公共的权限修饰符

        2、可以用来修饰类,在一个java源文件中只能有一个类被声明为public,而且一旦有一个类为public,那这个java源文件的文件名就必须要和这个被public所修饰的类的类名相同,否则编译不能通过。另外,一个类作为外部类的时候只能被public或者默认访问修饰符所修饰,但是一个类如果作为内部类的时候,则可以被四种访问修饰符所修饰,因为一个类作为内部类的时候,就作为外部类的一个成员属性了,因此可以有四种访问修饰符修饰,这是内部类和外部类的一个区别。

        3、用来修饰类中成员属性时,在当前工程下任意类都能访问。通过操作该类的对象能随意访问该成员

        4、被修饰的成员能被所有的子类继承下来。

 (二)protected

        1、受保护的权限修饰符

        2、不可以用来修饰外部类

        3、同一个包(package)的所有类能访问,如果不同包,只有子类能访问

        4、被修饰的成员能被该类的所有的子类继承下来

 (三)(空白)(默认权限)

        1、又称default或frendly,友好的权限修饰符

        2、可以用来修饰类

        3、”友好的“指的是对同一个包的类友好,即只能在同一个包中访问

        4、只能被该类所在同一个包中的子类继承下来

(四)private

        1、私有的权限修饰符

        2、不可以用来修饰外部类

        3、只有所在的当前类才能访问

四、this 关键字

 (一)含义

        代表当前类对象的引用(本类有成员属性,在本类中使用)

 (二)作用

        1、调用出当前类所有的属性和方法

        2、当形参名字和成员属性的名字一样时,为了区分等号左右两边,使用this 代表本类的属性

(三)例子

        一般在使用Eclipse 快速创建私有属性的获取和设置方法时会自动出现

package demo;

/*学生类
 */
public class Student {
	// 成员属性 学号 姓名 年龄 性别
	private int id;
	private String name;
	private char sex;
	private int age;

	//空参构造
	public Student() {
		// TODO Auto-generated constructor stub
	}

	public Student(int id, String name, char sex, int age) {
		super();
		this.id = id;
		this.name = name;
		this.sex = sex;
		this.age = age;
	}

	// 成员方法 (功能)
	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 char getSex() {
		return sex;
	}

	public void setSex(char sex) {
		this.sex = sex;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

五、构造方法特性

  1. 如果什么构造方法都不写,此时会默认隐藏一个空参构造
  2. 如果写了有参构造,不写空参构造,那么隐藏的空参构造就会被覆盖掉
  3. 习惯:无论是否使用空参,都顺手写一个空参

六、封装的场景

 只要有成员属性的类,都要封装

七、 static 关键字

(一)含义

        静态修饰符(共享)

(二)运用

        (1)修饰成员属性→转变为静态属性

                  1、归属于类,使用类名调用

                  2、被本类所有的对象所共享

还是举前面创建学生类的例子:

package demo;
/*
 * 学生类
 * */
public class Student {
	// 成员属性 学号 姓名 年龄 性别
	private int id;
	private String name;
	private char sex;
	private int age;

	// 构造方法 空参构造
	public Student() {
		// TODO Auto-generated constructor stub
	}
}

此时创建实例的话:

package demo;

public class Demo01 {
	public static void main(String[] args) {
		Student stu01 = new Student();
		Student stu02 = new Student();
        stu01.setName("张三");
        stu02.setName("李四");
		System.out.println(stu01.getName());		
		System.out.println(stu02.getName());		
	}
}

打印结果:

张三

李四

如果将"name"属性加上 "static" 修饰符(为了方便调整类属性,将其修改为公共属性):

public static String name;

那么:

package demo;

public class Demo01 {
	public static void main(String[] args) {
		Student stu01 = new Student();
		Student stu02 = new Student();
        stu01.setName("张三");
        stu02.setName("李四");
        Student.name ="王五";
		System.out.println(stu01.getName());		
		System.out.println(stu02.getName());		
	}
}

打印结果:

王五

王五

修改顺序:

package demo;

public class Demo01 {
	public static void main(String[] args) {
		Student stu01 = new Student();
		Student stu02 = new Student();
        stu02.setName("李四");
        Student.name ="王五";
        stu01.setName("张三");
		System.out.println(stu01.getName());		
		System.out.println(stu02.getName());		
	}
}

打印结果:

张三

张三

说明该属性(静态属性)所有成员与Student类共享了,修改任意一个,类和所有的实例的该属性都会变化。

形象表示如下图:

在本例中显然不合理,但是静态属性也会有自己使用的地方,此处不做深入展开。

        (2)修饰成员方法→转变为静态方法(类方法)

                  1、归属于类,使用类名调用

                 2、被本类所有的对象所共享

                3、静态方法无法访问非静态的数据,也没有  this.属性  的调用方式。除非在方法内部创建一个新对象

//静态方法

public static void method(){

        Student stu = new Stu();

        System.out.println(stu.name);

}

                4、一般main方法和工具类方法才会使用

八、匿名对象

(一)对比

        1、匿名:即没有名字(引用)

new Student();

        2、带名字(引用)的:

Student stu = new Student();

(二)作用:

        由于没有引用,所以无法复用,如果一个功能只使用一次,就可以考虑使用匿名对象。

        例如输出一个0-9之间随机的正整数

        一般写法:

Random ran = new Random();

System.out.println(ran.nextInt(10));

        匿名对象写法:

System.out.println(new Random().nextInt(10));

 九、类图

【精选】【Java】UML类图详解-详细易懂_java类图_crayon_ycj的博客-CSDN博客 

【精选】[UML] 类图介绍 —— 程序员(灵魂画手)必备画图技能之一_类图怎么画-CSDN博客

 参考以上两篇文章

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值