面向对象编程:方法调用、值和引用传递、构造器、封装、继承、多态跟强制转换

面向对象编程

回顾方法的调用

如果方法没有static,则需要实例化一个对象 (也就是new一个对象):

public class Demo03 {
   public static void main(String[] args) {
       Demo03 demo03 = new Demo03();
       int f = demo03.add(2,3);
       System.out.println(f);
  }
   public int add(int a,int b){
       return a+b;
  }

如果有static,直接用类.方法就可以了:

   int g=Demo03.add(2,3);
       System.out.println(g);
  }
   public static int add(int a,int b){
       return a+b;
      }
值传递跟引用传递

值传递并不会改变main函数里的数的值

public class Demo04 {
   public static void main(String[] args) {
       int a = 1;
       System.out.println(a);
       Demo04.change(a);
       System.out.println(a);
  }

   public static void change(int a){
          a=10;
  }
}
输出为   1
       1

引用传递是一个对象,可以改变属性

public class Demo05 {
   public static void main(String[] args) {
       Person person = new Person();
       System.out.println(person.name);
       Demo05.change(person);
       System.out.println(person.name);
  }
   public static void change(Person person){
       ///person是一个对象,可以改变属性!
       person.name="荣哥";
  }
}
//定义了一个Person类,有一个属性:name
class Person{
   String name; //默认null
}
输出为: null
      荣哥
构造器

如果子类和父类都有无参构造器,当用子类创建对象时父类会先自动new一个无参构造器并且先输出父类的无参构造器,然后在输出子类的无参构造器。

如果调用子类的有参构造器,还是会先输出父类的无参构造器,然后在输出子类的有参构造器

构造器

  1. 和类名相同

  2. 没有返回值

作用:

  1. new 本质是在调用构造方法

  2. 初始化对象的值

注意点:

  1. 定义有参构造之后,如果想使用无参构造,显示的定义一个无参的构造

    alt + Insert 生成构造器快捷键

public class Person {
   //一个类即使什么都不写,他也会存在一个方法
   //显示的定义构造器
   String name;
   //实例化初始值
   //1.使用new关键字,本质是调用构造器
   //2.构造器用来初始化值
   public Person(){} //与类型相同,并且没有返回值(无参构造)
   //有参构造:一旦定义了有参构造,无参构造必须显示定义
 // 即定义了有参构造后无参构造必须为空
       public Person(String name){
           this.name = name;
      }
}
public class Application01 {
   public static void main(String[] args) {
       //实例化一个对象
       Person person = new Person();//没赋值参数就会调用上面无参的构造方法输出结果为null,如果有赋值则调用有参构造方法。
       System.out.println(person.name);
  }
}
面向对象小结
  1. 类与对象:

    类是一个模板:抽象,对象是一个具体的实例

  2. 方法:

    定义、调用

  3. 对象的引用

引用类型:基本类型(8种)

对象是通过引用来操作的:栈--->堆

  1. 属性:字段Field 成员变量

默认初始化:

数字: 0 0.0

char: u0000

boolean: false

引用: null

修饰符: 属性类型 属性名 = 属性值

  1. 对象的创建和使用

    • 必须使用new关键字来创建对象,构造器

      person rong = new Person();

    • 对象的属性 rong.name;

    • 对象的方法 rong.sleep();

  2. 类:

静态的属性 属性

动态的行为 方法

封装

属性私有,get/set

意思是如果定义的属性是私有的(private),则需要通过get和set方法获取这个数据,代码如下:

public class Student {
   private String name; //名字
   //get获得这个数据
   public String getName(){
       return this.name;
  }
   //set给这个数据设置值
   public void setName(String name){
       this.name = name;
  }
public class StuApplication {
   public static void main(String[] args) {
       Student student = new Student();
       student.setName("荣哥");
       System.out.println(student.getName());
  }
}
//alt+insert快捷键可以给出set跟get方法
继承

私有的东西无法被继承(即如果父类是私有private的,子类不能继承)

如果子类和父类都有无参构造器,则默认先调用父类的无参构造器,然后在调用子类的,系统会默认在子类的无参构造器第一行加上super();,super()的作用是默认调用父类的无参构造器

//以下为父类的无参构造器,super()可以不用写,系统会自动加
   public Student() {
       super();
       System.out.println("fulei");
  }

如果在想调用自己类中的有参构造器,则this();需要放在无参构造器的第一行,也就是this()和super()只能出现一个。

重写

public static void main(String[] args) {
   //对象能执行哪些方法,主要看对象左边的类型(即对象最左边类里有没这个方法),与右边关系不大
       A a = new A();
       a.test();
       //父类的引用指向了子类
       B b = new A();//虽然执行的是子类重写的方法,如果父类把这个方法去掉,即使子类还在但是执行不了
       b.test();
  }

public class A extends B {
  // @Override 重写
   public void test() {
       System.out.println("A");
  }
   
public  class B {
   public void test(){
       System.out.println("B");
  }
此时输出为  A
           A
   
如果在两个void前面加上static,就变成静态方法了,
则输出为: A
         B

解释如下:

多态

多态注意事项:

  1. 多态是方法的多态,属性没有多态

  2. 父类和子类,有联系,类型转换异常!ClassCastException!

  3. 存在条件:继承关系,方法需要重写,父类引用指向子类对象! Father f =new Son();

    不能重写的方法:

    • static 方法,属于类,它不属于实例

    • final 常量

    • private 方法

强制转换

父类没有go方法,如果使用student.go()就会报错,因为student是Person创建出来的,所以只有将student对象强制转为Student类型(也就是将父类转为子类)就能调用go()方法了,转换形式如上

 

 

posted @ 2021-05-14 15:21  敲代码的体育生  阅读(94)  评论(0)    收藏  举报