第三章:面向对象(3)

学习目标:

掌握面向对象的相关知识

学习内容:

提示:这里可以添加要学的内容
例如:
1、 继承
2、 抽象类
3、 多态
4、 final关键字
4、 接口


学习时间:

2021年5月4日 2021年5月5日

学习产出:

1、 技术笔记 1 遍 2、CSDN 技术博客 1 篇

继承

继承:继承是面向对象程序设计不可缺少的设计思想,是实现代码可重用的根基,是提高代码可扩展性的主要途径

继承是从已有的类中派生出新的类,新的类能吸收已有类的属性和行为,并能扩展新的能力

​ 1.在Java中使用extends关键字来表示继承关系

​ 当一个类没有显示的继承其他类的时候,此时这个类默认继承Object

​ Object类是java中所有类的基类(父类 超类)

public class Animal extends Object

​ 2.Java不支持多继承,单继承使JAVA的继承关系很简单,一个类只能有一个 直接父类。

​ 3.继承之后子类可以调用父类的所有非私有属性和非私有方法

继承的传递性

C类从B类继承,B类又从A类继承

那么C类就具有B类和A类的所有非私有属性和非私有方法

继承中的构造方法

子类构造方法总是先调用父类构造方法,默认情况下,调用父类无参构造方法

可以在子类构造方法的第一行,使用super关键字调用父类任意一个构造方法

如果用super,必须写在构造方法的第一句

如果子类的构造方法中没有显式地调用基类构造方法,则系统默认调用基类无参数的构造方法。

设计Dog类 狗是动物 继承Animal 拥有父类中行为属性(非私有的)

public class Dog extends Animal{

         //无参构造
         public Dog(){
          super();//调用父类的无参构造方法
          System.out.println("Dog无参构造");
        }
        //有参构造
        public Dog(String type){
             super();
             this.type=type;
            System.out.println("Dog有参构造");
        }

        public  void play(){
              System.out.println(super.getName()+"狗会玩");
        }
 }

super关键字用途

super关键字代表父类的引用,在程序中主要的用途

• 在子类构造方法中要调用父类的构造方法,

​ 需要注意:super语句只能出现在子类构造方法体的第一行。

• 用“super.成员变量名”来引用父类成员变量

• 用“super.方法名(参数列表)”的方式访问父类的方法。

方法的重写

应用场景 :

​ 当父类的方法实现不能满足子类需求时,可以对方法进行重写( override)

在子类中可以根据需要对从基类中继承来的方法进行重写。

方法重写规则

​ • 方法名相同、参数列表相同;

​ • 返回值类型相同;

​ • 访问权限不能小于父类权限;

注意:构造方法,静态方法不能重写,成员变量不存在重写

//构造方法,静态方法不能被重写,  属性也不存在重写,
        //当父类中实现方式(代码) 不能满足子类中的需求,可以在子类中将父类中的方法重写(方法覆盖 覆写)
        @Override//java中的注解标签  说明 此方法是从父类中重写过来的  在编译期间就会对语法进行校验
        void eat() {
            System.out.println("ssssss");//子类自己的实现方式
            //super.eat();//调用父类的实现
            super.sleep();
            System.out.println("ssssss");
        }

抽象类

如果一个类中没有包含足够的信息(抽象方法)来描绘一个具体的对象,这样的类就是抽象 类。

抽象类中可以没有抽象方法,有抽象方法必定是抽象类。

一般用在体系结构的顶层用来进行功能的定义声明。

public abstract class Animal {

     int num;

     /*
       抽象类可以拥有构造方法,但是不能创建对象
      */
     public Animal(){
         System.out.println("Animal无参构造");
     }

    /*
    *抽象方法:只有方法声明, 没有方法体,也就是没有具体的实现
    */
    public abstract void eat();//在比较顶级的类中就可以定义一个方法即可

     public void sleeep(){
         System.out.println("动物睡觉");
     }
}

一个类如果继承了抽象类 要么重写抽象类中所有的抽象方法 要么将该类也定义为抽象类

//public abstract class Dog extends Animal {
public  class Dog extends Animal {

    public  Dog(){
        super();
    }

    @Override
    public void eat() {
        System.out.println("狗吃东西");
    }
}

