java对象

对象

面向过程,面向对象

  1. 面向过程,面向对象:

    面向过程思想:步骤清晰,第一步做什么,第二部做什么;

    面向对象:以分类的思维模式,思考解决问题需要哪些分类,适合处理复杂的问题。

    面向对象编程(OOP)的本质:以类的方式组织代码,以对象的组织(封装)数据。

    抽象:就是要把很多对象的共有的特点剥离抽取出来,再把它变成一个类。比如:studentmanager中学生都有的姓名,学号,班级,我们把很多学生的共同点剥离抽取出来,形成一个类,就叫做抽象(像)。

    三大特性:封装:把代码中的数据封装起来,对外留一个口让外部访问;

    继承:子类,父类;

    多态:一个类中不同对象执行同一个方法会得出不一样的结果。

    从认知论的角度考虑:先有对象,后有类。对象,是具体的事物(比如小明,小红);类是抽象的,是对对象的抽象(比如:人[小明,小红都属于人])。

    从代码的角度考虑:先有类,后有对象。类是对象的模板(比如用模具造东西)。通过new创建对象(关键字)。

    属性加方法构成一个类。

回顾方法的定义

代码一:

package oop.demo01;

public class Demo01 {

   //main方法 启动当前程序
   public static void main(String[] args) {

  }

   public String say(){
       return "sayhi";  
       System.out.println("1");   //无效的表达式,return代表方法已经结束了,已经得到返回值。
  }
   
   public void say1(){
       return;         //默认返回值为空
  }
   
   public int max(int a,int b){
       return a>b ? a : b;    //如果a>b,返回a,否则返回b。(三元运算符)
  }
}

break:跳出switch case;结束循环。continue:结束一次循环。

return:代表方法结束。

方法名:首字母小写,驼峰原则,见名知意。

参数列表:参数类型 参数名 (形参...)

异常抛出:后期更新。public void readFile(String file) throws IOException{}

数组下标越界:Arrayindexoutofbounds

回顾方法的调用

递归

代码二:

package oop.demo01;

public class Demo02 {
   public static void main(String[] args) {
       Student.say();    //静态static方法,直接通过类名.方法名进行调用
       //实例化这个类 new
       //new Student().say();   new 创建了Student这个类,并调用了say方法。
       //对象类型 对象名 = 对象值;(对象值变成了实例化对象这样一个过程) (与下一行一一对应)
       Student student = new Student();
       student.say();    //对象名.方法   非静态方法的调用
  }
   
   //同一类下的两个非静态方法,在这个类中可以互相调用
   //同一类下的两个静态方法,也可以互相调用
   //如果a是静态方法,b不是静态方法,a无法调用b方法,因为一个已经存在的东西去调用一个不存在的东西,所以不能调用。
   public static void a(){     //静态方法是和类一起加载的
       b();
  }
   
   public void b(){     //b方法是对象创建之后才存在,通过new,类实例化之后才存在
       
  }
}

Student类:

package oop.demo01;

public class Student {

   //静态方法
   public static void say(){
       System.out.println("学生说话了");
  }

   //非静态方法
   public void say(){
       System.out.println("学生说话了");
  }
}

代码三:形参和实参

package oop.demo01;

public class Demo03 {
   public static void main(String[] args) {
       Demo03 demo03 = new Demo03();
       //实际参数和形式参数的类型要一致
       int sum = demo03.sum(1,2);
       System.out.println(sum);
  }

   public int sum(int a,int b){
       return a+b;
  }
}

值传递和引用传递:

代码四:

package 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){   //main中的实参只是把1赋给形参中的a,形参中的a变成10,但并没有返回给main中的实参
       a = 10;
  }
}

代码五:

package oop.demo01;

//引用传递:一般是传递一个对象,本质还是值传递
public class Demo05 {
   public static void main(String[] args) {
       Person person = new Person();   //代表当前这人
       System.out.println(person.name);   //null
       Demo05.change(person);
       System.out.println(person.name);   //zhangsan
  }

   public static void change(Person person){
       //person是一个对象,指向的是Person这个类--->Person person = new Person();这是一个具体的人,所以可以改变属性(不是形参)。
       person.name = "zhangsan";    //指向的是Person类中的name,所以可以修改
  }
}

//一个类中只能有一个public class,可以有很多class
class Person{      //定义了一个Person类,有一个属性:name
   String name;
}

this关键字:代表当前这个类或者当前这个对象。

创建对象

类与对象的关系:类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但并不能代表某一具体事物。比如:动物(猫,狗都属于动物),手机(有很多种牌子)等。

对象是抽象概念的具体实例。比如:张三就是人的一个具体实例,张三家里的旺财就是狗的一个具体实例。而不是抽象的概念。

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

