面向对象基础概念(上)

面向对象基础概念

本文是对《大话设计模式》中(附录A 培训实习生——面向对象基础)学习时的总结与笔记,以及学习后对面向对象的一些感悟。

一、类与实例

对象是一个自包含的实体,用一组可识别的特性和行为来标识。

类就是具有相同的属性和功能的对象的抽象的集合。

实例,就是一个真实的对象。实例化就是创建对象的过程,使用new关键字来创建。

例如:

Person person = new Person();

其中Person是一个类,person是一个对象,new是一个实例化的过程,后面的Person()是构造方法。

二、构造方法

构造方法,又叫构造函数,其作用就是对类进行初始化

构造方法与类同名,无返回值,也不需要void,在new的时候调用。

所有类都有构造方法,如果你不编码则系统默认生成空的构造方法,若你有定义的构造方法,那么默认的构造方法就会失效了。

例如:

public class Person{
    private String name;
    Person(String name){
        this.name = name;
    }
}

Person person = new Person("张三");

在实例化类时,需要传递一个参数,此时实例化就调用自定义的构造方法,将Person类中的name字段进行赋值;

三、方法重载

方法重载提供了创建同名的多个方法的能力,但这些方法需使用不同的参数类型。

注意:方法重载时,两个方法必须要方法名相同,但参数类型或个数必须要有所不同。

方法重载的好处就是可在不改变原方法的基础上,新增功能。

例如:

public class Person{
    private String name;
    Person(String name){
        this.name = name;
    }
    Person(){
        this.name = "";
    }
}

Person person = new Person("张三");
Person person = new Person();

两种构造实例化都可以使用,只是它们的内容不同。

注意:并不是只有构造方法可以重载,普通方法也是可以重载的。

四、属性与修饰符

属性是一个方法或一对方法,但在调用它的代码看来,它是一个字段,即属性适合于以字段的方式使用方法调用的场合。字段是存储类要满足其设计所需要的数据,字段是与类相关的变量。

对于字段和属性,例如:

public class Person{
    private String name;	//私有字段
    public String getName(){	//name的可读属性
        return name;
    }
    public void setName(String name){	//name的可写属性
        this.name = name;
    }
}

​在调用getName()方法时,我们是获得name属性,调用setName(String name)方法时要说设置name属性,对我们来说name字段是私有的 。

publicprivate都是修饰符,public表示它所修饰的类成员可以允许其他任何类来访问,俗称公有的。而private表示只允许同一个类中的成员访问,其他类包括它的子类无法访问,俗称私有的。如果在类中的成员没有加修饰符,则被认为是private 的。

通常字段都是private,即私有的变量,而属性都是public,即公有的变量。

属性有两个方法getsetget访问器返回与声明的属性相同的数据类型,表示的意思是调用时可以得到内部字段的值或引用;set访问器有一个参数,它的作用是调用属性时可以给内部的字段或引用赋值。

五、封装

面向对象的三大特性之一‘封装’ 。

每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装,因此对象不必依赖其他对象来完成自己的操作。这样方法和属性包装在类中,通过类的实例来实现。

例如:

public class Person{
    private String name;
    private int age;
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void speak(String text){
        System.out.println(text);
    }
}

将Person所包含的信息,包括name、age和speak包装在一个类中,可以通过实例来对这些信息进行操作。

封装有很多好处:第一、良好的封装能够减少耦合。第二、类内部的实现可以自由地修改。第三、类具有清晰的对外接口。

六、继承

面向对象的三大特性中另一个为继承。

对象的继承代表了一种’is-a’的关系,如果两个对象A和B,可以描述为 ‘B是A’,则表明B可以继承A。

‘猫是哺乳动物’,就说明了猫与哺乳动物之间继承与被继承的关系。实际上,继承者还可以理解为是对被继承者的特殊化,因为它除了具备被继承者的特性外,还具备自己独有的个性。例如,猫就可能拥有抓老鼠、爬树等‘哺乳动物’对象所不具备的属性。因而,在继承关系中,继承者可以完全替换被继承者,反之则不成立。所以,我们在描述继承的 ‘is-a’ 关系时,是不能相互颠倒的。

继承定义了类如何相互关联,共享特性。继承的工作方式是,定义父类和子类,其中子类继承父类的所有特性。子类不但继承了父类的所有特性,还可以定义新的特性。

如果子类继承于父类,第一、子类拥有父类非private的属性和功能;第二、子类具有自己的属性和功能,即子类可以扩展父类没有的属性和功能;第三、子类还可以以自己的方式实现父类的功能(方法重写)。

对于protected修饰符。protected表示继承时子类可以对基类有完全访问权,也就是说,用protected修饰的类成员,对子类公开,但不对其他类公开。所以子类继承于父类,则子类就拥有了父类的除private外的属性和功能。

例如:Student类继承第五节的例子Person

public class Student extends Person{
    public Student(String name, int age) {
        super(name, age);
    }
    public void study(int time){
        System.out.println("学习了" + time);
    }
}

子类从它的父类中继承的成员有方法、域、属性、事件、索引指示器,但对于构造方法,有一些特殊,它不能被继承,只能被调用。

不用继承的话,如果要修改功能,就必须在所有重复的方法中修改,代码越多,出错的可能就越大,而继承的优点是,继承使得所有子类公共的部分都放在了父类,使得代码得到了共享,这就避免了重复,另外,继承可使得修改或扩展继承而来的实现都较为容易。

但是继承是有缺点的,那就是父类变,则子类不得不变。另外,继承会破坏包装,父类实现细节暴露给子类,这其实是增大了两个类之间的耦合性。两个类尽管分开,但关系密切,一方的变化都会影响到另一方,这就是耦合性高的表现,继承显然是一种类与类之间强耦合的关系。

当两个类之间具备 ‘is-a’ 的关系时,就可以考虑用继承了,因为这表示一个类是另一个类的特殊种类,而当两个类之间是 ‘has-a’ 的关系时,表示某个角色具有某一项责任, 此时不合适用继承。

七、多态

面向对象的三大特性中最后一个是多态。

多态表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。第一,子类以父类的身份出现,儿子代表老子表演,化妆后就是以父亲身份出现了,即类型已经转化为父类。第二、子类在工作时以自己的方式来实,儿子只能用自己理解的表现方式去模仿父亲的作品。第三、子类以父类的身份出现时,子类特有的属性和方法不可以使用。

例如:Student类继承第五节的例子Person

public class Student extends Person{
    public Student(String name, int age) {
        super(name, age);
    }
   
    @Override
    public void speak(String text) {
        System.out.println("学生说:" + text);
    }
}

Person student = new Student("张三",20);
student.speak("你好");

其中speak()就是子类重写父类的方法,其输出为学生说:你好

不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值