黑马程序员------第4天笔记(类的继承)

类的继承

------- android培训java培训、期待与您交流! ----------

/**

功能:继承

 

将学生和工人的共性描述提取出来,单独进行描述的

 

继承:

       1.提高了代码的复用性

       2.让类与类之间产生了关系。有了这个关系,才有了多态的特性。

 

注意:千万不要为了获取其他类的功能,简化代码而继承

必须是类与类之间有所属关系才可以继承。所属关系 is a。

 

java语言只支持单继承,不支持多继承【这么说不严谨】因为多继承容易带来安全隐患->当多个父类中定义了相同功能

但功能内容不同时,不确定要运行哪一个

java支持多层继承

 

想要使用体系,先查阅体系父类的描述,因为父类中定义的事该体系中共性功能

 

那么在具体调用时,要创建最子类的对象,因为有可能父类不能创建对象,二是创建子类对象可以使用更多的功能,包括基本的也包括特有的

简单一句话就是查阅父类功能,创建子类对象使用功能

 

*/

 

class Person

{

       String name;

       int age;

}

 

class Studentextends Person

{

       void study()

       {

              System.out.println("好好学习");

       }

}

class Workerextends Person

{

       void work()

       {

              System.out.println("好好工作");

       }

}

class ExtendDemo

{

       public static void main(String[] args)

       {

              System.out.println("HelloWorld!");

       }

}

 

 

覆盖

 

1.      子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败

2.      静态只能覆盖静态(不能覆盖非静态加载先后问题)

3.      访问权限问题: private<空<public

/*

子父类类中成员情况

类中成员:

1.变量

2.函数

3.构造函数

 

1.看变量

  当父类和子类中变量名相同时,或默认为是子类的变量

  子类要访问本类中的变量本类中的变量,用this

  子类要访问父类中的同名变量,用super。

  super的使用和this的使用几乎一致。

  this代表的是本类对象的引用。

  super代表是父类对象的引用。

 2.看函数

 当父类和子类中函数名相同时,子类的对象调用该函数,会运行子类函数的内容

 如同父类函数被覆盖一样

 这种情况是函数的另一种特性:(重写)覆盖

*/

 

class Fu

{

       int num=4;

       void show()

       {

              System.out.println("fushow");

       }

       void speak()

       {

              System.out.println("vb");

       }

}

class Zi extendsFu

{

       int num=5;

       void show()

       {

              System.out.println("zishow");

       }

       void speak()

       {

              super.speak();

              System.out.println("java");

       }

}

class ExtendDemo2

{

       public static void main(String[] args)

       {

              Zi z=new Zi();

              //System.out.println(z.num+"....."+z.num);

              //z.show1();

              z.speak();

       }

}

 

子类实例化过程

/*

3.子父类中的构造函数

在对子类对象进行初始化时,父类的构造函数也会执行

那是因为子类的构造函数第一行有一条隐士语句super();

super();会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();

 

为什么子类一定要访问父类中的构造函数。

 

因为父类中的数据,子类可以直接获取。所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的

所以子类在对象初始化时先访问以下父类和中的构造函数

如果要访问父类中指定的构造函数,可以通过手动定义super的方式来访问

 

注意:super语句一定定义在子类构造函数的第一行

子类所有构造函数默认都会访问父类中空参数中构造函数,因为子类每一个构造函数都有一个隐士super

当父类中没有空参数的构造函数时,子类必须手动通过super或者this语句形式来指定要访问的构造函数

*/

class Fu

{

       Fu()

       {

              System.out.println("Fu1run");

       }

       Fu(int x)

       {

              System.out.println("Fu2run................"+x);

       }

}

class Zi extendsFu

{

       Zi()

       {

              System.out.println("Zirun");

       }

       Zi(int x)

       {

              super(3);

              System.out.println("Zi2run");

       }

}

class ExtendDemo3

{

       public static void main(String[] args)

       {

              Zi a=new Zi();

              Zi b=new Zi(2);

       }

}

Final关键字

final关键字:最终

1,可以修饰类,函数,变量

2,被final修饰的类不能被继承.为了避免被继承,被子类覆写功能

3,被final修饰的方法不可以被覆写

4,被final修饰的变量是一个常量只能赋值一次,就可以修饰成员变量,又可以修饰局部变量

   当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字。方便阅读

   而这个值不需要改变,所以加上final修饰。作为常量,常量的书写规范所有字母都大写,如果由多个单词组成,

   单词间通过下滑线连接如: MY_PI

5,内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量。

 

 

抽象类

