面对对象编程

static关键字

静态的,可以修饰成员变量和成员方法。

static关键字特点

    1.    随着类的加载而加载

     2.  静态变量属于类不属于对象

     3.  被类的所有对象共享

     4.  静态的内容存在于方法区的静态区

static的使用

        1.可以通过类名调用

        2.类名.静态变量

        3.类名.静态方法

static关键字注意事项

1、在静态方法中是不能使用this和super关键字。

2、静态方法只能访问静态的成员变量和静态的成员方法。

3、全是静态方法的类一般在开发当中被看做工具类,例如Math类

静态代码块

作用:用来初始化类的静态成员变量。

特点:

        1.在类中方法外出现,并加上static修饰。

        2.在加载的时候就执行,并且值执行一次

static修饰与非static修饰的区别

面对对象编程_第1张图片

代码块

概念:使用”{}”括起来的一段代码

分类:根据位置可分类

        普通代码块直接在方法或语句中定义的代码块

        构造代码块直接写在类中的代码块

        静态代码块使用static声明的代码块

        同步代码块多线程的时候会学到

    为了便于管理大型软件系统中数目众多的类,解决类命名冲突的问题,Java引入了包(package简单来说,包package可以理解为"分门别类"地存放源文件,以避免命名冲突,便于将来查找。

包的格式

    import package1[.package2…](类名或者通配符*);

包的特点

  1.  package来声明包

   2. package语句必须是java源文件中的第一条语句。(若无这条语句,则放置在无名包下)

    3.用"."来指明包(目录)的层次。包对应着文件系统的目录层次结构

pakage

为什么需要package?

        1.为了解决类之间的重名问题。

       2. 为了便于管理类:合适的类位于合适的包!

package怎么用?

       1. 通常是类的第一句非注释性语句。

        2.包名:域名倒着写即可,再加上模块名,并与内部管理类。

注意事项:

      1.  写项目时都要加包,不要使用默认包。

          2.  com.gao和com.gao.car,这两个包没有包含关系,是两个完全独立的包。只是逻辑上看起来后者是前者的      一部分。

包的命名规则

        1.包名的组成:包名也是一种标识符,字母,数字,_,$组成;不能以数字开头.

        2.包名一定全部小写.通常用公司的域名反着写作为开始.

包的注意事项

        1、在同一包中的类可以直接互相引用,无需import语句。

        2、要导入某个包中的所有类可以用:包名.*。

        3、package语句在一个java文件中只能有一个。

继承

       类是对对象的抽象,继承是对某一批类的抽

格式:

      1.  通过extends关键字可以实现类与类的继承

        2.class 子类类名 extends 父类类名 {} 

        3.被继承的这个类称为父类,基类或者超类

        4.继承的这个类称为子类或者派生类

继承的好处:

       1. 提高了代码的复用性

        2.提高了代码的维护性

       3. 其实这也是继承的一个弊端:类的耦合性很强

       4. 构成多态的前提条件

继承的特点:

       1. Java只支持单继承,不支持多继承。

       2. 一个类只能有一个父类,不可以有多个父类。

       3. Java支持多层继承

class Person{}

class Studnet extends Person{}

class PrimaryStudent extends Student{}

继承的注意事项:

        1、子类只能继承父类所有非私有的成员。

        2、子类不能继承父类的构造方法。

        3、子类可以继承了父类之后,可以有自己特有的成员方法

如何继承的使用?

        1、书写出所有子类,观察子类共有的成员变量和成员方法

        2、抽象出共同点,书写一个父类

        3、让子类去继承父类,并把子类的共有属性删除

super关键字

    和super用法类似,this代表本类引用,super代表父类父类引用。

    this和super的对比使用

    访问成员变量

this.成员变量 super.成this员变量

    访问构造方法

    this():访问本类无参构造  this(参数列表) 访问本类带参构造

      super():访问父类无参构造  super(参数列表):访问父类带参构造

    访问成员方法

    this.成员方法():访问本类成员方法

    super.成员方法():访问父类成员方法    

访问权限修饰符

访问权限修饰符:

        public      [default]      protected      private

修饰类

        public 任何包中的类都可以访问该类

        默认(default) 同一个包中的类可以访问该类

        不能用protected和private修饰类。

        修饰成员(成员变量或者成员方法)

        private 只对本身类可见

        默认(default) 对同一包中的类可见

        protected 对所有子类和同一包中的类可见

        public 对一切类可见

方法重写

方法重写概述

          如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。子类中出现了和父类中一模一样的方法声明,也被称为方法覆盖,方法复写。

方法重写的规则

        1.方法名相同

        2.参数列表相同

        3.返回值类型相同或者是其子类

        4.访问权限不能严于父类

方法重写的注意事项

        1、父类中私有方法不能被重写。

        2、构造方法不能被重写。

        3、子类重写父类方法时,访问权限不能更低。

        4、重载和重写的比较(重写和重载是完全不同的两个概念毫无任何关系)

多态

多态概述

       同一个引用类型,使用不同的实例而执行不同操作,即父类引用指向子类对象。


       使用多态的前提条件

               1.一定要有继承关系

               2.一定要有重写

               3.父类引用指向子类对象

                       父类 fu = new 子类();

使用多态来访问成员的特点

       成员变量

               编译的时候看左边类型,运行的时候看左边类型

         成员方法

                 编译的时候看左边类型,运行的时候看右边类型

         静态成员

                 编译的时候看左边类型,运行的时候看左边类型

         构造方法

                 先执行父类的构造方法,可以帮我们初始化父类继承过来成员,再执行子类

多态的好处

       提高了程序的维护性

       提高了程序的扩展性

多态的缺点

       不能访问子类所特有的功能。


解决办法?

       使用多态中的转型。

多态的转型问题

       分为向上转型和向下转型。

向上转型(自动转换)

格式:<父类型> <引用变量名> = new <子类型>();

特点:

子类转为父类  父类的引用指向子类对象。自动进行类型转换

此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法

此时通过父类引用变量无法调用子类特有的属性和方法

向下转型(强制转换)

格式:<子类型> <引用变量名> = (<子类型> )<父类型的引用变量>;

特点:

父类转为子类,父类引用转为子类对象。强制类型转换

在向下转型的过程中,如果没有转换为真实子类类型,会出现类型转换异常

instanceof关键字

       测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据

         记住:instanceof通常和向下转型(强制类型转换)结合使用

抽象类


抽象类的引入

  空实现: 就是给出了代码块,但是没有实现

 注意: 空实现也是实现了

 抽象方法的实现没有意义,但是存在有意义?

 存在有意义,如果父类方法不存在,那么编译报错,所以抽象方法需要存在,但是实现没有意义,所以定义为抽象方法

  在Java中,如果一个没有方法体,没有实现的方法定义为抽象方法,一个类中一旦出现抽象方法,该类一定是一个抽象类

抽象类的特点

 1.抽象类和抽象方法一定要使用abstract关键字来声明

 2.抽象类中不一定有抽象方法

 3.没有抽象方法的类有意义吗? -- 有意义  不让外界创建对象

 4.抽象类不能实例化

 5.抽象类如果想要实例化怎么办? - 可以利用多态 父类引用指向子类对象,只不过这个父类是一个抽象类而已

 6.如果作为一个抽象类的子类,那么该子类应该具备什么特点?

                 a.如果子类不想实现父类的抽象方法,那么子类也可以自动升级为抽象类

                 b.如果子类想要实现父类的抽象方法,那么子类就必须实现父类所有的抽象方法

 7.抽象类中可以有抽象方法,可以有,成员变量,成员方法,常量,构造方法,静态方法

                 成员变量:可以有,用来给子类继承使用

                 成员方法:同上

                 常量:同上

                 构造方法: 帮助所有子类初始化父类继承过来的成员变量

         抽象类是一个为所有子类服务的类

 8.static final private可以用来修饰抽象方法吗?

                 static和abstract不能共存: static为了方便调用,abstract为了给子类重写,没有方法体

                 abstract和final二者构成冲突,final修饰的方法不能被子类重写,abstract修饰的方法就是用来给子类重写,所以冲突

                 abstract和private二者构成冲突,private修饰的方法不能够被继承,既然不能被继承,就没有重写,而abstract修饰的方法就是用来给子类重写,所以冲突

 9.抽象方法可以使用public 和 protected修饰吗?

10.综上诉述: 抽象类的所有的抽象方法用来给子类重写

                           抽象类的所有非抽象方法用来给子类使用

                         抽象类的构造方法用来给子类初始化父类继承过来的成员

                         抽象类的成员变量用来给子类使用

                         首相类就是一个彻头彻尾的服务类

final关键字

常量

         自定义常量  

                 public static final int GAME_START = 0;

                       public static final int GAME_END = 1;

                         public static final int GAME_RUNNING = 2;

                         0  0.6  'c' "12314"

                         自定义常量提高了程序的可读性

final

         final表示最终的                

         特点:

                 1.final修饰类不能够被子类继承

                 2.final修饰的变量表示常量

                                 常量不能够被二次赋值

                                 final修饰

                                         成员变量

                                                 因为成员变量默认值是0,不能够被二次赋值

                                                 因为常量是在常量池中,不在堆区,所以没有默认值

                                         局部变量

                                               局部变量没有给默认值,所以不能被二次赋值

                 3.final修饰成员方法

                                                 不能够被子类重写

                         常用的final类有哪些? String Math

接口

生活中的接口

         1.接口是可以扩展功能的

         2.接口是一种规范,一种标准

         3.接口是灵活的

 接口的概念:

         接口就是抽象方法和常量的集合

         关键字 接口名{

               常量;

                 抽象方法;

 }

  接口是一个比抽象类还要抽象的类

  格式:

          interface 接口名称{

                  public static final int NUM = 10;

                  public abstract void method();

         }


  接口的特点:

  1.接口使用interface关键字来修饰

  2.接口由常量和抽象方法组成

          常量: 默认接口中所有的成员变量都是省略 public static final,一般接口的成员变量都是大写

          抽象方法:默认接口中所有的成员方法都是省略了 public abstract

         我们建议都写上

  3.接口不能实例化,因为接口是完全抽象的

          如果需要"创建"接口,那么必须使用多态

  4.接口的实现类

          使用implement关键字来完成接口的实现

          接口的实现类特点

                  a.如果一个类实现了接口,那么该类就必须实现类接口定义所有的抽象方法

                  b.如果一个接口不想实现接口的方法,那么子类必须定义为一个接口

  5.接口是可以扩展功能的 通过多实现

  6.接口是可以多继承的  

  7.接口是一种规范

  8.接口是灵活的

  9.类与接口之间的关系

    类和类        单继承  不可以实现

    类和接口          单继承 多实现

    接口和接口 多继承 不可以多实现

  10. 什么时候使用继承,什么时候使用接口?

         当我设计一个非常复杂而又无法实现的类的时候可以使用继承

          当我重新开始编写一些简单的功能或者制定一些标准的时候使用接口

       开发中一般采用面向接口编程,抽象类是模板,接口是规范


JDK8的新特性

       JDK8中可以有静态方法和默认方法

public class InterfaceDemo03 {

       public static void main(String[] args) {

               INewInter.staticMethod();

               INewInter newInter = new NewInterImpl();

               newInter.defaultMethod();


               INewInter.staticMethod();

               INewInter2.staticMethod();

       }

}

interface Inter{

       public static final int num = 10;


       void method();

}

interface INewInter{

       static void staticMethod() {

               System.out.println("INewInter.staticMethod()");

       }


       default void defaultMethod() {

               System.out.println("INewInter.defaultMethod()");

       }

}

interface INewInter2{

       static void staticMethod() {

               System.out.println("INewInter.staticMethod()");

       }


       default void defaultMethod() {

               System.out.println("INewInter.defaultMethod()");

       }

}

class NewInterImpl implements INewInter,INewInter2{

       @Override

       public void defaultMethod() {

               System.out.println("NewInterImpl.defaultMethod()");

       }

}

你可能感兴趣的:(面对对象编程)