25
2020
09

java封装,继承

    Java封装在面向对象程式设计方法中是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法,封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。

实现Java封装的步聚:修改属性的可见性来限制对属性的访问一般限制为private,

public class Person {    private String name;  

   private int age;

}

    这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了

对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问

创建一个EncapTest.java 文件

public class EncapTest{   private String name;   private String idNum;   private int age;   public int getAge(){      return age;   }   public String getName(){      return name;   }   public String getIdNum(){      return idNum;   }   public void setAge( int newAge){      age = newAge;   }   public void setName(String newName){      name = newName;   }   public void setIdNum( String newId){      idNum = newId;   }}

public方法是外部类访问该类成员变量的入口,通常情况下,这些方法被称为getter和setter方法何要访问类中私有成员变量的类都要通过这些getter和setter方法

创建RncapTest类来访问EncapTest.

public class RunEncap{   public static void main(String args[]){      EncapTest encap = new EncapTest();    

     encap.setName("James");    

      encap.setAge(20);      

     encap.setIdNum("12343ms");

     System.out.print("Name : " + encap.getName()+ "/n"                             " Age : "+ encap.getAge());  

 }

}

运行结果为:blob.png


继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类,继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为

生活中的继承比如:兔子和羊属于食草动物类,狮子和豹属于食肉动物类,食草动物和食肉动物又是属于动物类,虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性

结论:所有继承符合的关系是父类更通用,子类更具体

类的继承格式 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的:class 父类 {

} class 子类 extends 父类 {

}

为什么需要继承,下列动物分别为企鹅以及老鼠

企鹅:属性(姓名,id),方法(吃,睡,自我介绍)

老鼠:属性(姓名,id),方法(吃,睡,自我介绍)

企鹅类:

public class Penguin {    private String name;    private int id;    public Penguin(String myName, int  myid) {        name = myName;        id = myid;    }    public void eat(){        System.out.println(name+"正在吃");    }    public void sleep(){        System.out.println(name+"正在睡");    }    public void introduction() {     System.out.println("大家好!我是"         + id + "号" + name + ".");    }

}

老鼠类:

public class Mouse {    private String name;    private int id;    public Mouse(String myName, int  myid) {        name = myName;        id = myid;    }    public void eat(){        System.out.println(name+"正在吃");    }    public void sleep(){        System.out.println(name+"正在睡");    }    public void introduction() {      System.out.println("大家好!我是"         + id + "号" + name + ".");    }

}

从上面这两段代码中存在重复了,导致后果就是代码量大,,所以要从根本上解决这两段代码的问题,就需要继承,将两段代码中相同的部分提取出来组成 一个公共父类:

公共类:

public class Animal {    private String name;      private int id;    public Animal(String myName, int myid) {        name = myName;

       id = myid;    

}

   public void eat(){ t        System.out.println(name+"正在吃");    }    public void sleep(){        System.out.println(name+"正在睡");    }    public void introduction() {  System.out.println("大家好!我是"         + id + "号" + name + ".");    }

}

上面代码写Animal类就可以作为一个父类,然后企鹅类和老鼠类继承这个类之后,就具有父类当中的属性和方法,子类就不会存在重复的代码,维护性也提高,代码也更加简洁,提高代码的复用性(复用性主要是可以多次使用,不用再多次写同样的代码) 继承之后的代码:

企鹅类:

public class Penguin extends Animal {    public Penguin(String myName, int myid) {        super(myName, myid);    }

}

老鼠类:

public class Mouse extends Animal {    public Mouse(String myName, int myid) {        super(myName, myid);    }

}



public class  qie {

     public static void main(String[] args) {

    Penguin encap = newPenguin("笨笨", 123);

    encap.eat();

    encap.sleep();

    encap.introduction();

}

}


public class  laoshu {

     public static void main(String[] args) {

    Mouse encap = new Mouse("小小", 12);

     encap.eat();

     encap.sleep();

     encap.introduction();

}

}

继承类型

Java 不支持多继承,但支持多重继承

单继承

class B→classA

public class A {....}

public class B extends A{...}

多继承

class c→class B→classA

public class A {....}

public class B extends A{...}

public class C extends B{...}

不同类继承同一个类

class B→classA

class c↗

public class A {....}

public class B extends A{...}

public class Cextends A{...}

继承的特性:子类拥有父类非 private 的属性、方法;子类可以拥有自己的属性和方法,即子类可以对父类进行扩展;子类可以用自己的方式实现父类的方法;ava 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类;提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)

继承关键字:继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类

extends关键字:类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类

public class Mouse extends Animal {    public Mouse(String myName, int myid) {        super(myName, myid);    } }

 implements 关键字:使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口

//定义Bread接口

public interface Bread{

  //定义一个方法吃面包(接口中没有具体的实现方法体)

  public void eatBread();

}

//Bread接口的实现类

public class BreadImpl implements Bread{

   //实现eatBread方法(接口的实现类中需要有具体的方法体)

   public void eatBread(){

     System.out.println("吃面包");

   }

}


public interface Milk{

  //定义一个方法喝牛奶

  public void drinkMilk();

}

//Bread接口的实现类

public class MilkImpl implements Milk{

   //实现eatBread方法(接口的实现类中需要有具体的方法体)

   public void drinkMilk(){

     System.out.println("喝牛奶");

   }

}



多重实现:依照上面定义的接口进行多重实现

public class Man implements Bread,Milk{

  //实现了Bread接口中eatBread方法

  public void eatBread(){

     System.out.println("吃面包");

   }

//实现了Milk接口中drinkMilk方法

  public void drinkMilk(){

     System.out.println("喝牛奶");

   }

}

接口可以被多重实现(implements),抽象类只能被单一继承(extends)

super关键字和this关键字;

属性的区别:this访问本类中的属性,如果本类没有此属性则从父类中继续查找。super访问父类中的属性。
方法的区别:this访问本类中的方法,如果本类没有此方法则从父类中继续查找。super访问父类中的方法。
构造的区别:this调用本类构造,必须放在构造方法的首行。super调用父类构造,必须放在子类构造方法首行。

this. 变量和super.变量:this.变量 调用的当前对象的变量而super.变量 直接调用的是父类中的变量

public class Dog extends Animal {  public void eat() {    System.out.println("dog : eat");  }   public void eatTest() {    this.eat();   // this 调用自己的方法    super.eat();  // super 调用父类方法  }

}

public class Test {  public static void main(String[] args) {    Animal a = new Animal();  

       a.eat();

     Dog d = new Dog();  

    d.eatTest();

 }

}

运行结果为:

animal : eat

dog : eat

animal : eat


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。