这辈子没办法做太多事情,所以每一件都要做到精彩绝伦!

People can't do too many things in my life,so everything will be wonderful 


JDK API 1.6.0 中文版免费下载地址:http://down.51cto.com/data/2300228

1.     面向对象

万事万物皆对象

2.     继承

  • 继承概述:

a,多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可;

b,通过extends关键字可以实现类与类的继承;

c,单独的这个类(被继承的类)称为父类,基类或超类;这多个类(继承类)可以成为子类或者派生类;

d,有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的基础上,还可以定义自己的新成员。

  • 继承的好处:

a,提高了代码的复用性;多个类相同的成员可以放到一个类中;

b,提高了代码的维护性;如果功能的代码需要修改,只需要修改一处即可(双刃剑);

c,让类与类之间产生了关系,是多态前提;这也是继承的一个弊端,类的耦合性太强。

 

设计原则:高内聚低耦合:内聚就是自己完成某件事情的能力;耦合就是类与类之间的关系。

 

2.1.1       java中继承的特点
  • java只支持单继承,不支持多继承:一个类只能有一个父类,不可以有多个父类;

java支持多层继承

  • java继承注意事项:

a,子类只能继承父类所有非私有的成员(成员方法和成员变量),这也体现了继承的另一个弊端:打破了封装性(隐藏属性和实现方法,提供公共的访问方法)!

b,子类不能继承父类的构造方法,但是可以通过super关键字去访问父类的构造方法。

c,不要为了部分功能而去继承;

d,继承中类之间提现的是:“is a”的关系;

水果和苹果:苹果是一种水果;学生和人,学生是人的一种;

  • 继承中成员变量的关系

  • 查找变量顺序:

在子类方法中访问一个变量:

a,首先在子类局部范围找

b,然后在子类成员范围找

c,最后在父类成员范围找(不能访问父类局部范围)

都找不到,报错!(不考虑父类的父类)

  • super关键字:super代表父类存储空间的标识,可以理解为:父类引用

super用法(this):this/super.成员变量;this/super(); this/super.成员方法();

2.1.2       java继承中的成员关系
2.1.2.1 成员变量:

         a,子父类中的成员变量名称不一样时,是谁找谁

         b,子父类中的成员变量名称一样,子类方法访问变量查找顺序:

                            1),在子类局部中找,有就用;

                            2),在子类的成员范围找,有就用;

                            3),在父类的成员范围找,有就用;都找不到,报错

2.1.2.2 构造方法

a,子类的构造方法默认访问父类的无参构造方法:

因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。

每一个构造方法的第一条语句默认都是:super()

b,父类中如果没有无参构造;

1),子类通过super去明确调用带参构造;

2),子类通过this调用本身的其他构造

本类其他构造也必须首先访问了父类构造

3),一定要注意:

super()或者this(.)必须出现在第一条语句上

否则,就会有父类数据的多次初始化

2.1.2.3 成员方法:

a,子父类成员方法名称不一样

b,子父类成员方法名称一样

查找顺序:子类—>父类,没有报错。(不考虑父类的父类的情况)

2.1.2.4 方法重写:

方法重写:子类中出现了和父类中相同的方法声明,也被成为方法覆盖,方法复写。

特点:如果方法名不同,就调用对应的方法;如果方法名相同,最终使用的是子类自己的。

方法重写的应用:

当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。

方法重写注意事项:

         a,父类中私有方法不能被重写;

         b,子类重写父类方法时,访问权限不能更低;

2.1.3       final关键字

final:关键字是最终的意思,可以修饰类,成员变量,成员方法。

a,修饰类,类不能被继承;

b,修饰变量,变量就变成常量,只能被赋值一次;

c,修饰方法,方法不能被重写。

3.     多态

  • 某一个事物,在不同时刻表现出来的不同状态。

举例:

    猫可以是猫的类型。猫 m= new ();

    同时猫也是动物的一种,也可以把猫称为动物。

   动物d = new ();

  • 多态的前提和体现:

