面向对象的特点

一、面向对象的特点

1、封装

2、继承

3、多态

二、封装

1、封装的概念

将类中的成员(属性,方法,构造器) 设为private,只能在当前类的内部使用,外部无法访问。

2、企业的封装

主要用于属性的封装。

将属性设为私有的,提供公有的getter和setter方法来访问。

package com.fz;

public class Student {
// 封装属性,设为private
   private   int  num;
   private   String  name;

//   设置num属性的值
   public   void  setNum(int  num){
       if(num<0){
           return;
      }
       this.num=num;
  }

//   获取num属性的值
   public   int   getNum(){
       return   num;
  }

//   设置name属性的值
   public   void   setName(String  name){
       this.name=name;
  }

//   获取name属性的值
   public  String   getName(){
       return  name;
  }


//     封装方法
//   private   void   study(){
//       System.out.println("i like   study");
//   }
//     封装构造器
//   private   Student(){}
}
package com.fz;

public class Test {
   public static void main(String[] args) {

       Student  s= new  Student();

//       s.name="张三";
//       s.num=1001;
       s.setNum(1001);
       s.setName("zhangsan");

       System.out.println(s.getNum());
       System.out.println(s.getName());


  }
}

3、封装的优点

保证属性中的数据完整性。

保证属性的安全性。

三、继承

1、继承的概念

子类继承父类的属性和方法。

继承之后,在子类中就不需要再定义父类中的属性和方法。

2、继承的好处

减少重复代码的编写,提高了代码的重用性。

使用场景:

当你发现几个类中有重复的属性和方法时,将重复的属性和方法定义到父类中,其他类继承这个父类即可。

3、继承的实现

(1)语法

[修饰符] class 子类名 extends 父类名{

}

(2)案例

package com.jc;

public class Animal {
   public  String  name;
   public  String  type;

   public   void   eat(){
       System.out.println("eat");
  }

   public   void   sleep(){
       System.out.println("sleep");
  }
}
package com.jc;

public class Dog  extends  Animal{
//   public String name;
//   public String type;
//
//   public   void   eat(){
//       System.out.println("eat");
//   }
//
//   public   void   sleep(){
//       System.out.println("sleep");
//   }
}
package com.jc;

public class Cat extends   Animal{

}
package com.jc;

public class ManDog extends   Dog{

}
package com.jc;

public class Test {

   public static void main(String[] args) {

//       Dog   d=new Dog();
//       d.name="旺财";
//       d.type="中华田园犬";
//       System.out.println(d.name);
//       System.out.println(d.type);
//
//       d.eat();
//       d.sleep();

//       Cat   c=new Cat();
//       c.name="tom";
//       c.type="波斯";
//       System.out.println(c.name);
//       System.out.println(c.type);
//
//       c.eat();
//       c.sleep();

       ManDog   manDog=new ManDog();
       manDog.name="来福";
       manDog.type="哈巴狗";

       System.out.println(manDog.name);
       System.out.println(manDog.type);

       manDog.eat();
       manDog.sleep();


  }
}

4、子类的扩展

子类除了继承父类的属性和方法,还可以添加自己新的属性和方法。

子类比父类功能更强大。

package com.jc;

public class Dog  extends  Animal{
//   public String name;
//   public String type;
//
//   public   void   eat(){
//       System.out.println("eat");
//   }
//
//   public   void   sleep(){
//       System.out.println("sleep");
//   }

   public   void  bite(){
       System.out.println("咬人");
  }
}
package com.jc;public class ManDog extends   Dog{    public  String  sex;}
package com.jc;

public class Test {

  public static void main(String[] args) {

//       Dog   d=new Dog();
//       d.name="旺财";
//       d.type="中华田园犬";
//       System.out.println(d.name);
//       System.out.println(d.type);
//
//       d.eat();
//       d.sleep();

//       Cat   c=new Cat();
//       c.name="tom";
//       c.type="波斯";
//       System.out.println(c.name);
//       System.out.println(c.type);
//
//       c.eat();
//       c.sleep();

      ManDog   manDog=new ManDog();
      manDog.name="来福";
      manDog.type="哈巴狗";
      manDog.sex="公";

      System.out.println(manDog.name);
      System.out.println(manDog.type);

      manDog.eat();
      manDog.sleep();
      manDog.bite();


  }
}

5、继承的特点和范围

(1)继承特点

单继承:子类只能继承一个父类。

(2)多层次继承

A继承B,B继承C

C将属性和方法传给B,B再将属性和方法传给A。

(3)继承范围

子类只能继承父类的属性和方法,不能继承构造器!

同包下,只能继承非私有的属性和方法。(继承的受保护和缺省的属性和方法只能用在子类中或者和父类同包的类中使用。)

不同包下,只能继承公共的和受保护的属性和方法。(继承的受保护的属性和方法只能用在子类中或者和父类同包的类中使用。)

package com.jc.aa;

import javax.swing.*;

public class P {

