一.什么是面向对象?
面向对象编程也称为OOP(object oriented programming)也就是程序员将一类相同属性和行为的事物抽象描述出来叫做类。类是构造面向对象程序的基本单位。类是对象的抽象,对象是类的具体。
二.面向对象的三大特性
1.封装
在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。
1.1优点:
1). 良好的封装能够减少耦合。
2). 类内部的结构可以自由修改。
3). 可以对成员变量进行更精确的控制。
4). 隐藏信息,实现细节。
5).只能通过规定的方法访问数据。
6).隐藏类的实例细节,方便修改和实现。
1.2实现:
1)变量名私有,修改属性的可见性来限制对属性的访问,一般设为 private。
2)对外开放用getter和setter方法,为每个属性创建一对赋值(setter)方法和取值(getter)方法,一般设为 public,用于属性的读写。
3)在赋值和取值方法中,加入属性控制语句(对属性值的合法性进行判断)。
4)采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。
举例子:
public class Student {
private String stuNo;//学号
private String name;//姓名
private char gender;//性别
private double score;//分数
//若类中已定义任何构造方法,则系统不再提供无参构造,如需使用,请显示声明。
public Student() {
}
//有参构造器
public Student(String stuNo, String name, char gender, double score) {
this.stuNo = stuNo;
this.name = name;
this.gender = gender;
this.score = score;
}
//学生考试
public void test(){
System.out.println(name+"考了"+score+"分");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getScore() {
return score;
}
public void setScore(double score) {
// 对分数进行限制
if (score < 0 || score > 100) {
System.out.println("分数必须在0到100之间!");
} else {
this.score = score;
}
this.score = score;
}
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
//查看
@Override
public String toString() {
return "Student{" +
"stuNo='" + stuNo + '\'' +
", name='" + name + '\'' +
", gender=" + gender +
", score=" + score +
'}';
}
}
2.继承
继承和多态是面向对象开发语言中非常重要的一个环节,如果在程序中使用继承和多态得当,整个程序的架构将变得非常有弹性,同时可以减少代码的冗余性。
2.1优点:
实现代码共享,减少创建类的工作量,使子类可以拥有父类的方法和属性。
提高代码维护性和可重用性。
提高代码的可扩展性,更好的实现父类的方法。
2.2继承的特点
(1)Java 的继承是单继承(每个孩子只能有一个爸爸)
(2)继承是一种高级封装
(3)子类可以用自己的方式实现父类的方法。
(4)不能继承父类的
*成员变量和方法
*构造方法
(显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。)
*非同包父类受保护类型 protected
*通过访问修饰符和包进行访问权限控制
类内 同包 不同包子类 其他
private √
default √ √
protected √ √ √
public √ √ √ √
(5)如果在父类中存在有参的构造方法而并没有重载无参的构造方法,那么在子类中必须含有有参的构造方法,因为如果在子类中不含有构造方法,默认会调用父类中无参的构造方法,而在父类中并没有无参的构造方法,因此会出错。
2.3继承中用到的关键字
继承可以使用 extends 和 implements 这两个关键字来实现继承,这边先讲 extends ,一般implements 用来实现接口。
public class Animal {
private String name;
private int id;
public Animal(String myName, String myid) {
//初始化属性值
}
public void eat() { //吃东西方法的具体实现 }
public void sleep() { //睡觉方法的具体实现 }
}
public class Penguin extends Animal{
}super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
class Animal {
void eat() {
System.out.println("animal : eat");
}
}
class Dog extends Animal {
void eat() {
System.out.println("dog : eat");
}
void eatTest() {
this.eat(); // this 调用自己的方法
super.eat(); // super 调用父类方法
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Animal();
a.eat();
Dog d = new Dog();
d.eatTest();
}
}更多super关键字讲解,可以看看这篇文章
super讲解
3.多态
所谓的“多态”,简单的理解就是对象在不同情况下的不同表现,具体体现在定义和功能两个方面,简单的总结一下,多态可以用“三个定义和两个方法”来总结。三个定义分别是父类定义子类构建、接口定义实现类构建和抽象类定义实体类构建,而两个方法分别是方法重载和方法重写。
3.1优点:
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
3.2多态存在的三个必要条件:
继承
重写
父类引用指向子类对象
3.3多态的实现方式
方式一:重写
方式二:接口
方式三:抽象类和抽象方法
3.4多态涉及的知识点:
转型(有继承关系的对象类型的转化 )
转型分为向上转型,和向下转型
1.自动类型转换(向上转型) :父类引用指向子类的对象
2.强制类型转换向下转型):不是将父类的对象转为子类对象(向下转型)通过instance of 运算符判定父类引用转向子类对象的实际类型 。不然会报java.lang.ClassCastException 类型转换异常
举例子:
public class Test {
public static void main(String[] args) {
Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
if (a instanceof Cat) {
Cat c = (Cat) a; // 向下转型
} else if (a instanceof Dog) {
Dog c = (Dog) a; // 向下转型
}
}
}
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}推荐一个讲解多态详细的地址
Java中的多态有哪些具体表现形式