Java学习7——面向对象

 

面向对象(oop)

笔记Notes

  • 面向过程 & 面向对象

    • 面向过程思想(按步骤解决问题,第一步做什么第二步做什么)

    • 面向对象思想

      • 物以类聚,分类的思维模式,思考问题首先会考虑解决问题需要哪些分类,然后对这些分类进行单独思考,最后才对摸个分类下的细节进行面向过程的思索。

      • 面向对象适合处理复杂的问题,适合处理多人协作的问题。

    • 对于描述复杂的事物,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,从具体到微观操作仍然需要面向过程的思路处理。

  • 面向对象编程是:以类的方式组织代码,以对象的组织(封装)数据。

  • 从认识论角度考虑是先有对象后有类。对象是具体的事物。类,是抽象的,是对对象的抽象

  • 从代码运行角度是先有类后有对象,类是对象的模板。

 

  • 类与对象的关系

    • 类是一种抽象的数据类型,它是对某一类事物整体描述定义,但是并不能代表一个具体的事物

    • 对象是抽象概念的具体实例

      • 张三就是人的一个具体实例,张三家里的旺财就是狗的一个具体实例

      • 能够体现出特点,展现出具体功能的是具体的实例,而不是一个抽象的概念。

 

  • 创建与初始化对象

    •                                                        引用类型          实际类型

    • 使用new关键字创建对象,构造器 Person man = new Person(); 

    • 使用new关键字的时候,除了分配内存空间之外,还会给传建好的对象进行默认的初始化以及对类中构造器的调用

 

  • 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有一下两个个特点:

    • 1.必须和类的名字相同

    • 2.必须没有返回类型,也不能写void

 

  • 构造器必须掌握,使用new关键字,本质是在调用构造器用来初始化值

  • 构造器

    1. 和类名相同

    2. 没有返回值

  • 作用:

    1. new 本质在调用构造方法

    2. 初始化对象的值

  • 注意点:

    1. 定义有参构造之后,如果想使用无参构造,显示的定义一个无参构造

 

  • 面向对象的三大特性:

      • 封装(数据的隐藏)

        • 高内聚,低耦合

        • 属性私有,get/set

      • 继承

        • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。

        • extands的意思是“拓展”,子类是父类的拓展。子类继承父类就会拥有父类的全部方法。私有的无法被继承

        • java中类只有单继承,没有多继承

        • 继承是类和类之间的一种关系,除此之外,类和类之间的关系还有依赖、组合、聚合等。

        • 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends

        • 子类和父类之间从意义上讲应该具有“is a”的关系。

        • object类

          • 在java中,所有的类都直接或间接继承object

        • super

          • super调用父类的构造方法,必须在构造方法的第一个

          • super必须只能出现在子类的方法或者构造方法中

          • super 和 this 不能同时调用构造方法

        • 对比this:

          • 代表对象

            • this:本身调用这个对象

            • super:代表父类对象的应用

          • 前提

            • this:没继承也可以使用

            • super:只能在继承条件才可以使用

          • 构造方法

            • this();本类的构造

            • super();父类的构造 

        • 方法重写

          •  需要有继承关系,子类重写父类的方法

            1. 方法名必须相同

            2. 参数列表必须相同

            3. 修饰符:范围可以扩大但不能缩小:public > protected > default >  private

            4. 抛出的异常:范围,可以缩小,但不能扩大

          • 重写,子类的方法和父类必须一致:方法体不同

          • 为什么需要重写:

            • 父类的功能,子类不一定需要,或者不一定满足!

            • Alt + insert : override

      • 多态

        • 即同一方法可以根据发送对象的不同而采取多种不同的行为方式

        • 一个对象的实例类型是确定的,但是可以指向对象的引用类型有很多(父类,有关系的类)

        •  

        • 多态存在的条件

          • 有继承关系

          • 子类重写父类方法

          • 父类引用指向子类对象

        •  

        • 注意:多态是方法的多态,属性没有多态性。

      •  instanceof (类型转换)引用类型,判断一个对象是什么类型

  • 抽象类(单继承)和接口(多继承)

    • 抽象类:abstract修饰符可以用来修饰方法也可以用来修饰类,如果修饰方法,那么该方法就是抽象方法,如果修饰类,那么类就是抽象类(约束,有人帮我们实现)

    • 抽象类中可以没有抽象方法(只有方法名字,没有方法实现),但是有抽象方法的类一定要声明抽象类

    •  

    • 抽象类不能使用new关键字来创建对象,它是用来让子类继承的

    • 抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的

    •  

    • 子类继承抽象类,那么久必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类

    • 接口

      • 普通类:只有具体实现

      • 抽象类:具体实现和规范(抽象方法)都有

      • 接口:只有规范

      • 接口的本质是契约,就像我们人间的法律一样,制定好后大家都遵守

      • oo的精髓,是对对象的抽象,最能体现这一点的是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c++,java,c#等),就是因为设计模式所研究的,实际上就是如何合理地去抽象

      • 声明类的关键字是class,声明接口的关键字是interface.

  • 内部类  

  • 内部类就是在一个类的内部定义一个类

    1. 成员内部类

    2. 静态内部类

    3. 局部内部类

    4. 匿名内部类

 

 

拓展

 快捷键:选择代码进入的循环体   Ctrl+Alt+T

 

idea创建主函数快捷:psvm     ; 输出快捷:sout

Ctrl + D IDEA快捷键:复制当前行到下一行

alt + 回车 自动查报错信息

alt+insert idea自动插入一些类,比如getset等

