说到面向对象三大特性之前,先概述一下什么是面向对象
面向对象简单来说就是一种程序设计思想,我们在面向对象思想的指引下, 使用Java语言去设计、开发计算机程序。 这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为。
要注意这种思想强调的是对象,让别人帮我们干活,能帮我们干活的就称为对象.
现实世界的一类事物: 属性:事物的状态信息。 行为:事物能够做什么。 Java中用class描述事物也是如此: 成员变量:对应事物的属性 成员方法:对应事物的行为
简述后,现在来说说面向对象的三大特性.
特性一 封装
什么是封装? 封装就是使用private关键字将隐私的内容隐藏起来,不让外界直接使用
封装的原则: 1. 将隐私的内容私有
2. 被private修饰后的成员变量和成员方法,只在本类中才能访问
3. 提供get/set方法给别人使用
封装的好处: 提高代码的安全性
class Demo {
// 比如定义一个妹子的属性
String name;
//像这个妹子的年龄不想给别人直接看到,用private私有,外界就不能直接使用了
private int age;
//要给外界使用提供set/get方法
//提供设置age的方法
public void setAge(int age) {
this.age = age;
}
// 提供获取age的方法
public int getAge() {
return age;
}
//定义一个私有方法
static private void method(){
System.out.println("这是一个静态的私有方法");
}
static void method1(){
//私有方法只有本类才能访问,外界访问不到
method();
}
}
特性二 继承
什么是继承? 继承就是在现有类的基础上定义一个新的类,现有类称为父类,新的类称为子类,,子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为.
继承的格式
class 类名 extends 父类名 {
}
和普通类相比:在类名后面多了extends 父类名. extends关键字表示继承.
构造方法子类不会继承
因为构造方法名和类名一致,父类和子类类名肯定不一样,所以父类的构造方法复制到子类中肯定用不了了:
什么时候使用方法重写:
子类和父类相同的功能,但是子类的功能比父类的功能更加强大,就使用方法的重写
方法重写注意事项:
1.是子类和父类之间的事情
2.方法名要相同
3.参数列表要相同
4.返回值类型要相同
5.子类方法的权限要大于等于父类方法的权限
继承的好处: 1. 子类会自动拥有父类的内容,提高代码的复用性
2. 类与类之间产生了关系,是多态的前提
class Person {
//定义父类成员变量
String name;
private int age;
//无参构造和有参构造
public Person() { }
public Person(String name, int age) { this.name = name;this.age = age; }
//定义成员方法
public void eat() {System.out.println("吃饭"); }
//提供set/get方法
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
//定义一个子类继承Person
class Student extends Person {
//构造方法不能被继承,类名不同
public Student() { }
public Student(String name, int age) { super(name, age); }
//同名方法需要重写
public void eat(){ System.out.println(name + getAge() + "吃不起饭"); }
}
特性三 多态
多态: 是指同一行为,具有多个不同表现形式
多态的前提:
1 继承或者实现【二选一】
2 方法的重写【意义体现:不重写,无意义】
3 父类引用指向子类对象【格式体现】
多态的格式(重点): 父类引用变量指向子类对象
父类 变量名 = new 子类();
接口 变量名 = new 实现类();
多态的弊端:
当使用多态方式调用方法时,多态只能调用父类中的方法,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,执行的是子类重写 后方法
多态的好处:
参数写父类,可以传入任意子类,多态规定,执行的是子类重写的方法,提高代码的扩展性 .
class Demo {
public static void main(String[] args) {
Student s = new Student();
Teacher t = new Teacher();
//调用方法,参数在传递过程中就使用了多态
kaiFan(s); //Person o = s; Person o = new Student();
kaiFan(t); //Person o = t; Person o = new Teacher();
}
//定义一个开饭的方法 //参数写父类,可以传入任意子类,提高代码的扩展性
public static void kaiFan(Person o) { o.eat(); }
}
class Person {
public void eat() { System.out.println("吃饭"); }
}
class Student extends Person {
public void eat() { System.out.println("学生三菜一汤..."); }
}
class Teacher extends Person {
public void eat() { System.out.println("老师酱油拌饭..."); }
}