/*

当多个类中出现相同功能,但是功能主题不同,

这是可以进行向上抽取。这时,只抽取功能定义,而不抽取功能主体。

抽象:看不懂的类

抽象类的特点:

1,抽象方法一定在抽象类中

2,抽象方法和抽象类都必须被abstract关键字修饰

3,抽象类不可以用new创建对象,因为调用抽象方法没意义

4,抽象类中的方法要被使用,必须由子类复写所有的抽象方法后,建立子类调用对象。

如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类

 

 

抽象类共和一般类没有太大的不同,该怎样描述事物就如何描述事物

只不过钙食物中出现一些看不懂的东西,这些不确定的部分也是该功能,需要定一下来。但是无法定义实体

通过抽象方法来表示。

 

抽象类比一般类多了个抽象函数

抽象类不可以实例化。

就是在类中定义抽象方法。

抽象类不可以实例化

 

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

 

 

 

*/

abstractclass Student

{

         abstract void study();

}

//

classBaseStudent extends Student

{

         void study()

         {

                   System.out.println("basestudy");

         }

}

//

classAdvStudent extends Student

{

         void study()

         {

                   System.out.println("advstudy");

         }

}

//

classAbstactDemo

{

         public static void main(String[] args)

         {

                   System.out.println("HelloWorld!");

         }

}

 

/*

员工类:name id pay

经理类:继承了员工,并有特有的bonus

*/

classEmployee

{

         private String name;

         private String id;

         private double pay;

 

         Employee(String name,String id,doublepay)

         {

                   this.name=name;

                   this.id=id;

                   this.pay=pay;

         }

         public abstract void work();

}

classManager extends Employee

{

         private int bonus;

         Manager(String name,String id,doublepay,int bonus)

         {

                   super(name,id,pay);

                   this.bonus=bonus;

         }

         public void work()

         {

                   System.out.println("managerwork");

         }

}

class 

{

         public static void main(String[] args)

         {

                   System.out.println("HelloWorld!");

         }

}

 

 

模板方法设计模式

/*

需求:获取一段程序运行的时间。

原理:计时原理(结束-开始);

获取时间:currentTimeMillis():返回以毫秒为单位的当前时间

 

当代吗完成优化后,就可以解决这类问题。

这种方式,模板方法设计模式

 

在定义功能时,功能的一部分是确定的,但是有一部分是不确定的,而确定的部分在使用

不确定的部分,那么这时,就将不确定的部分暴漏出去,由该类的子类来完成。

*/

 

abstractclass GetTime

{

         public final void getTime()//这个函数要用final修饰,阻止其他人覆写;

         {

                   longstart=System.currentTimeMillis();

                   runCode();

                   longend=System.currentTimeMillis();

                   System.out.println("毫秒:"+(end-start)+" ");

         }

         public abstract void runCode();//这玩意是抽象的

}

classSubTime extends GetTime

{

         public void runCode()

         {

                   for(int x=0;x<4000;x++)

                   {

                            System.out.print(x+"\t");

                   }

         }

}

class  TemplateDemo

{

         public static void main(String[] args)

         {

                   //GetTime a=new GetTime();

                   SubTime a=new SubTime();

                   a.getTime();

         }

}

4.8接口

/*

接口:  初期理解,可以认为是一个特殊的抽象类

                   当抽象类中的方法都是抽象的,那么该类可以通过接口的方式来表示

                   class:用于定义类

                   interface:用于定义接口

                   接口定义时,格式特点:

                   1,常量:public static final

                   2,抽象方法 public abstract

                   接口中的成员都是public 的

                   3,接口是用来实现的(implements),接口不能用来创建对象,因为有抽象方法,需要被子类实现,子类对接口中的

                   抽象方法全都覆盖后,子类才可以创建对象。

                   4,接口可以被类多实现。也是对多继承不支持的转换形式,java实现多实现

                   5,类继承类,类实现接口,接口继承接口

 

 

 

/*

接口可以理解为体系外的一种功能扩展,用于扩展其他内容

基本功能定义在类中

扩展功能定义在接口中。

*/

/*classStudent

{

         abstract void study();

 

         void sleep()

         {

                   System.out.println("sleep");

         }

 

}

 

interfaceSmoking//like a

{

         void smoke();

}

 

classZhangsan extends Student implements Smoking//张三吸烟

{

         void study()

         {

         }

         public void smoke()

         {

         }

}

 

classLisi extends Student//李四不吸烟

{

         void study()

         {

 

         }

}

*/

abstractclass Sporter

{

         abstract void play();

}

 

interfaceStudy

{

}

classWangwu extends Sporter implements Study

{

}

class  InterfaceTest

{

         public static void main(String[] args)

         {

                   System.out.println("HelloWorld!");

         }

}

------ android培训java培训、期待与您交流! ----------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值