Java——继承

如下代码:
1,练习java输出Hello World!的小程序。
2,学习继承的应用。
3,练习变量的定义,方法的调用与定义,
4,熟悉修饰符的使用,

class  BuZhiHe//定义一个名为BuZhiHe的类,
{
 public static void main(String[] args) //主函数
 {
  Zi z = new Zi();//通过关键字new创建一个Zi类型的对象名为z;
  z.setNum(4);//通过对象.的方式调用Fu类的setNum方法并用4作为参数传入;
  System.out.println("Hello World!");//输出语句
  z.show();//调用show方法;
 }
}
class Fu//定义一个名为Fu的类
{
 private int num = 9;//定义一个int型的成员变量,名为num,被private修饰,表示是私有的。只有自己类的方法可以调用。
 public void show1(){}//定义一个public 无返回值的方法,名为show1,为空实现。因为{}内什么都没有写。
 public void setNum(int num)//定义一个public 无返回值的方法,名为setNum接收int型参数,参数名为num。
 //这个num跟成员变量是不同的,所以要想将其赋值给成员变量需要使用this.成员变量名。好区分
 {
  this.num  = num;
 }
 Fu(){}//不带参空实现的构造方法,可以不写java虚拟机的默认存在形式。
}

class Zi extends Fu//继承关键字extends,表示Zi继承了Fu,这样Fu中除了private修饰的方法或属性外就都在Zi中有一份拷贝。

{
 //int num = 4;

 void show()//show方法
 {
  int num = 7;//局部变量
  System.out.println(super.num);//输出父类的num值,因为父类的num是私有变量故报错。
        //java.lang.Error: Unresolved compilation problem:
        //The field Fu.num is not visible
 }
}


继承:
 特点:
  1,提高了代码的复用性。
  2,让类与类之间产生关系,是多态性的前提。

 Java中的继承。
  1,java只支持单继承,不支持多继承。为啥呢?答案:因为继承了多个父类如果有相同方法时,
            子类对象不确定运行哪一个。
  2,Java还支持多层继承。A-->B--->C  原来可以形成继承体系。
   想要使用体系功能,"查阅父类功能,建立子类对象调用功能。"
   注解:父类的由来其实是由事物中的共性内容不断向上抽取而来的。
    所以父类中定义的是该体系中的最基本,最共性功能。
 
 继承出现后,代码上也有一些特点:
 1,变量。
  当子父类中定义了相同的名称的成员变量,
  子类要使用父类中的同名变量时,需要使用关键字super来区分。
  一般不会出现这种情况,因为父类中有了,子类不需要定义。
  而且父类定义时,一般变量都私有化。

 2,函数。
  子类可以直接访问父类中非私有的成员函数。
  特殊情况:当子类中定义了与父类一模一样的方法时,会发生覆盖操作。大多指的是非静态方法。
      最终会运行子类的方法,父类相当于被覆盖了。
      函数的另一个特性:覆盖(重写,复写)。
      什么时候用啊?
      当父类的功能要被修改时,不建议修改源码。因为是灾难。
      只要通过一个类继承原有类,定义一个新的升级后的功能即可。
      但是功能是相同的,只是实现方法改变。这是子类可以沿袭父类中的功能定义,
      并重写功能内容。这就是覆盖。

      覆盖很爽,但是有注意事项:
      1,子类覆盖父类时,必须权限要大于等于父类权限。
      2,静态不能覆盖非静态。
   
 3,构造函数。
  构造函数可以本类进行对象初始化,也可以给子类对象进行初始化。
  子类对象初始化过程:
  子类中的所有构造方法都会访问父类中空参数的构造函数,
  因为每一个构造函数的第一行,都有一句隐式的super语句。
  为什么要有这条语句?
  因为子类会获取到父类中的数据,必须要先明确父类对数据的初始化过程。

  当父类中没有空参数构造函数时,子类构造函数必须通过super句来明确要访问的父类中指定的构造函数。

  当时子类构造函数也可以通过this语句访问本类中的构造函数。
  但是子类中肯定,至少有一个构造函数会访问父类。

 
抽象类:其实就是在分析事物时,事物中的功能有些是不明确的内容的。这些不明确内容就是抽象的。
  可以通过抽象函数来描述。

  抽象函数一定要定义在抽象类中,因为,抽象函数所在类,也必须被抽象标识。

  写法特点:
  1,抽象函数只对函数进行声明,没有函数主体。
  2,抽象类和抽象函数都需要用abstract修饰。
  3,抽象类不可以进行实例化。
  4,想要使用抽象功能,必须通过子类覆盖了父类中所有的抽象方法后,才可以对子类实例化。
   如果只覆盖了部分抽象方法,那么子类还是一个抽象类。

  也可以理解为:抽象类是一个父类,是不断向上抽取而来的,
  在抽取过程中,只抽取了方法声明,但没有抽取方法实现。

  抽象类和一半类差不多。
  区别:
  抽象类可以定义抽象方法。
  抽象类不可以建立对象。

  其实抽象类一样用于描述事物,既可以定义抽象方法,也可以定义非抽象方法。


 

接口
  初期理解:接口看上去是一个特殊的抽象类。里面存的都是抽象方法。

  特点:
  格式:
  1,通过interface来定义。
  2,接口中常见成员:常量,抽象方法。
   而且这些成员都有固定的修饰符。
   常量:public static final
   方法:public abstract
  3,接口中的成员都是共有的。
  4,一个类可以对接口进行多实现,也弥补了多继承带来的安全隐患,所以java对多继承进行了改良。
   用多实现方法来体现多继承的特性。
  5,一个类可以继承一个类的同时,实现多个接口。
  6,接口与接口之间是继承关系,而且可以多继承。


 应用特点:
  1,接口是对外暴露的规则。
  2,接口是功能的扩展。
  3,接口的出现降低了耦合性。
  别忘了说的时候,需要举例。如usb。pci,主板。插座。


抽象类和接口异同:
相同:
1,都可以在内部定义抽象方法。
2,通常都在顶层。
3,都不可以实例化,都需要子类来实现。

不同点:
1,抽象类中可以定义抽象方法和非抽象方法,
 而接口中只能定义抽象方法。
2,接口的出现可以多实现。
 抽象类只能单继承。
 也就是说:接口的出现避免了单继承的局限性。
3,继承和实现的关系不一致。继承:is a,实现:like a

 

 

/*  

abstract class Fu
{
 abstract int show();
}

class Zi extends Fu
{
 int show1()
 {
  return 3;
 }
}

class  Fu
{
 void method()
 {
  System.out.println("method run");
 }
}

class Zi extends Fu
{
 void method()
 {
  System.out.println("method zi run");
 }
}

 


class ArrayTool
{
 public int getMax(int[] arr)
 {}
priavte int age;
 public void setAge(){}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值