抽象类及接口

1,单词:biology生物 interface接口, abstract 抽象的 major 专业

Illegal 不合法的

2,abstract介绍

abstract:关键字,表示抽象的

 * abstract修饰方法表示:表示给方法没有方法体,就是没有{}

 * ,并且,一旦类中存在抽象方法,给类必须使用abstract,表示该类是抽象类

 * abstract修饰的类型中,是可以不存在abstract方法的

 * 抽象类中,不一定存在抽象方法,但抽象方法所在的类一定是抽象类。

 * 抽象类的特点

 * 抽象类有构造方法,但抽象类不能被实例化:

 * 因为抽象类不能实例化对象,但为什么还有构造方法呢

 * 是为了给成员变量初始化用的。是在子类构造方法中,通过superString int)的形式来初始化抽象类的成员变量用的

 * 给成员变量赋值的方式:1,通过get set,2,通过构造方法

 * abstractfinal不能在一起修饰成员方法:因为,final修饰的成员方法

 * 不能重写。

 * abstract static不能在一起修饰成员方法:因为,static修饰的成员是

 * 方法是随着类的加载而加载,执行。

3,猫类型,继承自动物类Animal,并且实现抽象方法eat()

 * */

//The type Cat must implementthe inherited abstract method Animal.eat()

//抽线类的子类,只有2个选择:要么还是抽象类,要么是非抽象类,必须实现所有的抽象方法

4,//因为不能实例化抽象类,也就是不能直接创建对象

     //Animal animal=new Animl();

     //既然不能直接实例化抽象类,那么抽象类主要是为了让子类继承用的,主要用于多态场合下

     /*

      * 多态的3个条件:有继承关系

      * 方法重写

      * 父类引用指向子类对象

5//抽象类多态

     //左边是抽象类,右边是子类对象

     Animal animal=new Cat();

     //多态情况下,调用成员方法。编译的时候看左边,运行的时候看右边

     //在多态情况下,如何访问子类的特有方法呢

     //默认多态情况下,是无法通过父类引用,访问子类特有的方法

     //必须通过向下类型的转换

     //animal.method();

     Cat c=(Cat)animal;

     c.method1();//向下类型转化,调用子类特有的方法

     System.out.println(animal.i);

     //通过子类的构造方法,来初始化父类的成员变量

     Catc1=new Cat("Cat1","white",3);

6,定义了一个接口,有生命力的生物

 * 接口表示抽象的抽象

 * 接口中不能存在非抽象方法

 * 接口中可以有成员变量

 * 接口中不允许有构造方法,没法通过构造方法赋值,所以直接赋值例如:final static int

a=10;

 * 成员变量只能是常量

 * jdk1.8之前,接口里面的成员方法只能是抽象方法

 * */

7,  void act();//接口中可以存在成员方法

   //等同于public abstract void act();

8,//接口自定义另外一个动物接口。

//接口不能实现两外一个接口,但可以继承另一个接口

9,接口使用关键字interface来表示

 * 格式:public interface 接口名{}

 * 接口不能实例化,但接口可以被子类实现(implements)

 * 格式:

 *public class 子类implements接口名{}

10,Java a=(Java) student;//向下类型转换,用于调用子类特有的方法

11,如这种形式,爷(可以是接口)-父(可以是抽象类)-子(可以是子类),这种耦合度太高,可以灵活一下。抽象类是父类,接口跟父类的子类有关系,子类同时继承父类(抽象类),也同时继承接口,这样可以灵活点。

12,返回值类型为引用类型或者是抽象类

   //返回值类型为抽象类的方法,本质上返回的是该抽象类的子类对象

例如:

   public Animal method5(){

     returnnew Cat();//返回匿名对象

    

   }

同理

返回值类型为接口的方法,本质上返回的是实现了该接口的子类对象

例如:

public Ilife method6(){//返回值类型为接口类型

    

     return  new Cat();

   }

