java基础6(面向对象---下)

java基础6(面向对象---下)

1.包

为了更好地组织类,java提供了包机制,用于区别类名的命名空间。

  • 作用:

    避免类重名;

    按照不同功能管理类;

    控制访问权限。

  • 常见的包:

2.访问权限修饰符

●Java语言有四个权限访问修饰符,权限从大到小依次为:

1)public :公共权限 修饰类、属性、方法。可以被任意类访问

2)protected:受保护的权限 修饰属性、方法。

可以被同包类访问,如果不是同包类,必须是该类的子类才可以访问。

3)default:同包权限 修饰类、属性、方法。只能被同包的类访问

4)private:私有权限 修饰属性、方法。 只能在本类中访问

3.面向对象语言的三大特征

  1. 封装

    • 封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问, 而是通过该类提供的方法来实现对隐藏信息的操作和访问 。

    • 作用:

      (1)隐藏类的实现细节;

      (2)方便加入控制语句;

      (3)只能通过规定方法访问;

      (4)方便修改实现。

  2. 继承

    • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。

    • extends的意思是”扩展“,子类是父类的拓展。

    • Java中只有单继承,没有多继承

    • 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚集等。

    • 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示

    • 子类和父类之间,从意义上具有”is a“关系

    • 子类继承父类,就会拥有父类全部方法(public

    • Java中,所有类都默认继承Object

    • private属性和方法无法被继承

      public class Animal_test {
          String name;
          public void eat(){
              System.out.println("会吃");
          }
      ​
      }
      //继承Animal_test类
      class Dog_test extends Animal_test{
          String color;
          public void Sleep(){
              System.out.println("会睡觉");
          }
      }
      //继承Dog_test类
      class HaShiQi extends Dog_test{
          String weight;
          public void play(){
              System.out.println("会拆家");
          }
      ​
      }
      class Test1{
          public static void main(String[] args) {
              Animal_test a1= new Animal_test();
              a1.name="动物";
              System.out.print("名字:"+ a1.name+"\n技能:");
              a1.eat();
              System.out.println("-------------------");
              Dog_test d1= new Dog_test();
              d1.name="狗";
              d1.color="白色";
              System.out.print("名字:"+ d1.name+"   颜色:"+d1.color+"\n技能:");
              d1.eat();//继承了Animal_test类的eat方法
              System.out.print("技能:");
              d1.Sleep();
              System.out.println("-------------------");
              HaShiQi h1= new HaShiQi();
              h1.name="二哈";
              h1.color="黑白";
              h1.weight="40kg";
              System.out.print("名字:"+ h1.name+"   颜色:"+h1.color+"   体重:"+h1.weight+"\n技能:");
              h1.eat();//继承了Animal_test类的eat方法
              System.out.print("技能:");
              h1.Sleep();//继承了Dog_tset类的Sleep方法
              System.out.print("技能:");
              h1.play();
          }
      }

    super关键字

    使用super关键字访问父类成员

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

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

    • 用super.构造方法(参数列表)访问父类构造方法

    super()调用父类构造方法
    • 子类默认构造器中默认调用父类无参构造器,且必须在第一行

    • super必须只能出现在子类的方法或构造方法中

    • super和this不能同时调用构造方法

    误区

    • 不要把super误认为是父类对象。在创建子类对象时, 不会创建父类对象,只会将父类中的信息加载到子类对象中存储。

    super & this

    • 代表的对象不同

      • this:本身调用者这个对象

      • super:代表父类对象的应用

    • 前提:

      • this:没有继承也可以使用

      • super:只能在继承条件时才可以使用

    • 构造方法:

      • this():本类的构造

      • super():父类的构造

    重写

    • 当父类方法满足于不了子类需求的时候,子类可以重写父类的方法,这种表现形式我们称之为方法的重写

      public class Father {
          String address="狗熊岭";
          String name="熊大";
          public void introduce(){
              System.out.println("我是熊大,我来自狗熊岭。");
          }
      }
      class Son extends Father{
          String name="熊二";
          String address="狗熊岭";
          public void introduce(){
              System.out.println("我是熊二,我来自狗熊岭。");
          }
      }
      class Test{
          public static void main(String[] args) {
              Father f1= new Father();
              Father f2 = new Son();
              f1.introduce(); 
              f2.introduce();
          }
      }

      运行结果

    • 重写只和非静态方法有关,且是public类型方法

    • 静态方法只和“B b = new A();”中等号左边的类型有关

    • 重写:需要有继承关系,子类重写父类方法

      • 方法名必须相同

      • 参数列表必须相同

      • 修饰符:范围可以扩大但不能缩小:public > protected > Default > private

      • 抛出的异常:范围可以缩小,但不能扩大

    • 重写,子类的方法和父类必须要一致,仅方法体不同

  3. 多态

    • 多态是指同一事物,在不同时刻表现出的不同种状态

    • 多态存在的三个必要条件

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

      (2)要有重写(前提条件)

      (3) 父类引用指向子类对象

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

      //当编译类型是父类,运行类型是子类时,被称为父类引用指向子类对象
      class Animal{}
      class Cat extends Animal{}
      class dog extends Animal{}
      Animal x = new Cat();//Animal的引用指向了Cat对象
    • 多态环境下对成员方法的调用:

      class Animal{
      void show() {
      System.out.println("Anmial");
          }
      }
      class Cat extends Animal{
      void show() {
      System.out.println("cat");
          }
      }
      ​
      Animal x = new Cat();
      x.show() //调用的是子类中的方法
      //编译看左边,运行看右边
    • 多态环境下对静态成员方法的调用:

      class Animal{
      static void show() {
      System.out.println(“Animal");
          }
      }
      class Cat extends Animal {
      static void show() {
      System.out.println(“Cat");
          }
      }   
      Animal x = new Cat()
      x.show() //调用的是动物类中的静态成员方法。
                         
      //编译和运行都看左边
    • 多态环境下对成员变量的调用

      class Animal{
      int num = 3;
      }
      class Cat extends Animal {
      int num = 4;
      } Animal x = new Cat()
      x.num; //调用的是动物类中的成员变量。
      //编译和运行都看左边  变量不存在被子类覆盖这一说法
    • 方法参数具有多态性

      class Animal{
      void eat() {}
          }
      class Cat extends Animal{
      void eat() {}
          }
      class Dog extends Animal{
      void eat(){}
          }
      //方法的形式参数类型是父类类型,而传递的实际参数可以是任意
      子类的对象
      method(Animal animal){
      animal .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 a = (Cat)x; //向下转型
          m.eat();
          m.look();//子父类中的方法都可以使用
      ​
      //向下转型的作用是:为了使用子类的特有方法

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

  4. final关键字

    • 当final修饰变量时,被修饰的变量必须被初始化(赋值),且后续不能修改其值,实质上是常量;

    • 当final修饰方法时,被修饰的方法无法被所在类的子类重写(覆写);

    • 当final修饰类时,被修饰的类不能被继承,并且final类中的所有成员方法都会被隐式地指定为final方法,但成员变量则不会变。

  5. 接口

    • Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)

    • 特点

      • 接口的结构与类完全相同。

      • 接口的访问控制修饰符与类一样, 但只有public和默认两种。

      • 接口的声明要使用关键字interface,声明类的关键字是class。

      • 接口中所有的方法都是抽象方法,默认的修饰符为“public abstrecr".在定义中可以省略。例如,“void eat ();” 表示定义了一个抽象方法eat ()。

      • 接口中所有的变量都是全局常量,默认的修饰符为“publice static final", 在定义中可以省略。例如,“int a=10;"表示定义了一个全局常量a。

      • 接口可以继承多个其他接口,即通过接口实现了多重继承。

      • 接口不能被实例化,接口中没有构造方法,需要通过一个类来实现接口中所有抽象方法,才能被实例化,这个类可以称为接口的实现类。实现接口使用关键字implements。

      • implements可以实现多个接口。

      • 实现接口必须重写接口中的方法。

      • 接口的本质是契约。

    • 案例:猫和狗(来自黑马程序员)

      需求:对猫和狗进行训练,他们就可以跳高了,这里加入了跳高功能。请采用抽象类和接口来实现猫和狗案例。并在测试类中进行测试。

      思路:

      1. 定义接口(Jumpping)

        成员方法:跳高();

      2. 定义抽象动物类(Animal)

        成员变量:姓名 ,年龄;构造方法:无参,带参;成员方法:get/set方法,吃饭();

      3. 定义具体猫类(Cat),继承动物类,实现跳高接口;

        构造方法:无参,带参;成员方法:重写吃饭(),重写跳高();

      4. 定义狗类(Dog),继承动物类,实现跳高接口;(略)

      5. 定义测试类,写代码测试。

      代码实现:

      Jumpping接口

      public interface Jumpping {
          void jump();
      }

      Animal类:

      public abstract class Animal {
          private String name;
          private int age;
      ​
          public Animal(){};
          public Animal(String name, int age) {
              this.name = name;
              this.age = age;
          }
      ​
          public String getName() {
              return name;
          }
      ​
          public void setName(String name) {
              this.name = name;
          }
      ​
          public int getAge() {
              return age;
          }
      ​
          public void setAge(int age) {
              this.age = age;
          }
          public abstract void eat();
      }

      Cat类:

      public class Cat extends Animal implements Jumpping{
          public Cat() {
          }
      ​
          public Cat(String name, int age) {
              super(name, age);
          }
      ​
          @Override
          public void eat() {
              System.out.println("猫吃鱼");
          }
      ​
          @Override
          public void jump() {
              System.out.println("猫可以跳高");
          }
      }

      Dog类:

      public class Dog extends Animal implements Jumpping{
          public Dog() {
          }
      ​
          public Dog(String name, int age) {
              super(name, age);
          }
      ​
          @Override
          public void eat() {
              System.out.println("狗吃骨头");
          }
      ​
          @Override
          public void jump() {
              System.out.println("狗可以跳高");
          }
      ​
      }

      AnimalDemo类(测试类):

      //测试类
      public class AnimalDemo {
          public static void main(String[] args) {
              Jumpping jumpping_C = new Cat();
              jumpping_C.jump();
              System.out.println("---------");
      ​
              Animal animal=new Cat();
              animal.setAge(17);
              animal.setName("加菲");
              System.out.println(animal.getName()+","+animal.getAge());
              animal.eat();
              ((Cat)animal).jump();
              System.out.println("---------");
      ​
              Cat cat = new Cat("加菲",17);
              System.out.println(cat.getName()+","+cat.getAge());
              cat.eat();
              cat.jump();
          }
      }

      运行结果(拿猫类举例子):

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值