封装继承多态


封装

封装(Encapsulation)就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。

封装的优点

  1. 减少代码耦合
  2. 便于修改,体高代码的可维护性
  3. 隐藏方法细节

Java封装的步骤

  • 使用private修饰符,表示最小的访问权限。

  • 对成员变量的访问,统一提供setXXX,getXXX方法

例:

public class Person{
    private String name;    //将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了
    private int age;
​
    public int getAge(){    //对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问
      return age;
    }
​
    public String getName(){
      return name;
    }
​
    public void setAge(int age){    //采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突
      this.age = age;
    }
​
    public void setName(String name){
      this.name = name;
    }
}

 

继承

在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的

继承优点

主要实现重用代码,节省开发时间。使代码更简洁,提高可维护性。

继承类型

需要注意的是 Java 不支持多继承,但支持多重继承。

封装继承多态

 

继承的特性

  • 子类拥有父类非 private 的属性、方法。

  • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。

  • 子类可以用自己的方式实现父类的方法
  • Java 的继承是单继承,但是可以多重继承
  • 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)

继承关键字

 extends ,java中所有的类都是继承于 java.lang.Object,当一个类没有继承的关键字时,默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类

super 与 this 关键字

super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

this关键字:指向自己的引用。

final 关键字

final 可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。

使用 final 关键字声明类,不能被继承,或者用于修饰方法,该方法不能被子类重写:

构造器

子类只是调用(隐式或显式)父类的构造器(构造方法或者构造函数)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。

如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

  例:

class SuperClass {
  private int n;
  SuperClass(){
    System.out.println("SuperClass()");
  }
  SuperClass(int n) {
    System.out.println("SuperClass(int n)");
    this.n = n;
  }
}
// SubClass 类继承
class SubClass extends SuperClass{
  private int n;
  
  SubClass(){ // 自动调用父类的无参数构造器
    System.out.println("SubClass");
  }  
  
  public SubClass(int n){ 
    super(300);  // 调用父类中带有参数的构造器
    System.out.println("SubClass(int n):"+n);
    this.n = n;
  }
}
// SubClass2 类继承
class SubClass2 extends SuperClass{
  private int n;
  
  SubClass2(){
    super(300);  // 调用父类中带有参数的构造器
    System.out.println("SubClass2");
  }  
  
  public SubClass2(int n){ // 自动调用父类的无参数构造器
    System.out.println("SubClass2(int n):"+n);
    this.n = n;
  }
}
public class TestSuperSub{
  public static void main (String args[]){
    System.out.println("------SubClass 类继承------");
    SubClass sc1 = new SubClass();
    SubClass sc2 = new SubClass(100); 
    System.out.println("------SubClass2 类继承------");
    SubClass2 sc3 = new SubClass2();
    SubClass2 sc4 = new SubClass2(200); 
  }
}

 

 

封装继承多态

 

接口

  接口是比抽象类更为抽象的 ,只有方法(全部是抽象方法)的声明没有方法的实现(由接口的实现类来实现)。

 接口优点

  • 1.类与接口是实现关系,一个类可以实现多个接口。
  • 2.对外提供规则(类似USB接口)
  • 3.降低了程序的耦合性(可以实现模块化开发,定义好规则,每个人实现自己的模块,提高了开发的效率)

定义接口(interface关键字)

public interface 接口名 {
    抽象方法1;
    抽象方法2;
    抽象方法3;
}

接口的实现(implements)

类似于继承

class 类 implements 接口 {
    重写接口中方法
}

接口中成员的特点

  • 可以定义变量,但是变量必须有固定的修饰符修饰,public static final 所以接口中的变量也称之为常量,其值不能改变
  • 可以定义方法,方法也有固定的修饰符,public abstract
  • 不可以创建对象(不能实例化)
  • 子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽象类
  • 一个类实现一个接口必须实现它所有的方法

接口与类

  • 类与类之间: 继承关系,一个类只能直接继承一个父类,但是支持多重继承
  • 类与接口之间: 只有实现关系,一个类可以实现多个接口
  • 接口与接口之间: 只有继承关系,一个接口可以继承多个接口

接口和抽象类的异同

  同:都不能实例化,都含有抽象方法

 

 

  异:接口只能有抽象方法,默认修饰符 public abstract 

    接口没有构造方法    

       抽象类可以有成员变量,也可以有常量,默认修饰符public static final

 

 

多态

多态是继封装、继承之后,面向对象的第三大特性。

现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态。多态就是同一个接口,使用不同的实例而执行不同操作

Java 作为面向对象的语言,同样可以描述一个事物的多种形态。如 Student 类继承了 Person 类,一个 Student 的对象便既是 Student,又是 Person。

多态存在条件:

  • 继承
  • 重写
  • 父类的引用变量(当变量指向一个对象时,这个变量就被称为引用变量)指向子类对象

  

public class Test {
    public static void main(String[] args) {
      show(new Cat());  // 以 Cat 对象调用 show 方法
      show(new Dog());  // 以 Dog 对象调用 show 方法
                
      Animal a = new Cat();  // 向上转型  
      a.eat();               // 调用的是 Cat 的 eat
      Cat c = (Cat)a;        // 向下转型  
      c.work();        // 调用的是 Cat 的 work
  }  
            
    public static void show(Animal a)  {
      a.eat();  
        // 类型判断
        if (a instanceof Cat)  {  // 猫做的事情 
            Cat c = (Cat)a;  
            c.work();  
        } else if (a instanceof Dog) { // 狗做的事情 
            Dog c = (Dog)a;  
            c.work();  
        }  
    }  
}
 
abstract class Animal {  
    abstract void eat();  
}  
  
class Cat extends Animal {  
    public void eat() {  
        System.out.println("吃鱼");  
    }  
    public void work() {  
        System.out.println("抓老鼠");  
    }  
}  
  
class Dog extends Animal {  
    public void eat() {  
        System.out.println("吃骨头");  
    }  
    public void work() {  
        System.out.println("看家");  
    }  
}

 

 

 

 

 

 

    

 

原创文章,作者:6024010,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/244719.html

(0)
上一篇 2022年4月17日 16:28
下一篇 2022年4月17日 16:28

相关推荐

发表回复

登录后才能评论