面向对象编程外围(2)


一.抽象类
1.概述

一个没有办法体的办法应该被定义为形象办法,而类中如果有形象办法,则类为抽象类。

public abstratc class Animal{       public abstract void eat(){           }}         
2.抽象类的特点

1)抽象类和形象办法必须用abstract润饰。

2)抽象类中不肯定有形象办法,但形象办法肯定在抽象类中。

3)抽象类不能实例化,只能通过子类实例化(相似向上转型)

public abstratc class Animal{       public abstract void eat(){           }}      public class Cat extends Animal{        @Override        public void eat(){            System.out.println("猫吃鱼");            }}public class AnimalDemo{       public static void main(String[] args){            Animal a = new Cat();            a.eat();            }}

4)抽象类的子类要么是抽象类,要么重写抽象类中所有的办法

public abstratc class Animal{       public abstract void eat(){           }                   public abstract void sleep(){           }   }      public class Cat extends Animal{        @Override        public void eat(){            System.out.println("猫吃鱼");            }                     public void sleep(){             System.out.println("猫睡觉");             }}或:public class abstract Cat extends Animal{      }

5)抽象类的构造方法和成员办法
有构造方法,但不能实例化,用于子类拜访父类数据的初始化。而成员办法有形象办法,次要用于规定子类办法必须实现的动作,也有非形象办法,用于进步代码复用性。

二.接口
1.概述

接口是一种公共的标准规范,只有符合标准,大家能够通用。Java的接口更多体现在对行为的形象。

2.接口的特点

1)接口用关键字interface润饰

2)类实现接口用implements示意,同时接口中的办法都为形象办法(void show() = public abstract void show())

public class 类名 implements 接口名 {}

3)接口间接不能实现化,办法与多态类似

public interface Eat{       public abstract void eat(){           }}      public class Cat implements Eat{        @Override        public void eat(){            System.out.println("猫吃鱼");            }}public class EatDemo{       public static void main(String[] args){            Animal a = new Cat();            a.eat();            }}

4)接口的实现类要么是抽象类,要么重写接口中所有的办法

public interface Eat{       public abstract void eat(){           }                   public abstract void sleep(){           }   }      public class Cat implements Eat{        @Override        public void eat(){            System.out.println("猫吃鱼");            }                     public void sleep(){             System.out.println("猫睡觉");             }}或:public class abstract Cat implements Eat{      }
3.接口的成员变量和构造方法

成员变量只能为常量(默认修饰符:public static final),没有构造方法。

4.类和接口的关系

public class InterImpl extends Object implements Inter1,Inter2,Inter3{}public interface Inter3 extends Inter1,Inter2{}
5.抽象类和接口的区别

public interface Alarm{       //接口中默认为public abstract void alarm()       void alarm();}public abstract class door{        public abstract void open();        public abstract void close();}public class AlarmDoor extends door implements Alarm{        public void alarm(){        //...        }                public void close(){        //...        }                public void open(){        //...        }}在开发中,抽象类更多是对事物的形象,接口是对行为的形象。
6.抽象类和接口作为形参和返回值

1)抽象类:

public interface Jumping{        void jump(){           }}      public class Cat implements Jumping{        @Override        public void jump(){            System.out.println("猫跳高");            }}public class JumpingOperator{        //办法的形参是接口名,其实须要的是该接口的实现类对象        public void useJumping(Jumping j){              j.jump();                  }                           //办法的返回值是接口名,其实返回的是该接口的实现类对象         public Jumping getJumping(){              Jumping j = new Cat();              return j;}public class JumpingDemo{       public static void main(String[] args){            JumpingOperator jo = new JumpingOperator();            Jumping j = new Cat();            //JumpingOperator中相当于Jumping jo = new Cat();            jo.useJumping(j);                        //相当于Jumping j2 = new Cat()           Jumping j2 = ao.getJumping();            a2.jump();            }}

2)接口:

public abstract class Animal{       public abstract void eat(){           }}      public class Cat extends Animal{        @Override        public void eat(){            System.out.println("猫吃鱼");            }}public class AnimalOperator{        //办法的形参是抽象类名,其实须要的是该抽象类的子类对象        public class useAnimal(Animal a){              a.eat();                  }                           //办法的返回值是抽象类名,其实返回的是该抽象类的子类对象         public Animal getAnimal(){              Animal a = new Cat();              return a;              }public class AnimalDemo{       public static void main(String[] args){            AnimalOperator ao = new AnimalOperator();            Animal a = new Cat();            //AnimalOperator中相当于Animal a = new Cat();            ao.useAnimal(a);                        //相当于Animal a2 = new Cat()            Animal a2 = ao.getAnimal();            a2.eat();            }}
三.外部类
1.概述

在一个类中定义一个类,例如在类A中定义类B,B就是外部类

public class Outer{       public class Inner{            }}
2.外部类的拜访特点(仅限于外部类和外部类,不波及外部类以外的类)

1)外部类能够间接拜访外部类的成员,包含公有成员

2)外部类要拜访外部类的成员,必须创建对象

public class Outer{       private int num = 19;       public class Inner{               public void show(){                     System.out.println(num);            }        }                public void method(){             Inner i = new Inner();             i.show();            }}

3)外部类以外的类想拜访外部类的对象的对象创立形式

public class Outer{       private int num = 19;       public class Inner{               public void show(){                     System.out.println(num);            }        }                public void method(){             Inner i = new Inner();             i.show();            }}public class InnerDemo{         public static void main(String[] args){               //创立外部类对象               Outer.Inner oi = new Outer().new Innre();               oi.show();               }}
3.部分外部类

部分外部类在办法里定义的类,外界无奈间接应用,须要在办法外部创建对象应用,该类能够间接拜访外部类的成员,也能够拜访办法内的局部变量

public class Outer{       private int num = 10;              public void method(){             class Inner{                  public void show(){                        System.out.println(num);                        }                   }              Inner i = new Inner();       i.show();    }}      public class OuterDemo{        public static void main(String[] args){              Outer o = new Outer();              o.method();            }}
4.匿名外部类

前提:存在一个类或接口,而后在办法中创立

格局:

new 类名或者接口名(){      重写办法;}new Inter(){      public void show(){          }}实质是一个继承了该类或者实现了该接口的子类匿名对象

具体实现:

public class Outer{       public void method() {              //new Inter仅仅是一个对象,在前面加上.show()才是办法的调用              Inter i = new Inter() {                   @Override                   public void show() {                       System.out.println("匿名外部类");                       }             }                          i.show();       }}public interface Inter{      void show();}public class OuterDemo{        public static void main(String[] args){              Outer o = new Outer();              o.method();            }}