a,有继承关系;

b,有方法重写;

c,有父类引用指向子类对象。

  • 多态的分类:

                            a:具体类多态

                                     classFu {}

                                     classZi extends Fu {}

                                    

                                     Fuf = new Zi();

                            b:抽象类多态

                                     abstractclass Fu {}

                                     classZi extends Fu {}

                                    

                                     Fuf = new Zi();

                            c:接口多态

                                     interfaceFu {}

                                     classZi implements Fu {}

                                    

                                     Fuf = new Zi();

3.1.1       多态成员访问特点

成员变量:编译看左边,运行看左边;(父类)

成员方法:编译看左边,运行看右边;(左父类,右子类(方法重写))

构造方法:子类的构造会默认访问父类的构造,先初始化父类数据

静态方法:编译看左边,运行看左边。(父类)静态和类相关,算不上重写,访问的还是左边!

为什么访问成员方法时,执行子类;因为方法中有方法重写。

  • 多态继承中的内存图解:

wKiom1j1cPGDjy0wAABsj5-gG6w691.png

3.1.2       多态的优缺点

多态的好处:

a,提高了程序的维护性(由继承保证)

b,提高了程序的扩展性(由多态保证)

多态的弊端

不能访问子类特有功能;多态转型解决

3.1.3       多态中的转型问题

向上转型

从子到父

父类引用指向子类对象

向下转型

从父到子

父类引用转为子类对象

  • 多态的问题理解:

         class孔子爹 {

                   publicint age = 40;

                  

                   publicvoid teach() {

                            System.out.println("讲解JavaSE");

                   }

         }

        

         class孔子 extends 孔子爹 {

                   publicint age = 20;

                  

                   publicvoid teach() {

                            System.out.println("讲解论语");

                   }

                  

                   publicvoid playGame() {

                            System.out.println("英雄联盟");

                   }

         }

        

         //Java学习特别火,很多人来请孔子爹去讲课,这一天孔子爹被请走了

         //但是还有人来请,就剩孔子在家,价格还挺高。孔子一想,我是不是可以考虑去呢?

         //然后就穿上爹的衣服,带上爹的眼睛,粘上爹的胡子。就开始装爹

         //向上转型

         孔子爹 k = new 孔子();

         //到人家那里去了

         System.out.println(k.age); //40

         k.teach(); //讲解论语

         //k.playGame();//这是儿子才能做的

        

        

         //讲完了,下班回家了

         //脱下爹的装备,换上自己的装备

         //向下转型

         孔子 k = (孔子) k;

         System.out.println(k.age);//20

         k.teach();//讲解论语

         k.playGame();//英雄联盟

  • 多态中的对象变化内存图解:

wKioL1j1cP6xel6TAABukPm-wLk336.png

4.     抽象类

抽象类概述:回想前面我们的猫狗案例,提取出了一个动物类。并且我们在前面也创建过了动物对象,其实这是不对的。

为什么呢?因为,我说动物,你知道我说的是什么动物吗?只有看到了具体的动物,你才知道,这是什么动物。所以说,动物本身并不是一个具体的事物,而是一个抽象的事物。只有真正的猫,狗才是具体的动物。同理,我们也可以推想,不同的动物吃的东西应该是不一样的,所以,我们不应该在动物类中给出具体体现,而是应该给出一个声明即可。

Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。

4.1.1       抽象类特点
  • 抽象类特点

抽象类和抽象方法必须用abstract关键字修饰

格式

abstract class 类名 {}

public abstract void eat();

  • 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类

  • 抽象类不能实例化

那么,抽象类如何实例化呢?

按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。

  • 抽象类的子类

要么是抽象类

要么重写抽象类中的所有抽象方法

4.1.2       抽象类成员特点

l 成员变量

    可以是变量

    也可以是常量

l 构造方法

    有构造方法,但是不能实例化

    那么,构造方法的作用是什么呢?

    用于子类访问父类数据的初始化

