Java面向对象01:类与对象的关系、创建和初始化对象

Java面向对象01:类与对象的关系、创建和初始化对象

面向过程和面向对象的思想

面向过程思想

  • 线性思维,步骤清晰简单,第一步做什么,第二步做什么......
  • 面向过程适合处理一些较为简单的问题

面向对象思想

  • 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考,最后才对某个分类下的细节进行面向过程的思索。
  • 面向对象适合处理复杂的问题,适合处理需要多人协作的问题

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

什么是面向对象

  • 面向对象编程(Object-Oriented Programming,OPP)
  • 面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据
  • 抽象
  • 三大特性:
    • 封装
    • 继承
    • 多态
  • 从认识论角度考虑是先有对象后有类。对象是具体的事物。类,是抽象的,是对对象的抽象
  • 从代码运行角度考虑是现有类后有对象。类是对象的模板。

回顾方法及加深

方法的定义

  • 修饰符:如public、static等
  • 返回类型:如int、String等
  • break:跳出switch或结束循环;
  • return:结束方法,返回一个结果,void类型默认不用加return 实际可写成return;返回一个空值。
  • 方法名:注意规范,驼峰命名,见名知意
  • 参数列表:(参数类型,参数名)
  • 异常的抛出

方法的调用

  • 静态方法:带有static修饰符的方法,调用其他类的方法时,类名.方法名;同类下直接以方法名进行调用。

  • 非静态方法:不带有static修饰符的方法,调用时需要进行类实例化(new)

    类1:

    package com.lurenj.oop;
    
    public class Demo01 {
    
        public static void main(String[] args) {
            //静态方法
            Student.eat();//可以直接通过类名+方法名调用
            //非静态方法
            //实例化这个类 new
            //对象类型 对象名 = 对象值;
            Student student = new Student();
            student.say();
    
        }
    
        //static方法和类一起加载的
        public static void a(){
            b();
        }
        public static void b(){
            //c();报错不能正常调用,此时c未被实例化       
            Demo01 demo01 = new Demo01();
            demo01.c();//正常调用
        }
        public void c(){
          
        }
    
    }
    

    类2:

    package com.lurenj.oop;
    
    public class Student {
    
        //静态方法
        public static void eat(){
            System.out.println("学生吃饭了");
        }
    
        //非静态方法
        public void say(){
            System.out.println("学生说话了");
        }
    }
    
  • 形参和实参

  • 值传递和引用传递

    • 值传递
    package com.lurenj.oop;
    
    //值传递
    public class Demo02 {
        public static void main(String[] args) {
            int a = 1;
            System.out.println(a);//输出:1
    
            Demo02.change(a);
    
            System.out.println(a);//输出:1
    
        }
        //返回值为空
        public static void change(int a){//只是把形式参数设置为了
            a = 10;//执行到这一步时会将形参里的a变更为10
        }
    }
    
    • 引用传递
    package com.lurenj.oop;
    
    //引用传递:对象,本质还是值传递
    public class Demo04 {//一个类里只能有一个public class,class可以拥有多个
        public static void main(String[] args) {
    
            Person person = new Person();
            System.out.println(person.name);//null
            Demo04.change(person);
            System.out.println(person.name);//输出lurenj
        }
    
        public static void change(Person person){
            //person是一个对象:指向的是Person这个类 ---->Person person = new Person();这是个具体的人,可以改变属性
            person.name = "lurenj";
        }
    }
    
    //定义了一个Person类,有一个属性:name
    class Person{
        String name;//null
    }
    
  • this关键字

    • 当成员变量和局部变量重名时,在方法中使用this时,表示的是该方法所在类中的成员变量;
    public class Hello {
    
        String s = "Hello";
    
        public Hello(String s) {
    
           System.out.println("s = " + s);//输出为:HelloWorld!
    
           System.out.println("1 -> this.s = " + this.s);//输出为:Hello      
    
           this.s = s;//把参数值赋给实例变量,实例变量的值改变
    
           System.out.println("2 -> this.s = " + this.s);//输出为:HelloWorld!
    
        }
    
        public static void main(String[] args) {
    
           Hello x = new Hello("HelloWorld!");
    
           System.out.println("s=" + x.s);//验证实例变量值的改变,输出为:HelloWorld!    }
    
    }
    

    • 在构造函数中,通过this可以调用同一类中别的构造函数
    package com.lurenj.oop.demo02;
    
    public class HelloA {
        public static void main(String[] args) {
            A aaa = new A();
            aaa.print();
            B bbb = new B(aaa);
            bbb.print();
        }
    }
    class A {
        public A() {
            new B(this).print();// 调用B的方法
        }
        public void print() {
            System.out.println("HelloAA from A!");
        }
    }
    
    class B {
        A a;
        public B(A a) {
            this.a = a;
        }
        public void print() {
            a.print();//调用A的方法
            System.out.println("HelloAB from B!");
        }
    }
    

    输出结果为:

    HelloAA from A!
      
    HelloAB from B!
      
    HelloAA from A!
      
    HelloAA from A!
      
    HelloAB from B!
    

    • 使用this同事传递多个参数
    public class TestClass {
        int x;
        int y;
        static void showtest(TestClass tc) {//实例化对象
           System.out.println(tc.x + " " + tc.y);
        }
        void seeit() {
           showtest(this);
        }
        public static void main(String[] args) {
           TestClass p = new TestClass();
           p.x = 9;
           p.y = 10;
           p.seeit();
        }
    }
    

类与对象的关系

  • 类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一具体的事物
    • Person类、Pet类、Car类等,这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为
  • 对象是抽象概念的具体实例
    • 能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念,如张三就是一个人的一个具体实例,张三家的旺财就是狗的一个具体实例

我们可以将这些思想转换为代码实现

创建与初始化对象

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

Application类:

package com.lurenj.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.age = 3;
        System.out.println(xiaoming.name);
        System.out.println(xiaoming.age);
        
        xiaohong.name = "小红";
        xiaohong.age = 3;
        System.out.println(xiaohong.name);
        System.out.println(xiaohong.age);
    }
}

Student类:

package com.lurenj.oop.demo02;

//学生类
public class Student {
    //属性:字段
    String name;
    int age;

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

  • 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的,并且构造器有一下两个特点:
    • 必须和类的名字相同
    • 必须没有返回值类型,也不能写void
    • 构造器的作用:
      • 实例化初始值
      • 使用new关键词本质是在调用构造器(构造方法),因此必须要有构造器的存在
      • 定义有参构造器之后,如果想使用无参构造,就必须显示的定义一个无参构造
      • IDEA创建构造器快捷方式:Alt + Insert
package com.lurenj.oop.demo02;

//通过IDEA查看java文件编译后的.class文件内容
/*
    1.打开项目结构
    2.Modules下,选择添加一个根目录,把out目录添加进来
 */
public class Person {
    //一个类即使什么也不写,它也会存在一个方法
    //通过查看class文件发现默认添加了一个方法
    String name;
    //如下构造器,无参构造器
    public Person() { /* compiled code */
        //作用1:实例化初始值
        this.name = "lurenj";
        //作用2:使用new关键字,必须要有构造器,本质是在调用构造器
    }
    //有参构造器,一旦定义了有参构造,无参构造就必须显示定义
    public Person(String name){
        this.name = name;
    }

}


posted @   lurenj  阅读(150)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示