抽象类不能被实例化,但可以有构造方法,因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。

抽象类只能用作基类,表示的是一种继承关系。继承抽象类的非抽象类必须实现其中的所有抽象方法,而已实现方法的参数、返回值要和抽象类中的方法一 样。否则,该类也必须声明为抽象类。

多态

多态:同一种事物,在不同时刻表现不同的状态

多态存在的三个必要条件

​ ● 要有继承(包括接口的实现)(前提条件)

​ ● 要有重写(前提条件)

​ ● 父类引用指向子类对象

​ 当编译期类型是父类,运行期类型是子类时,被称为父类引用指向子类对象

class Animal{
……
}
class Cat extends Animal{
…… 
}
class Dog extends Animal {
…… 
}
Animal x = new Cat() //Animal 的引用指向Cat的对象

多态环境下对成员方法的调用

Animal d = new Dog();
         /*
           多态访问类中的成员方法,编译期间调用的是父类中的方法,运行时执行子类中的方法
               编译看左边   运行看有边
          */
       d.eat();
       d.sleep();//对于静态方法编译和运行都看左边

多态环境下对成员变量的调用

System.out.println(d.num);//对于成员变量编译和运行都看左边

                d = new Cat();
                d.eat();

注意:变量不存在被子类覆写这一说法,只有方法存在覆写。

向上转型

class Animal{
    void eat(){ }
}
class Cat extends Animal{
    void look() {
        System.out.println("看家"); 
    } 
}
……… 
Animal x=new Cat() //向上造型,Cat对象提升到Animal对象
x.eat() //只能使用父类中的方法 
x.look() //报错!不能使用子类中的方法

向上转型的作用是:提高程序的扩展性。

向下转型

class Animal{
    void eat(){ }
}
class Cat extends Animal{
    void look() {
        System.out.println("看家"); 
    } 
}
……… 
Animal x=new Cat() Cat m=(Cat)x; //向下转型
m.eat() ;
m.look();//子父类中的方法都可以使用

向下转型的作用是:为了使用子类中的特有方法。

final关键字

final 修饰类,属性(成员变量–>常量),方法

修饰类:不能被其他类继承修饰属性;

public final class FinlDemo

修饰后的属性使用前必须赋值,赋值值不能改变修饰方法;

static final int PI = 3;//直接为常量赋值,建议使用static修饰,这样在内存中就只有一份,所有对象共享
        final int num;//不用static修饰,不需要赋初值,每个对象中都会包含一个常量,在构造方法中初始化


       public FinlDemo(int n) {
            num = n;
       }

修饰的方法不能被重写

//修饰方法参数,当调用时传入值后,值不能改变
public final static void  test(final int a){

}

接口

一个类实现接口

要么将此类声明为抽象类

从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。

  /*
   接口可以继承多个接口
  */
public interface MyInerface extends InterfaceA,InterfaceB{

    //接口中声明的属性默认为 public static final 的;
    //public  static  final    int num  =10;
       int NUM  =10;//静态常量

    //接口中的方法默认为 public abstract 的
    //public abstract void eat();
      void eat();//定义方法(定义功能)
      void sleep();

     /*
      通过子类调用, 默认方法子类可以重写,也可以不重写
      */
     default void test(){
          System.out.println("默认方法");
     }

      //静态可以直接通过接口名调用
      static void test1(){
          System.out.println("静态方法");
      }

}

/*
一个类实现接口
 要么将此类声明为抽象类
 要么重写所有抽象方法,可以重写默认方法,也可以不重写
 接口是用来被其他类实现,不能被实例化
 一个类可以直接继承一个类
 一个类可以实现多个接口
 多个类可以实现同一个接口。
 */
//public abstract class MyInterfaceImpl implements MyInerface{
public  class MyInterfaceImpl extends Object implements MyInerface,InterfaceC{

        @Override
        public void eat() {
            System.out.println("MyInterfaceImpl--eat");
        }
       @Override
        public void test() {
            System.out.println("MyInterfaceImpl--test");
        }
}

与继承关系类似,接口与实现类之间存在多态性。

//接口实现多态性
Animal cat = new Cat();
Animal dog = new Dog();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值