面向对象的三大特性
1.面向对象-封装(encapsulation)
装个盒子。 通过权限修饰符来确保当前的类、方法、变量在什么情况下可见的一种手段。
1.1 封装的作用含义
需要让用户知道的暴露出来,不需要让用户了解的全部隐藏起来. 这就是封装.
白话:该露的露,该藏的藏.
专业:程序设计追求"高内聚,低耦合".高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用.
/*
为了解决数据安全问题 :
介绍一个关键字 private 私有的
private是一个成员修饰符,只能修饰成员不能修饰局部
访问权限,使用private修饰的成员被访问的权限为 : 只能在当前类中访问
私有的属性在使用时,需要同时提供公共的访问方式
设置器 setter : 为私有属性设置值
访问器 getter : 获取私有属性的值
注意 : 以后定义实体类中所有的属性,一般都设置为私有的,并同时提供一对公共的访问方式
封装 :
面向对象三大特性之一
隐藏内部的实现细节,对外提供公共的访问方式
封装是私有???,私有是封装
封装不仅仅是私有,类,方法,属性私有化等都是封装具体的体现
优点 :
提高代码的安全性
提高代码复用性,便于调用,便于修改内部代码,提高可维护性,可进行数据完整性检测,保证数据有效性
Javabean : 实体类的统称,符合Javabean类型定义规范的类称之为Javabean
1.类是公共的
2.至少提供一个空构造
3.私有的属性
4.公共的访问方式
5.重写toString和equals方法
*/
1.2 访问控制符,实现封装(封装的关键词)
关键字 | 同一个类 | 同一个包中 | 子类 | 所有类 |
---|---|---|---|---|
private | ***** | |||
default默认的 | ***** | ***** | ||
protected | ***** | ***** | ***** | |
public | ***** | ***** | ***** | ***** |
1.3 封装的使用细节
类的属性的处理:
一般使用private
。 (除非本属性确定会让子类继承)
提供相应的get/set
方法来访问相关属性. 这些方法通常是public
,从而提供对属性的读取操作。 (注意:boolean变量的get方法是用:is开头!)
JavaBean对象
Javabean : 实体类的统称,符合Javabean类型定义规范的类称之为Javabean
1.类是公共的
2.至少提供一个空构造
3.私有的属性
4.公共的访问方式
set+属性名首字母大写 -> 带参,无返回值
get+属性名首字母大写-> 无参,有返回值 boolean is+属性名首字母大写
5.需要重写toString方法和equals方法
/*编写 Java 程序用于显示人的姓名和年龄。定义一个人类Person。 该类中应该有两个属性:
姓名 (name) 和年龄 (age) 。定义构造方法用来初始化数据成员。再定义显示(display())
方法将姓名和年龄打印出来。在 main 方法中创建人类的实例然后将信息显示*/
public class PersonTest {
public static void main(String[] args) {
Person p = new Person();
p.setName("科比");
p.setAge(40);
p.display();//调用功能 科比是姓名,年龄是40
}
}
class Person{
private String name;//属性
private int age;//field
public Person() {
}//空构造
//在带2个参数构造器初始化成员变量
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//显示姓名和年龄 这是功能method
public void display(){
System.out.println(name+"是姓名,年龄是"+age);
}
public String getName() {
//访问器 getter : 获取私有属性的值
return name;
}
public void setName(String name) {
//设置器 setter : 为私有属性设置值
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
拓展:MVC思想 (是一种分层思想,一种设计模式)
-
M:Model层(模型层) : 处理数据、业务,再把处理后的数据提供给视图层
-
V:View层(视图层): 为用户展示数据,是数据最直观的体现
-
C:Controller层(业务逻辑层):
-
接收界面层的数据,对接受到的数据进行封装和类型转换
-
调用模型层的服务进行业务逻辑的处理
-
调用合适的视图去渲染数据。
-
2.面向对象-继承(extend, inheritance)
/*
继承 :
为什么要使用继承?
为了提高代码的的复用性,将子类的共性定义在父类中
如何使用继承?
子类 extends 父类
继承的作用: extends 延续+扩展
子类一旦继承父类,就有权使用父类的成员(属性和方法)
子类中可以扩展子类独有的内容(重新定义,追加属性和方法)
注意 :
父类 : 子类的共性
子类(实体类) : 一系列对象的共性
一个父类可以定义多个子类
但是一个子类只能继承一个父类--->单继承机制 : 优点:简单 缺点 : 不够灵活,不变后期维护
子父类继承关系下 :
父类|超类 : 被继承的类
子类|派生类 : 继承父类的类
*/
public class Extends {
public static void main(String[] args) {
Teacher t = new Teacher("马云",49,"英语");
t.teach();
t.sleep();
}
}
//父类
class Person{
private String name;
private int 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 void sleep(){
System.out.println(age+name+"休息..");
}
}
//子类教师类
class Teacher extends Person{
private String subject;
public Teacher() {
//空构造
}
public Teacher(String name, int age, String subject) {
//带参构造
setName(name);
setAge(age);
this.subject = subject;
}
public void teach(){
//功能
System.out.println("传道授业...");
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
}
//子类 学生类
class Student extends Person{
private String school;
//空构造快捷键 : alt+insert->constructor->enter->tab->tab->enter
public Student() {
}
//带参构造快捷键 : alt+insert->constructor->enter->shift+方向上下键选中初始化的属性->enter
public Student(String name, int age, String school) {
setName(name);
setAge(age);
this.school = school;
}
public void study(){
System.out.println("好好学习...");
}
//设置器访问器
//alt+insert->选择setter and getter 通过方向上下键 ->enter->shift+方向上下键选中属性->enter
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
}
public class ExtendsDog {
public static void main(String[] args) {
Dog d = new Dog("马云",3,"蓝色");
d.eat();//3岁的马云在咔咔大吃...
d.catchCat();//3蓝色马云抓猫...
Cat c = new Cat("黑猫警长",9);
c.eat();//9岁的黑猫警长在咔咔大吃...
c.catchMouse();//9黑猫警长抓老鼠
//Animal a = new Animal("这是动物父类",18);调用父类?因为实际只有空构造报错
Animal a = new Animal();//new父类对象
a.eat();//调用父类方法 0岁的null在咔咔大吃...
}
}
class Animal{
private String name;
private int 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 void eat(){
System.out.println(age+"岁的"+name+"在咔咔大吃...");
}
}
class Dog extends Animal{
// private String name;
// private int age;
private String color;
public Dog() {
}
public Dog(String name, int age, String color) {
setName(name);
setAge(age);
this.color = color;
}
public void catchCat(){
System.out.println(getAge()+color+getName()+"抓猫...");
}
public String getColor() {
return color;
}
public void setColor(String color