l 成员方法

    可以有抽象方法 限定子类必须完成某些动作

    也可以有非抽象方法 提高代码复用性

4.1.3       抽象类注意事项

抽象类的几个小问题

                   A:抽象类有构造方法,不能实例化,那么构造方法有什么用?

                            用于子类访问父类数据的初始化

                   B:一个类如果没有抽象方法,却定义为了抽象类,有什么用?

                            为了不让创建对象

                   C:abstract不能和哪些关键字共存

                            a:final       冲突

                            b:private冲突

                            c:static无意义

5.     接口

5.1.1       接口概述

看猫狗案例:狗一般就是看门,猫一般是宠物。但是,现在很多驯养师,可以训练出:猫钻火圈,狗跳高等等动作,这些并非猫狗天生的,属于特殊训练出来的。这些额外的动作定义到动物类中就不合适,也不适合直接定义到猫或狗中,因为只有部分猫狗具备这些功能。所以,为了体现事物功能的扩展性,Java中就提供了接口来定义这些额外功能,并不给出具体实现,将来哪些猫狗需要被培训,只需要这部分的猫狗把这些额外的功能实现即可。

5.1.2       接口特点

接口特点:

  • 接口用关键字interface表示

  • 格式:interface 接口名{}

  • 类实现接口用implements表示

  • 格式:class 类名 implements接口名{}

  • 接口不能实例化

  • 那么接口如何实例化?--按照多态的方式,由具体的子类实例化。也是多态的一种,接口多态。

  • 接口的子类

  • 要么是抽象类

  • 要么重写接口中的所有的抽象方法

  •        接口的成员特点
  • 成员变量:

  • 只能是常量

  • 默认修饰符publicstatic final

  • 构造方法

  • 没有,因为接口主要是扩展功能的,而没有具体实现存在

  • 成员方法

  • 只能是抽象方法

  • 默认修饰符publicabstract

 

5.1.4       与接口关系

类与类,类与接口,接口与接口的关系

  • 类与类

  • 继承关系,只能单继承,但是可以多层继承

  • 类与接口

  • 实现关系,可以单实现,也可以多实现。还可以继承一个类的同时实现多个接口

  • 接口与接口

  • 继承关系,可以多继承

 

抽象类与接口的区别

  • 成员区别

  • 抽象类:变量,常量;有抽象方法,非抽象方法

  • 接口:常量,抽象方法

  • 关系区别:

  • 类与类 继承,单继承,多层继承

  • 类与接口 实现,多实现

  • 接口与接口  继承,多继承

  • 设计理念区别

  • 抽象类 被继承体现的是:“is a”的关系。共×××。

  • 接口 被实现体现的是:“like a”的关系。扩展功能。

 

5.1.5       教练和运动员案例

教练和运动员案例:

    乒乓球运动员和篮球运动员。

    乒乓球教练和篮球教练。

    为了出国交流,跟乒乓球相关的人员都需要学习英语。

    分析,这个案例中有哪些抽象类,哪些接口,哪些具体类。

 

wKioL1j1cQ2zUmDVAABjmDMNoec432.png

5.2     形式参数和返回值
  • 形式参数:

  • 基本类型 需要什么就是什么

  • 引用类型:

                            类:需要的是该类的对象

                            抽象类:需要的是该抽象类的子类对象

                            接口:需要的是接口的子类对象

  • 返回值类型

  • 基本类型 返回什么就用什么接收

  • 引用类型

类:返回的是该类对象

抽象类:返回的是该类的子类对象

