java学习-面向对象的三个特征

面向对象三大特性

1. 封装

概念:隐藏对象内部的实现细节,控制对象中属性的访问和修改权限。

访问修饰符: private(仅本类可见)

class FengZhuang {
   private int age;
   
   public int getAge() {
       return this.age;
  }
   
   public void setAge(int val) {
     if(val > 0 && val < 120) {
         this.age = val
    } else {
         this.age = 18
    }
  }
}  
  1. 隐藏类内部实现过程

  2. 设置属性值时,可以有效的过滤无用值

 

2. 类的继承

  • 子类可以使用父类中的属性和方法,子类也可以定义自己的属性和方法。

  • 既可以提高代码的复用性,也可以提高代码的可扩展性。

  • java是单继承,一个类只能有一个父类,但是可以多级继承。属性和方法也会逐级叠加。

    子级如何访问爷爷级的重用的属性和方法呢

 

不可继承:

  • 构造方法:只负责创建本类,不可继承。

    • 构造方法的特点:名称与类名相同,且不能写类型

      class Test {
         public Test() {...}
         // public void Test() {...} 错误
      }
  • 访问修饰符:

     

    private修饰的属性和方法仅本类可见;default仅同包父子类可见;

 

父子类中方法的重写和覆盖:

当父类中提供的方法无法满足子类的需求时,可在子类中定义与父类相同的方法进行重写

  • 重写原则:方法名称、参数列表、返回值类型必须与父类相同;访问修饰符可等于或比父类更宽泛。(否则可能会报错)

    public class TestExtends {
     public static void main(String[] args) {
       B b = new B();
       b.upload();
    }
    }

    class A {
     public void upload() {
       System.out.println("print function in A");
    }
    }

    class B extends A {
     public void upload() {
       System.out.println("print function in B");
    }
    }

    如果想在子类中访问父类的方法或属性(包括被重写的),可以使用super.的形式。

     

继承的对象构建过程:

 

super、构造函数和this:

  • super与this访问属性

    class A {
     int a = 1;
    }

    class B {
     int a = 2;
     public void print() {
       int a = 3;
       System.out.println(a);  // 3
       System.out.println(this.a);  // 2 (this.访问本类的属性和方法)
       System.out.println(super.a);  // 1 (super.访问父类的属性和方法)
    }
    }
  • super和构造函数

    class AS {
     public AS() {
       System.out.println("AS");
    }

     public AS(int age) {
       System.out.print("AS-");
       System.out.print(age);
       System.out.println();
    }
    }

    class BS extends AS {
     public BS() {
       super();
       System.out.println("BS");
    }

     public BS(int age) {
       super(age + 1);
       System.out.print("BS-");
       System.out.print(age);
       System.out.println();
    }
    }
    1. 在构造函数中通过super()调用父类的构造方法(通过传参或不传参可以控制执行AS的哪一个构造方法)

    2. super或this如果使用在构造函数中,必须放在首行;

    3. 子类中如果使用了this()/this(实参)就不能在调用super。(在构造函数中调用this()会报递归调用的错,那什么情况下可以调用

    4. 在子类构造函数中如果没有调用super,则默认执行super();

 

3. 多态

概念:父类引用指向子类对象,从而产生多种形态。

   Animal a = new Dog()
// 引用类型------对象类型
  1. Animal和Dog要有直接或者间接的继承关系。

  2. 父类引用仅可以调用父类所声明的属性和方法,不可调用子类独有的属性和方法 。

 

多态的作用:

  1. 屏蔽子类间的差异。

  2. 灵活、耦合度低。

 

多态中方法的重写

  • 实际运行过程中依旧遵循重写原则。既amt.fn()的执行结果BMT中方法的执行结果

  • 子类中独有的方法不能在父类引用对象中调用。既amt.fnB()会报错。

class MultiType {
 public MultiType() {
   AMT amt = new BMT();
   amt.fn();   // fn in BMT
   // amt.fnB(); // 或报错
}
}

class AMT {
 public void fn() {
   System.out.println("fn in AMT");
}
}

class BMT extends AMT {
 public void fn() {
   System.out.println("fn in BMT");
}
 public void fnB() {
   System.out.println("fn in BMT only");
}
}

 

应用场景:

  1. 使用父类作为方法形参实现多态,使方法的参数类型更为宽泛。

  2. 使用父类作为方法返回值实现多态,使方法可以返回不同子类对象。

  3. 向上转型(装箱)

  4. 向下转型(拆箱)

  5. 向下转型中的异常

  6. instanceof

posted on 2022-05-18 14:37  妖娆的油条2号  阅读(57)  评论(0编辑  收藏  举报

导航