0119 面向对象

1、创建类的格式

public class 类名 {

    //可编写0至n个属性

    数据类型 变量名1;

    数据类型 变量名2;

    //可编写0至n个方法

    修饰符 返回值类型 方法名(参数){

      执行语句;

  }

}

例:创建一个汽车类

public class Car{

  //成员变量
  String color;
i  nt gulu;
  //成员方法
  public void run(){
    System.out.println("颜色为"+color+",轱辘个数为:"+gulu+"个的小汽车在跑");
  }

}

在创建一个测试类

public class Demo01 {

  public static void main(String[] args) {
    //创建汽车对象
    Car car=new Car();
    //赋值
    car.color="红色";
    car.gulu=4;
    //调用方法
    car.run();
  }
}

运行结果:

颜色为红色,轱辘个数为:4个的小汽车在跑

图解:

2、局部变量与成员变量的区别

(1)定义位置不同,成员变量在类中,局部变量是定义在方法中

(2)在内存中的位置不不同,成员变量随对象进堆,局部变量随方法进栈

(3)生命周期不同,成员变量随对象进堆,随着对象的消失而从堆中进jc垃圾回收机制,局部变量随方法进栈执行,执行完毕弹栈消失

(4)初始化不同,成员变量随对象进堆附默认值,局部变量没有默认初始化值

面向对象的特点:封装,继承,多态

3、封装

概念:隐藏了实现细节,并对外提供公共的访问方式

例:创建一个Person类

public class Person {
  private String name;
  private int age;
  //存值的方法
  public void setName(String n){
    name=n;
  }
  //取值
  public String getName(){
    return name;
  }
  //存值
  public void setAge(int n){
    if(n<0){
      System.out.println("年龄错误");
    }else{
      age=n;
    }
  }
  //取值
  public int getAge(){
    return age;
  }
  public void speak(){
    System.out.println("我叫"+name+"今年"+age+"岁。");
  }
}

创建一个测试类

public class Demo01 {

  public static void main(String[] args) {

    Person person=new Person();
    //调用赋值方法
    person.setName("小红帽");
    //调用取值方法
    System.out.println(person.getName());
    //调用赋值方法
    person.setAge(21);
    //调用取值方法
    System.out.println(person.getAge());
    person.speak();
  }

}

注:在该例子中,在Person类中对名字和年龄进行了封装,加了private关键字,加了之后,该属性只能在类中进行访问,在其他类中不可访问,

所以将这两个属性封装在了方法中,在其他类中调用该方法就能使用

封装this关键字

this关键字一般用来区分成员变量和局部变量重名的问题

this代表类对象本身,简单来讲就是哪个对象调用this,这个this就代表哪个对象

例:创建一个Person类

public class Person {
  private String name;
  private int age;
  //存值的方法
  public void setName(String name){
    this.name=name;
  }

注:该方法中的形式参数与Person类中的属性name 重名,则this.name就代表这个Person类对象的name,则等号右边的name代表该方法传入的参数

  //取值
  public String getName(){
    return name;
  }
  //存值
  public void setAge(int age){
    this.age=age;
  }
  //取值
  public int getAge(){
    return age;
  }
  public void speak(){
  System.out.println("我叫"+name+"今年"+age+"岁。");
  }

}

图解:

 

 

例:写一个方法用来比较两个人是否是同龄人

首先创建一个Person类

public class Person{

int age;

//判断两个人是否是同龄人
public boolean compare(Person p){
return this.age==p.age;
}

}

注:这个判断两个人是否是同龄的方法,前提是两个人类对象的年龄值是否相等,返回值是布尔类型

创建一个测试类

public class Demo02 {

  public static void main(String[] args) {
//创建两个人对象
  Person p1=new Person();
  p1.setName("公雪");
  p1.setAge(21);
  Person p2=new Person();
  p2.setName("海绵宝宝");
  p2.setAge(21);
  System.out.println(p1.compare(p2));

}

}

4、继承

子类可以自动继承父类所有可继承的属性和方法

格式:

class 子类 extends 父类 {}

例:创建一个Emp类

public class Emp {
  String name;
  public void work(){
    System.out.println("我叫"+name);
  }
}

创建一个子类开发部门类

public class KaiFa extends Emp {

}

创建一个测试类,在测试类内创建一个开发部门对象

public class Demo01 {

public static void main(String[] args) {
  KaiFa kf=new KaiFa();
  kf.name="张三";
  kf.work();
  }
}

运行结果:我叫张三;

继承注意事项:

java中类继承稚嫩和单继承,多个类可以继承一个父类,但一个类只能继承一个父类,可以多层继承,比如c继承b,b继承a

如果父类和子类拥有同样的方法名还有同样的属性,但属性值不同,则java采用就近原则,子类对象就会采用子类中的方法名和属性

例:

创建一个父类

public class Fu {
int a=1;
public void sleep(){
System.out.println("父类睡觉");
}
}

创建一个子类

public class Zi extends Fu{
int a=2;
public void sleep(){
System.out.println("子类睡觉");
}
}

创建一个测试类

public class Demo01 {
public static void main(String[] args) {
Zi z=new Zi();
System.out.println(z.a);
z.sleep();
}
}

此时运行结果为;

2
子类睡觉

继承 方法重写

关键字super,代表父类,例:super.show() 代表父类的show方法

方法重写举例:

创建一个父类:老年机类

public class OldPhone {

public void sendMassage(){
System.out.println("发短信");
}
public void call(){
System.out.println("打电话");
}
public void show(){
System.out.println("显示来电号码");
}

}

创建一个子类:新手机类

public class NewPhone extends OldPhone {
public void show() {
//super父类对象
super.show();
System.out.println("显示头像");
System.out.println("显示姓名");
}
}

注:子类中对父类的show方法进行了重写,在原本父类show方法的功能基础上添加了新的功能

创建一个测试类

public class Demo01 {

public static void main(String[] args) {
// TODO Auto-generated method stub
NewPhone p=new NewPhone();
p.call();
p.sendMassage();
p.show();
}
}

运行结果为:

打电话
发短信
显示来电号码
显示头像
显示姓名

方法重写注意事项:

子类方法覆盖父类方法,必须要保证权限大于等于父类权限

必须一模一样:方法的返回值类型 方法名 参数列表都要一样

方法重载:在同一个类中,方法名相同,参数列表,数量,类型,个数,只要有一个不同,这就叫方法的重载

方法重写:在子类中出现与父类,修饰符,返回值,方法名,参数列表一模一样的方法叫方法重写

posted @ 2021-01-19 11:07  公雪  阅读(94)  评论(0编辑  收藏  举报