继承篇

来源:互联网 发布:模拟电路的软件 编辑:程序博客网 时间:2024/05/02 04:49

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

继承概述

继承的特点

ava语言中:java只支持单继承,不支持多继承。

因为多继承容易带来安全隐患:当多个父类中定义了相同功能,
当功能内容不同时,子类对象不确定要运行哪一个。
但是java保留这种机制。并用另一种体现形式来完成表示。多实现。

代码举例:

class A{void show(){System.out.println("a");}}class B{void show(){System.out.println("b");}}class C extends A,B{}C c = new C();c.show();

super关键字


类中成员:
1,变量。
2,函数。
3,构造函数。

 

函数覆盖

代码举例:

class Fu{void show(){System.out.println("fu show");}void speak(){System.out.println("vb");}}class Zi extends Fu{void speak(){System.out.println("java");}void show(){System.out.println("zi show");}}class ExtendsDemo3 {public static void main(String[] args) {Zi z = new Zi();z.speak();}}


 

 

子类的实例化过程

代码举例:

class Fu //extends Object{int num ;Fu(){//super();num= 60;System.out.println("fu run");}Fu(int  x){System.out.println("fu ...."+x);}}class Zi extends Fu{Zi(){super();  //super(4);System.out.println("zi run");}Zi(int x){this();//super();//super(3);System.out.println("zi..."+x);}}class  ExtendsDemo4{public static void main(String[] args) {Zi z = new Zi(0);System.out.println(z.num);}}


 

 

final关键字

 

抽象类

抽象类概述

 

抽象类的特点

抽象类的特点:
1,抽象方法一定在抽象类中。
2,抽象方法和抽象类都必须被abstract关键字修饰。
3,抽象类不可以用new创建对象。因为调用抽象方法没意义。
4,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。
 如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。

 

抽象类举例

学员示例:

 