接口:返回的是接口的子类对象

 

  • 链式编程  举例:new PersonDemo().getPerson().show();

  •      
  •        包的概述
  • 包的概述

  • 其实就是文件夹

  • 作用:对类进行分类管理

  • 包的划分:按照功能划分;按照模块划分

  • 包的格式:

  • package 包名;多级包用.分开即可

  • 注意事项:

  • package语句必须是程序的第一条可执行的代码

  • package语句在一个java文件中只能有一个

  • 如果没有package,表示无包名

  • 带包的类的编译和运行

  • 手动式

  • ajavac编译当前类文件;

  • b,手动建立包对应的文件夹;

  • c,把a步骤的class文件放在b步骤的最终文件夹下;

  • d,通过java命令执行。注意:需要带包名称的执行:java cn.xxx.HelloWorld

  • 自动式

  • ajavac编译的时候带上-d即可:javac –d HelloWorld.java

  • b,通过java命令执行。和手动式一样

  •        导包
  • 导包概述:

  • 不同包下的类之间的访问,我们发现,每次使用不同包下的类的时候,都需要加包的全路径。比较麻烦。这个时候,java就提供了导包的功能

  • 导包格式

  • import 包名;

  • 注意: 这种方式导入是到类的名称;虽然可以最后写*,但是不建议

  • package.import.class有没有顺序关系(面试题)

  •        权限修饰符

public

protected

默认

private

同一类中

同一包子类,其他类


不同包

子类



不同包

其他类




 

注意这四种修饰符在任意时刻只能出现一种!

 

5.3.3.1 常见的修饰符

(1)分类:

                   权限修饰符:private,默认,protected,public

                   状态修饰符:static,final

                   抽象修饰符:abstract

(2)常见的类及其组成的修饰

                   类:

                            默认,public,final,abstract

                           

                            常用的:public

                  

                   成员变量:

                            private,默认,protected,public,static,final

                           

                            常用的:private

                           

                   构造方法:

                            private,默认,protected,public

                           

                            常用的:public

                  

                   成员方法:

                            private,默认,protected,public,static,final,abstract

                           

                            常用的:public

5.3.4       内部类
  • 内部类:把类定义在其他类的内部,这个类就被称为内部类。

  • 内部类的访问特点:

  • 内部类可以直接访问外部类的成员,包括私有

  • 外部类要访问内部类的成员,必须创建对象

  • 内部类位置:按照内部类在类中定义的位置不同,可以分为两种格式:

  • 成员位置(成员内部类)

  • 局部位置(局部内部类)

  •  成员内部类:
  • 非静态的成员内部类,成员只能是非静态的;

访问方法:外部类名.内部类名对象名 = new 外部类名.new 内部类名();

  • 内部类被静态修饰后的方法,有静态和非静态之分。他们的访问和不用静态是不一样的。

被静态修饰的成员内部类只能访问外部类的静态成员:

访问非静态方法:外部类名.内部类名 对象名=new 外部类名.内部类名();

访问静态方法:上面创建的对象访问,或外部类名.内部类名.方法名();

         成员内部的常见修饰符:

private 为了保证数据的安全性;

static 为了访问的方便性

5.3.4.2 局部内部类
  • 可以直接访问外部类的成员

  • 可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能

  • 局部内部类访问局部变量注意事项:必须被final修饰!

  • 因为局部变量(栈内存中)会随着方法的调用完毕而消失,这个时候,局部对象并没有马上从堆内存中消失,还要使用这个变量,为了让数据还能继续被使用,就用final修饰,在堆内存中存储的就是一个常量值!常量池存在于方法区中?

  •  匿名内部类

就是内部类的简化写法。

前提是:存在一个类或者接口。这里的类可以是具体类也可以是抽象类。

格式:new 类名或接口名(){重写方法;}

本质:是一个继承子类或者实现了接口的子类匿名对象;

应用场景:首先回顾方法的形式参数是引用类型的情况,重点是接口的情况,我们知道这里需要一个子类对象。而匿名内部类就是一个子类匿名对象,所以,可以使用匿名内部类进行改进。


java基础系列:

java基础(一)java语法

java基础(二)面向对象

java基础(三)继承/多态/接口

java基础(四)常用类/算法

java基础(五)集合/IO流/异常

java基础(六)多线程/设计模式

java基础(七)网络编程/反射/动态代理