  private   int   a=1;
  int   b=2;
  protected   int c=3;
  public   int d=4;


  private   void test1(){
      System.out.println(11);
  }

  void   test2(){
      System.out.println(22);
  }

  protected   void   test3(){
      System.out.println(33);
  }

  public   void   test4(){
      System.out.println(44);
  }
}
package com.jc.aa;

public class CC1 extends   P{


  public static void main(String[] args) {
      CC1 c1=new CC1();
//       System.out.println(c1.a);
      System.out.println(c1.b);
      System.out.println(c1.c);
      System.out.println(c1.d);

//       c1.test1();
      c1.test2();
      c1.test3();
      c1.test4();
  }
}
package com.jc.aa;

public class Test {

  public static void main(String[] args) {
      CC1 c1=new CC1();
//       System.out.println(c1.a);
      System.out.println(c1.b);
      System.out.println(c1.c);
      System.out.println(c1.d);

//       c1.test1();
      c1.test2();
      c1.test3();
      c1.test4();

  }
}
package com.jc.bb;

import com.jc.aa.P;

public class CC2 extends P {
  public static void main(String[] args) {
      CC2   c2=new CC2();
//       System.out.println(c2.a);
//       System.out.println(c2.b);
      System.out.println(c2.c);
      System.out.println(c2.d);

//       c2.test1();
//       c2.test2();
      c2.test3();
      c2.test4();
  }
}
package com.jc.bb;

public class Test2 {
  public static void main(String[] args) {

      CC2   c2=new CC2();
//       System.out.println(c2.a);
//       System.out.println(c2.b);
//       System.out.println(c2.c);
      System.out.println(c2.d);

//       c2.test1();
//       c2.test2();
//       c2.test3();
      c2.test4();


  }
}

6、方法的重写override

子类继承父类的方法,但是该方法无法满足子类的需求,我们可以重新定义该方法。这个过程叫方法的重写。

重写的原则:

方法名相同

参数相同(参数名无所谓)

返回值类型相同

访问修饰符>=父类的范围

重写之后,子类对象执行的重写的方法体!!!

package com.jc.cc;

public class Father {

  public String name;

  public   void eat(){
      System.out.println(name+" eat food");
  }

      void smoke(){
      System.out.println(name+" smoke sanhua");
  }
}
package com.jc.cc;

public class Son extends   Father{


  // 缺省 protected   public
  //方法的重写
  public   void smoke(){
      System.out.println(name+" smoke zhonghua");
  }

}
package com.jc.cc;

public class Test {
  public static void main(String[] args) {

      Son   s=new Son();
      s.name="小明";

      s.eat();
      s.smoke();


  }
}

7、super关键字

(1)super第一种用法

当子类中的属性和方法,与继承的父类的属性和方法重名了。

我们在子类中,直接访问是子类中定义的属性和重写的方法。

如果在子类中,我们想要访问父类被隐藏的属性和方法,需要使用super调用。

super.属性名

super.方法名(..)

super表示子对象super区!!

(2)继承的原理:

 

(3)super第二种用法

super表示父类构造器!!!

我们创建子类对象时,new 子类构造器:

//      调用子类构造器创建子类的对象:
//       创建一个子类的对象;
//       系统会先调用父类的构造器,默认调用父类无参的构造器,来创建对象的super区;
//       然后调用指定的子类构造器,来创建对象的this区;
//       返回对象的this区首地址

如果你不想使用父类无参构造器来构建super区,那么必须需要使用:super(实参)来指定。

如果调用的是父类无参构造器,使用super();,可以省略不写。

注意:super(..)必须是子类构造器中的第1条语句!!!

(4)案例

package com.jc.dd;

public class P {
   public String  name="张三";
   public int  age;

   public   void  eat(){
       System.out.println("eat");
  }

   public   void  smoke(){
       System.out.println("smoke   sanhua");
  }

   public   P(){
       System.out.println("我是我父类构造器");
  }

   public   P(int  i){
       age=i;
       System.out.println("我是我父类构造器:"+i);
  }
}
package com.jc.dd;

public class C extends    P{
   public  String  name="李四";
   public   String  sex;

   @Override
   public  void  smoke(){
       System.out.println("smoke zhonghua");
  }

   public   void  test(){
       System.out.println(name);
       smoke();

       System.out.println(super.name);
       super.smoke();
  }

   public   C(){
       //super();
       super(30);
       System.out.println("我是子类构造器");
  }

   public static void main(String[] args) {
//     调用子类构造器创建子类的对象:
//       创建一个子类的对象;
//       系统会先调用父类的构造器,默认调用父类无参的构造器,来创建对象的super区;
//       然后调用指定的子类构造器,来创建对象的this区;
//       返回对象的this区首地址
       C c=new C();
       c.test();
       c.eat();
       System.out.println(c.age);
  }

}

 

posted @ 2022-02-24 09:11  WhileGo  阅读(180)  评论(0)    收藏  举报