Ctrl+h 查看类的树

ctrl+shift+alt:多行操作

psvm:生成main()方法;

fori:生成for循环;

Ctrl+Alt+v:自动补齐返回值类型

ctrl+o:覆写方法

ctrl+i:实现接口中的方法

ctrl+shift+u:大小写转换

CTRL+SHIFT+Z:取消撤销

Alt+Insert:生成构造方法、getter、setterctrl+y:删除当前行

Ctrl+Shift+J:将选中的行合并成一行

ctrl+g:定位到某一行

Ctrl+Shitft+向下箭头:将光标所在的代码块向下整体移动

Ctrl+Shift+向上箭头:将光标所在的代码块向上整体移动

Alt+Shift+向下箭头:将行向下移动Alt+Shift+向上箭头:将行向上移动Ctrl+F:在当前文件中查找Ctrl+R:替换字符串Ctrl+Shift+F:在全局文件中查找字符串Ctrl+Shift+R:在全局中替换字符串Ctrl+Shift+Enter:自动补齐{}或者分号;Shift+Enter:在当前行的下方开始新行Ctrl+Alt+Enter:在当前行的上方插入新行Ctrl+Delete:删除光标所在至单词结尾处的所有字符

重载,继承,重写,多态的区别

继承:当多个类具有相同bai的特征(属性)和行为(方法),为了实现代码复用,需要子类继承父类的特征和行为。使得子类具有父类的各种属性和方法,除了具有父类的特征和行为,还具有一些自己特殊的特征和行为。

多态:当一个类需要表现出多种形态,具有多种实现方式。避免了在父类里大量重载引起代码臃肿且难于维护,增强程序的可扩展性及可维护性,使代码更加简洁。子类重写父类的方法。使子类具有不同的方法实现。

可以简单理解为:继承是子类使用父类的方法,而多态则是父类使用子类的方法。

重写:如果在子类中定义的一个方法,其名称、返回类型及参数列表正好与父类中某个方法的名称、返回类型及参数列表相匹配,那么可以说,子类的方法重写了父类的方法。

重载:多个同名而不同参数的方法之间,互相称之为重载方法。

接口:接口把方法的特征和实现分割开来。它本身没有任何实现,不涉及表象,只描述public行为,所以接口比抽象类更抽象化。但是接口不是类,所以不能被实例化。

下列测试代码:  

package cn.lufice.test02;

public class Instrument {

public void play(int i){

System.out.println("Instrument"+i);

}

//重载

public void play( int i,String str){

System.out.println("Brass "+i+" "+str);

}

}

public class Brass extends Instrument {

public void play( int i,String str){

System.out.println("Brass "+i+" "+str);

}

}

public class Wind extends Instrument{

//重写

public void play(int i){

System.out.println("Wind "+i);

}

public static void main(String[] args) {

Instrument instrument = new Wind();//多态

Brass brass = new Brass();//继承

instrument.play(10);

brass.play(20,"barss");

}

}

/*Output:

Wind 10

Brass 20 barss

*/

重载与重写联系

重载(Overloading)

 

重载发生在本类,方法名相同,参数列表不同,与返回值无关,只和方法名,参数列表,参数的类型有关.

 

重载(Overload):首先是位于一个类之中或者其子类中,具有相同的方法名,但是方法的参数不同,返回值类型可以相同也可以不同。

 

(1):方法名必须相同

 

(2):方法的参数列表一定不一样。

 

(3):访问修饰符和返回值类型可以相同也可以不同。

 

其实简单而言:重载就是对于不同的情况写不同的方法。 比如,同一个类中,写不同的构造函数用于初始化不同的参数。

 

重写(Overriding)

 

重写发生在父类子类之间,比如所有类都是继承与Object类的,Object类中本身就有equals,hashcode,toString方法等.在任意子类中定义了重名和同样的参数列表就构成方法重写.

 

重写(override):一般都是表示子类和父类之间的关系,其主要的特征是:方法名相同,参数相同,但是具体的实现不同。

 

重写的特征:

 

(1):方法名必须相同,返回值类型必须相同

 

(2):参数列表必须相同

 

(3):访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。

 

(4):子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。

 

(5):构造方法不能被重写,

 

简单而言:就是具体的实现类对于父类的该方法实现不满意,需要自己在写一个满足于自己要求的方法。

new 创建一个对象的过程

对于用new 创建一个对象,我们需要弄清楚它的过程:

引用和创建一个对象的格式是:

 

类名 变量名;

 

变量名=new 类名(参数列表);

 

比如 Vehicle veh1=new Vehicle();

 

这个语句具体的执行过程是:

 

1.右边的“new vheicle"是以vehicle类为模板,在堆空间里创建一个vehicle类对象(也简称vehicle对象)。

 

2.末尾的()意味着,在对象创建后,立即调用vehicle类的构造函数,对刚生成的对象进行初始化。构造函数肯定是有的,如果没有创建,java会补上一个默认的构造函数。

 

3.左边的'Vehicle veh1'创建了一个vehicle类引用变量

 

4.“=”操作符使对象引用指向刚创建的Vehicle对象。

 

 

 

将上面的语句分为两个步骤:

 

Vechicle veh1;

 

veh1=new  Vechicle;

 

 这样写,就比较清楚了,有两个实体:一是对象引用变量,一是对象本身。在堆空间里创建的实体,与在栈空间里创建的实体不同。尽管它们也是确确实实存在的实体,但是似乎很难准确的“抓”住它。

接口多继承

接口定义

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值