abstract class Student{abstract final void study();//abstract void study1();void sleep(){System.out.println("躺着");}}/*class ChongCiStudent extends Student{void study(){System.out.println("chongci study");}}class BaseStudent extends Student{void study(){System.out.println("base study");}}class AdvStudent extends Student{void study(){System.out.println("adv study");}}*/class AbstractDemo {public static void main(String[] args) {//new Student();//new BaseStudent().study();}}

抽象类相关问题

抽象类中是否有构造函数?
有,抽象类是一个父类,要给子类提供实例的初始化。

abstract 关键字,和哪些关键字不能共存。
final:被final修饰的类不能有子类。而被abstract修饰的类一定是一个父类。
private: 抽象类中的私有的抽象方法,不被子类所知,就无法被复写。
  而抽象方法出现的就是需要被复写。
static:如果static可以修饰抽象方法,那么连对象都省了,直接类名调用就可以了。
  可是抽象方法运行没意义。

 

抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。

模版设计模式:

/*需求:获取一段程序运行的时间。原理:获取程序开始和结束的时间并相减即可。获取时间:System.currentTimeMillis();当代码完成优化后,就可以解决这类问题。这种方式,模版方法设计模式。什么是模版方法呢?在定义功能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去。由该类的子类去完成。*/abstract class GetTime{public final void getTime(){long start = System.currentTimeMillis();runcode();long end = System.currentTimeMillis();System.out.println("毫秒:"+(end-start));}public abstract void runcode();}class SubTime extends GetTime{public void runcode(){for(int x=0; x<4000; x++){System.out.print(x);}}}class  TemplateDemo{public static void main(String[] args) {//GetTime gt = new GetTime();SubTime gt = new SubTime();gt.getTime();}}


 

 

接口

 

接口的特点

/*接口:初期理解,可以认为是一个特殊的抽象类当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。class用于定义类interface 用于定义接口。接口定义时,格式特点:1,接口中常见定义:常量,抽象方法。2,接口中的成员都有固定修饰符。常量:public static final方法:public abstract 记住:接口中的成员都是public的。接口:是不可以创建对象的,因为有抽象方法。需要被子类实现,子类对接口中的抽象方法全都覆盖后,子类才可以实例化。否则子类是一个抽象类。接口可以被类多实现,也是对多继承不支持的转换形式。java支持多实现。*/interface Inter{public static final int NUM = 3;public abstract void show();}interface InterA{public abstract void show();}class Demo{public void function(){}}class Test extends Demo implements Inter,InterA{public void show(){}}class InterfaceDemo {public static void main(String[] args) {Test t = new Test();System.out.println(t.NUM);System.out.println(Test.NUM);System.out.println(Inter.NUM);}}

接口与接口之间可以有继承关系:

interface A{void methodA();}interface B //extends A{void methodB();}interface C extends B,A{void methodC();}class D implements C{public void methodA(){}public void methodC(){}public void methodB(){}}


 

多态

 

多态的体现形式有多种形式,这里研究的是类的多态。

 

类多态的转型:

Animal a = new Cat();//类型提升。 向上转型。

这个将子类对象转换为父类类型,父类类型兼容子类对象(子类对象可以调用父类方法),可以。

Animal a = new Animal();

 Cat c = (Cat)a;

上述代码将父类对象转为子类对象,子类类型不兼容父类对象(父类对象无法调用子类方法),不行。

 类的多态代码示例:

/*基础班学生:学习,睡觉。高级班学生:学习,睡觉。可以将这两类事物进行抽取。*/abstract class Student{public abstract void study();public void sleep(){System.out.println("躺着睡");}}class DoStudent{public void doSome(Student stu){stu.study();stu.sleep();}}class BaseStudent extends Student{public void study(){System.out.println("base study");}public void sleep(){ System.out.println("坐着睡");}}class AdvStudent extends Student{public void study(){System.out.println(" adv study");}}class  DuoTaiDemo3{public static void main(String[] args) {DoStudent ds = new DoStudent();ds.doSome(new BaseStudent());ds.doSome(new AdvStudent());//BaseStudent bs = new BaseStudent();//bs.study();//bs.sleep();//AdvStudent as = new AdvStudent();//as.study();//as.sleep();}}


 

 

多态的特点

在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。


在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。


在多态中,静态成员函数的特点:
无论编译和运行,都参考做左边。(类先加载,静态函数优先存在)

 接口引用的多态:

 

/*需求:电脑运行实例,电脑运行基于主板。*/interface PCI{public void open();public void close();}class MainBoard{public void run(){System.out.println("mainboard run ");}public void usePCI(PCI p)//PCI p = new NetCard()//接口型引用指向自己的子类对象。{if(p!=null){p.open();p.close();}}}class NetCard implements PCI{public void open(){System.out.println("netcard open");}public void close(){System.out.println("netcard close");method();}}class SoundCard implements PCI{public void open(){System.out.println("SoundCard open");}public void close(){System.out.println("SoundCard close");}}/*class MainBoard{public void run(){System.out.println("mainboard run");}public void useNetCard(NetCard c){c.open();c.close();}}class NetCard{public void open(){System.out.println("netcard open");}public void close(){System.out.println("netcard close");}}*/class DuoTaiDemo5 {public static void main(String[] args) {MainBoard mb = new MainBoard();mb.run();mb.usePCI(null);mb.usePCI(new NetCard());mb.usePCI(new SoundCard());}}


内部类

内部类的访问规则:


1,内部类可以直接访问外部类中的成员,包括私有。
 之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式 外部类名.this
2,外部类要访问内部类,必须建立内部类对象。

 

访问格式:


1,当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。
可以直接建立内部类对象。
格式
 外部类名.内部类名  变量名 = 外部类对象.内部类对象;
 Outer.Inner in = new Outer().new Inner();

2,当内部类在成员位置上,就可以被成员修饰符所修饰。
 比如,private:将内部类在外部类中进行封装。

静态内部类:


  static:内部类就具备static的特性。
  当内部类被static修饰后,只能直接访问外部类中的static成员。出现了访问局限。

  在外部其他类中,如何直接访问static内部类的非静态成员呢?
  new Outer.Inner().function();

  在外部其他类中,如何直接访问static内部类的静态成员呢?
  uter.Inner.function();

 注意:当内部类中定义了静态成员,该内部类必须是static的。
    当外部类中的静态方法访问内部类时,内部类也必须是static的。

 

 
当描述事物时,事物的内部还有事物,该事物用内部类来描述。
因为内部事务在使用外部事物的内容。

 

 

内部类的位置

 

匿名内部类

匿名内部类:
1,匿名内部类其实就是内部类的简写格式。
2,定义匿名内部类的前提:
 内部类必须是继承一个类或者实现接口。
3,匿名内部类的格式:  new 父类或者接口(){定义子类的内容}
4,其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。 可以理解为带内容的对象。
5,匿名内部类中定义的方法最好不要超过3个。

匿名内部类本质上还是匿名类,只是在一个类的内部匿名调用了一个类,适于需要调用一次其他类中的方法或作为参数传送。

 

 

异常

异常的概念

异常:就是程序在运行时出现不正常情况。
异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述。并封装成对象。
   其实就是java对不正常情况进行描述后的对象体现。

对于问题的划分:两种:一种是严重的问题,一种非严重的问题。

对于严重的,java通过Error类进行描述。
 对于Error一般不编写针对性的代码对其进行处理。

对与非严重的,java通过Exception类进行描述。
 对于Exception可以使用针对性的处理方式进行处理。

无论Error或者Exception都具有一些共性内容。
比如:不正常情况的信息,引发原因等。

Throwable
 |--Error
 |--Exception

 


异常的处理

 

java 提供了特有的语句进行处理。
try
{
 需要被检测的代码;
}
catch(异常类 变量)
{
 处理异常的代码;(处理方式)
}
finally
{
 一定会执行的语句;
}

多异常的处理:

1,声明异常时,建议声明更为具体的异常。这样处理的可以更具体。
2,对方声明几个异常,就对应有几个catch块。不要定义多余的catch块。
 如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。


建立在进行catch处理时,catch中一定要定义具体处理方式。
不要简单定义一句 e.printStackTrace(),
也不要简单的就书写一条输出语句。

 

throws和throw的区别


throws使用在函数上。
throw使用在函数内。

throws后面跟的异常类。可以跟多个。用逗号隔开。
throw后跟的是异常对象。

 

自定义异常:

class FuShuException extends Exception //getMessage();{private int value;FuShuException(){super();}FuShuException(String msg,int value){super(msg);this.value = value;}public int getValue(){return value;}}class Demo{int div(int a,int b)throws FuShuException{if(b<0)throw new FuShuException("出现了除数是负数的情况------ / by fushu",b);//手动通过throw关键字抛出一个自定义异常对象。return a/b;}}class  ExceptionDemo3{public static void main(String[] args) {Demo d = new Demo();try{int x = d.div(4,-9);System.out.println("x="+x);}catch (FuShuException e){System.out.println(e.toString());//System.out.println("除数出现负数了");System.out.println("错误的负数是:"+e.getValue());}System.out.println("over");}}


RuntimeException

Exceptoin中有一个特殊的子类异常RuntimeException 运行时异常。

如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过。

如果在函数上声明了该异常。调用者可以不用进行处理。编译一样通过;

之所以不用在函数声明,是因为不需要让调用者处理。
当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,
对代码进行修正。

 

使用RuntimeException时不要在函数上声明也不要处理,因为设计的初衷是希望异常发生后程序停止,比如参数传错的情况。

 


自定义异常时:如果该异常的发生,无法在继续进行运算,
就让自定义异常继承RuntimeException。

 

 

 


对于异常分两种:
1,编译时被检测的异常。
 
2,编译时不被检测的异常(运行时异常。RuntimeException以及其子类)

 

 

finally代码块:

 

定义一定执行的代码。
通常用于关闭资源。

 

异常处理的格式:

第一个格式:try{}catch (){}第二个格式:try{}catch (){}finally{}第三个格式:try{}finally{}//记住一点:catch是用于处理异常。如果没有catch就代表异常没有被处理过,如果该异常是检测时异常。那么必须声明。class Demo{public void method(){try{throw new Exception();}finally{//关资源。}}}class  {public static void main(String[] args) {System.out.println("Hello World!");}}

 

异常在子父类覆盖中的体现:


1,子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。
2,如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。
3,如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。
 如果子类方法发生了异常。就必须要进行try处理。绝对不能抛。
 

 

 

 

 

 

 

 

 

 

 

 

classpath

 

包之间的访问

 

四种权限

 

import

 

jar包

 

jar包的操作

 

 

 

 ----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

详情请查看:http://edu.csdn.net/heima

原创粉丝点击