13,//抽象类作为方法的形式参数

   //传递的实参为:继承了该类的子类对象

   publicstaticvoid method7(Animal animal){

     animal.eat();

    

   }

调用:

method7(new Cat());

同理,接口一样

publicstaticvoid method9(Ilife life){

     life.act();

   }

14,如果形式参数为子类类型,例如Cat类型

   publicstaticvoid method8(Cat cat){

     System.out.println();

   }

但是,这个参数只能传这个子类型,而不能是其他子类型。而参数类型是父类的就不一样了,参数不仅可以传父类,也可以传该父类的其他子类。

15,书写规范。声明接口,用I标识,例如接口名:Iife

16.链式编程,

17,包;

(1)了避免类型重名的情况,而采用的一种管理方式。一个包名,就对应了文件系统的一个文件夹。

(2)名,使用.连接,对应了文件系统中的多级文件夹。

(3)建议都用小写字母,并且不能使用关键字作为包名

(4)则:

跨包访问的时候,需要使用import关键字,(Scanner类在java.util.Scanner

java.lang包下的所用类型,jvm启动的时候,默认会加载,表示,我们作为使用者,不再需要不需要手动导入java.lang包下面,直接使用即可。

(5)全类名。例如Scanner的形式

java.util.Scanner sc=newjava.util.Scanner(System.in);

(注意只能用一次,什么时候再用,什么时候写)

18,顺序问题

19,权限修饰符

(1)默认的default(只要在同一个包就行)

访问规则:A:在本类中可以用

B:同一个包的不同类型之间,可以访问,default方法。

C:同一个包的子类之间,(子类继承了父类的非私有方法,)可以访问。

D:跨了包下,不能访问默认(default)修饰的成员方法。

(2)protected修饰的:

A:在同一个类中,可以访问

B:在同一个包下面,不同类型之间,可以访问protected修饰的成员方法。

C:在同一个包下,子类可以访问父类protected修饰的成员方法。

D:不同包的子类,在子类本身中可以访问跨包的父类protected修饰的成员方法(因为子类继承父类的所有非私有的成员方法)

E:不同包的不同类,是不可以访问protected修饰的成员方法的。无论通过父类的引用,还是子类的引用都是不行的。

20,典型例题:

例一:.

public class Something {

  void doSomething () {

      private String s = "";

      int l = s.length();

   }

}这样写是不对的,因为,局部变量i,的生命周期是这个成员方法doSomething()方法。这个方法被调用完,s也就随之消失了。所以,修饰s的修饰符只有final是可以的。

例二:此处,Something类的文件名叫OtherThing.java

class Something {

   private static void main(String[] something_to_do) {       

       System.out.println("Do something ...");

    }

}

只有一个Something类存在,没有其他类型存在

这样写是错的。错误原因:main()的修饰符固定的只能是public,不能用private。

请记住:在一个类文件中,可以存在多个整型的定义(包括类和接口)但是,在一个类文件中,只能有一个public类型,并且该类型需与文件名保持一致。也就是说,没有public修饰类的时候,类名可以不与文件名一样。

例三:

interface Playable {

   void play();

}

interface Bounceable {

   void play();

}

interface Rollable extends Playable,Bounceable {

 

Ballball = new Ball("PingPang");

//在接口里,只能有成员变量(只能是常量),成员方法

上面这条语句,实际上是等同于=

Public static final Ball ball=new Ball(“PingPang”);

也就是ball=PingPang

   

}

class Ball implements Rollable {

   private String name;

   public String getName() {

       return name;

    }

   public Ball(String name) {

       this.name = name;       

    }

  public void play() {

      

       ball = new Ball("Football");

     //这样写是有错误的,因为在接口Rollable里面,ball已经被常量化了,所以,他不能再被赋值。

 

System.out.println(ball.getName());

 }

}

这样写是错误的。

错误原因:文本中添加

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值