类是一个抽象的模板,通过new关键字可以创建不同的具体的实例,可以把世界上所有人都想成是一个人的模板。Person-->身高,体重,年龄,对世界进行抽象化

代码一:Application

package oop.demo01.demo02;

//一个项目应该只存在一个main方法
public class Application {
   public static void main(String[] args) {

       //类:抽象的,把它实例化
       //类实例化后会返回一个自己的对象
       //所以student对象就是一个Student类的具体实例。
       Student student = new Student();   //new Student()就是这个类就被实例化了,实例化之后会产生一个返回结果。
       Student xiaoming = new Student();   //同一个类可以产生不同的对象。但都有共同的特性。比如:都有名字,年龄。
       xiaoming.name = "小明";
       xiaoming.age = 3;
       System.out.println(xiaoming.name);
       System.out.println(xiaoming.age);
       System.out.println(student.name);
  }
}

代码二:Student

package oop.demo01.demo02;

//一个程序只有一个主启动类main
public class Student {

   //属性:字段
   String name;  //默认是null,抽象的概念,不应该被写死,String name = xiaoming;
   int age;     //默认是0

   //方法:
   public void study(){
       System.out.println(this.name+"在学习"); //当前这个类的指向名字学生在学习
  }
}

构造器详解:类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的,并且有两个特点:一是必须和类的名字相同;二是必须没有返回类型,也不能些void。

代码一:

package oop.demo01.demo02;
//java文件-->class文件
public class Person {
   //显示的定义构造器
   String name;
   //构造器可以实例化一些对象的初始值
   //1.使用new关键字,必须要有构造器,本质是在调用构造器
   //2.构造器一般用来初始化值
   public Person() {    //默认加了个方法,还没有返回值;方法名和类名相同 (无参构造器)
      this.name = "zhangsan";    //实例化就是一个方法,构造器(方法)走完了,然后Person person = new Person();这句话才生成对象
  }                    //一个类即使什么都不写,也会存在一个方法,这个方法就叫做构造器(构造方法)。

   //有参构造:一旦定义了有参构造,如果想使用无参构造,无参就必须显示定义,否则无参方法无效。 (重载)
   public Person(String name){
       this.name = name;   //前面的this.name代表对象本身的name(上面这个类的),后面的name代表形参String name传递下来的name。
  }

   //alt+insert 生成构造器 一键生成
   //选择constructor-->choose field to initalize by constructor-->nameString-->ok;无参的话直接select none。
}

代码二:

package oop.demo01.demo02;

//一个项目应该只存在一个main方法
public class Application {
   public static void main(String[] args) {
       //new 实例化了一个对象
       Person person = new Person();  //直接进入public Person() {}方法   (调无参方法)
       Person zhangsan = new Person("zhangsan");   //通过new关键字去调相应的构造方法(调有参方法)
       System.out.println(person.name);  //zhangsan
  }
}

创建对象内存分析

1

代码一:

package oop.demo01.demo03;

public class Application {      //程序运行是要加载一些程序运行的模板
   public static void main(String[] args) {
       Pet dog = new Pet();  //new了这个对象,调用了Pet类中的无参构造,生成了这个对象Pet dog。(对象的模板加载进来,之后生成一个具体的对象dog)(生成模板给的返回值,给新的对象)
       dog.name = "旺财";     //对这些属性赋值
       dog.age = 3;
       dog.shout();

       System.out.println("dog.name");
       System.out.println("dog.age");
  }
}

代码二:

package oop.demo01.demo03;

public class Pet {
   public String name;
   public int age;   //public权限较高
   //存在一个无参构造

   public void shout(){
       System.out.println("叫了一声");
  }
}

总结类与对象

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

  2. 方法:定义,调用

  3. 对象的引用:

    引用类型:除去基本类型(8大基本类型)之外的都可以称为引用类型。

    对象是通过引用来操作的(引用:指向对象的地址),引用栈里面的对象,真实的东西指向到堆里。

  1. 属性:field字段 也叫成员变量;默认会初始化;数字:0,0.0 char:u0000 boolean:false 引用:null。

    定义方式:修饰符 属性类型 属性名 = 属性值。

  1. 方法:避免方法死循环

  2. 对象的创建和使用:必须使用new关键字创造对象,构造器; Person zhangsan = new Person(); (new了这样一个人,这个人肯定有构造方法,它会返回一个人这个对象,这个对象的名字随意取)

对象的属性: zhangsan.name

对象的方法:zhangsan.sleep();

7. 类:只能写这两个东西:静态的属性 属性;动态的行为 方法。

posted @ 2021-01-27 15:50  爱罗翔的张三  阅读(97)  评论(0编辑  收藏  举报