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;
}
}
五、构造方法特性
- 如果什么构造方法都不写,此时会默认隐藏一个空参构造
- 如果写了有参构造,不写空参构造,那么隐藏的空参构造就会被覆盖掉
- 习惯:无论是否使用空参,都顺手写一个空参
六、封装的场景
只要有成员属性的类,都要封装
七、 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博客
参考以上两篇文章