Day14:面向对象

面向对象编程(oop)

面向过程&面向对象

面向过程思想

步骤清晰简单,第一步做什么,第二步做什么......

面对过程适合处理一些较为简单的问题

面向对象思想

物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索

面向对象适合处理复杂的问题,适合处理需要多人协作的问题!

 

对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。

 

属性 + 方法 =类

 

什么是面向对象

面向对象编程(object-Oriebted Programming,OOP)的本质就是:以类的方式组织代码,以对象的形式封装数据

抽象:把很多数据的共同点抽取出来构成一个类。

三大特性:

封装:把数据包装起来

继承:子类继承父类

多态:同一个事物会有多种形态

从认识的角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对 对象的抽象

从代码运行角度考虑是先有类后有对象。类是对象的模板

回顾方法的调用


package com.oop.demo01;


import java.io.IOException;

//Demo01 类
public class Demo01 {

   //main方法
   public static void main(String[] args) {

  }
   /*
   修饰符   返回值类型   方法名(...){
       //方法体
       return 返回值;
   }
    */
   public String sayHello(){
       return "hello,world";
  }
   public  void hello(){
       return;
  }

   public int max(int i,int j){
       return  i > j ?i:j;//三元运算符!
  }
   //break:跳出switch,结束循环
   //return:结束方法   返回一个结果
   //方法名:注意规范就ok 首字母小写和驼峰原则   见名知意
   //抛出异常
   public void readFile(String file) throws IOException{

  }
}

静态和非静态:区别在于加不加static


//静态方法
public static void say(){
   System.out.println("学生说话了");
}
//非静态方法
public void say1(){
   System.out.println("学生说话了");
}
  • 类变量/类方法 要加static 静态的 在另一个类里可以通过类名直接调用

  • 实例变量/非静态方法 不加static 不能直接调用,必须new一个对象,通过对象调用


//在另一个类调用
public static void main(String[] args) {
   Student.say();
   //实例化这个类 new
   //对象类型 对象名 = 对象值;
   Student student = new Student();
   student.say1();
   int i =student.i;
}

特殊情况:


public void a(){
    b();
}
public void b(){

}

上边这种情况是ok的


public static void a(){
    b();
}
public static void b(){

}

上边这种情况也是Ok的


package com.oop.demo01;

public class Demo02 {
   //静态方法 static
   public static void main(String[] args) {
       Student.say();
       //实例化这个类 new
       //对象类型 对象名 = 对象值;
       Student student = new Student();
       student.say1();
       int i =student.i;
  }
   //static 是和类一起加载的
   public static void a(){
        b();
  }

   //类实例化之后才存在
   public  void b(){

  }
}

但是这种调用是不行的,因为static 是和Demo02类一起加载的,故a()方法是和Demo02类一起加载的。而类实例化之b()方法才存在,所以一个已经存在的不能调用不存在的

形参实参


package com.oop.demo01;

public class Demo03 {
   public static void main(String[] args) {
       //实际参数和形式参数的类型要对应!!
       int add =Demo03.add(1,2);
       System.out.println(add);
  }
   public static int add(int a,int b){
       return a+b;
  }
}

值传递和引用传递

值传递:


package com.oop.demo01;

//值传递
public class Demo04 {
   public static void main(String[] args) {
       int a = 1;
       System.out.println(a);//1

       Demo04.change(a);
       System.out.println(a);//1
  }

   //返回值为空
   public static  void change(int a){
       a = 10;
  }
}

//引用传递


package com.oop.demo01;


//引用传递:传递对象,本质还是值传递
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 person = new Person();这是一个具体的人,可以改变属性
      person.name = "安言";
  }

   //定义了一个Person类,有一个属性:name
   static class Person{
      String name;//null
  }
}

类和对象的关系

类是一种抽象的数据类型,它是对某一类事物整体描述/定义的,但是并不能代表某一个具体的事物,是抽象的概念

例如:动物、植物、手机、电脑.....

Person类,Pet类、Car类等,这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为

 

对象是抽象概念的具体实例

张三就是人的一个具体实例,张三家里的旺财就是狗的具体实例

能够体现出特点,展现出功能的是具体的实例而不是一个抽象的概念

 

 

类是创造具体的实例,也即对象的模板

对象是由类这一抽象模板创造出来的具体实例

 

创建与初始化对象

使用new关键字创建对象

使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。


//类来组织代码
package com.oop.demo02;

//学生类
public class Student {


   //属性:字段
   String name;//默认是null
   int age;//默认0

   //方法
   public  void study(){
       System.out.println(this.name+"在学习");
  }
}


//对象来封装数据
package com.oop.demo02;

//一个项目应该只存在一个main方法
public class Application {
   public static void main(String[] args) {
      //类:抽象的,实例化
       //类实例化后会返回一个自己的对象!
       //student对象就是一个Student类的具体实例
       Student student = new Student();
       Student xiaoming= new Student();
       Student xiaohong = new Student();

       xiaoming.name = "xiaoming";
       xiaoming.age = 3;
       System.out.println(xiaoming.name);
       System.out.println(xiaoming.age);

       System.out.println(xiaohong.name);

  }
}

类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下两个特点:

  1. 必须和类的名字相同

  2. 必须没有返回类型,也不能写void


package com.oop.demo02;

//java--->class
public class Person {
   //一个类即使什么都不写,他也会存在一个方法
   public Person(){
       
  }
}

不写也可以!!!


Person person = new Person();
System.out.println(person.name);

在主方法里的执行过程:

先new一个person对象,然后回到Person类里面的Person()方法,执行完Person()方法就回到了主方法里,然后输出。


package com.oop.demo02;

//java--->class
public class Person {
   //一个类即使什么都不写,他也会存在一个方法
   String name;


   //实例化初始值
   //1.使用new关键字,本质是在调用构造器
   //2.用来初始化值
   public Person(){
       this.name = "安言";
}

 //有参构造:一旦定义了有参构造,无参就必须显示定义
   public Person(String name){
       this.name = name;
  }

   //alt+insert 快捷键生成构造器

}



/*
public static void main(String[] args) {

       //new 实例化了一个对象
       Person person = new Person();
       System.out.println(person.name);
   }

   构造器:
   1.和类名相同
   2.没有返回值
   作用:
   1.new 本质在调用构造方法
   2.初始化对象的值
   注意点:
   1.一旦定义了有参构造,无参就必须显示定义

   Alt+insert

   this. =   this当前对象
*/


 

总结:

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

2.方法 定义、调用!

3.对应的引用 引用类型: 基本类型(8):byte int short long float double char boolean 对象是通过引用来操作的:栈---->堆

4.属性:字段Field 成员变量 默认初始化: 数字:0 0.0 char : u0000 boolean: false 引用:null 修饰符 属性类型 属性名 = 属性值!

5.对象的创建和使用 必须使用new 关键字创造对象,构造器 Person anyan =new Person(); 对象的属性 anyan.name 对象的方法 anyan.sleep()

6.类 静态的属性 属性 动态的行为 方法

 

 

上一篇:java之反射技术


下一篇:Java解决约瑟夫问题的代码