类与对象

## 类与对象


1、面向对象 三大特征

  • 封装、继承、多态

2、类 和 对象

  • 什么是类?
    • 答:抽象的概念,一个模板,现实世界不存在。对象则是实际存在的个体。类就是一个模板,对象就是根据模板创建出来的个体。类中描述的是所有对象的共同特征。
    • 对象还有另一个名字叫实例。
    • 通过类可以实例化一个对象。

3、类的定义

  • 语法格式:修饰符 class 类名{
    类体 = 属性+方法;
    }
    修饰符列表可以省略。

    • 属性:在代码上以 变量 形式存在的。因为属性 是以 数据类型存在的。
    • public class Student{
      	String name;
      	int age;
      	int num;   //学号
      	boolean sex;
      	String address;  //这些都是属性,又叫做成员变量。
      }  
      
  • 创建对象的语法:new 类名(); new是一个运算符,专门用来对象的创建。

    • Student s = new Student(); // int a = 1; 道理是一样的

    • java 中所有的类 都是 引用数据类型。

      • Student 既是一个类,也是一个引用数据类型。
      • 即类名 就是一种引用 数据类型。
    1. 对象的创建和使用
    • 堆内存中存储对象以及对象的实例变量。
    • 凡是new 运算符出来的对象,都存储在堆中。
    • 像 s 这种保存了对象地址的变量叫做引用。
    例如:Student s = new Student();
    
    1. 怎么访问实例变量
    • 语法:引用.实例变量名
    • 通过赋值方式将内存中的实例变量修改
    public class User{
        int id; //用户id
        String name;
        String password;
    }
    
    public class UserTest{
        public static void main(String[] args){
         User u1 = new User();
         u1.id = 111;
         u1.name = "小明";
         u1.password = "qwe123";
         
         System.out,println(u1.id);
         System.out,println(u1.name);
         System.out,println(u1.password);
        }
    }
    
  • 3.住址类

    public class Address{
        String city; //城市
        String street;//街道
        String zipcode;//邮编
    }
    
    public class User{
        Stirng name;
        String password;
        Address addr;
    }
    
  • 4.画内存图,内存图中体现的是数据,所以不要在上面写代码

    • *内存图是非常重要的(有助于程序的调试)
    • 按先后顺序画(一步一步来)
    • 画板cmd打开(mspaint)
    • 运行顺序:
      • 1.类加载(方法区最先有数据)
      • 2.调用类,从main 方法开始压栈
      • 注意:程序员没有权利直接操作堆内存,想要使用必须通过引用。
        • 只有地址指向对象,事实上凡是方法中的变量都在栈内存中开辟了空间,自然每个变量都有他自身的地址。
    Address k = new Address();
    Address m = k; //是将k中保存的地址赋给了变量m
    
  • 5.代码拆分

    class User{
        int id;
        String password;
        Address addr;
    }
    
    class Address{
        String city;
        String street;
        String zipcode;
    }
    
    public class Test{
        public static void main(String[] args){
            Address a = new Address();
            a.city = "西安";
            a.street = "建工路";
            a.zipcode = "不知道";
            
            User u = new User();
            u.id = 123;
            u.password = "qwe123";
            u.addr = a;
            
            System.out.println(u.addr.city);
            // 是否可将 u.addr.city 进行拆分
            
            // Address add = u.addr;
            // String zhuzhi = add.city;
            // System.out.println(zhuzhi);
            //记住一点,里面有啥 就可以 点 啥 
        }
    }
    
    
    • *记住,实例变量必须通过对象才能访问。

    • *对象,是堆里new出来的,引用 是 保存对象内存地址的。

    • 引用一定是局部变量吗?

      答:不一定。栈中的是局部变量,堆里的是实例变量(成员变量)。

  • 6.属性是引用类型怎么访问

    public class T{
        A a;
        public static void main(String[] args){
            D d = new D();
            C c = new C();
            B b = new B();
            A a = new A();
            T t = new T();
            
            //编写代码通过t来访问d中的i
            System.out.println(t.a.b.c.d.i);
        }
    }
    
    class A {
         B b;
    }
    
    class B {
         C c;
    }
    
    class C {
       D d;
    }
    
    class D{
        int i;
    }
    
  • 7.空指针异常

    • 举例:

      public class NullPointerException{
          public static void main(String[] args){
              Customer s = new Customer();
              s.id = 110;
          }
      }
      
      class Customer{
          int id;
      }
      
    • 当没有引用指向对象时,堆内存程序员是无法操作的。gc 会将这个垃圾对象释放掉。

    • java 中的垃圾回收器(gc)主要针对的是堆内存中的数据。当没有任何引用指向该对象的时候,会判定为垃圾。

    • 出现空指针异常的前提条件是什么?

    • 答:“空引用”访问实例相关的数据,都会出现空指针异常。

  • 8.方法调用时参数传递问题?

    public class Test{
        public static void main(String[] args){
            int i = 100
            a(i); //10
            System.out.println(i);
        }
        
        public static void a(int i){
            i++;
            System.out.println(i); //11
        }
    }
    
    • 注意:java规定:参数在传递时,与类型无关,不管是基本数据类型还是引用数据类型,都是将“盒子” 中保存的值 复制 一份·,传递下去。

      只是这个值,可能是一个数字,也可能是一个对象的地址。

      public class Test1{
          public static void main(String[] args){
              Preson p = new Person();
              p.age = 100;
              add(p);
              System.out.println(p.age);//101
          }
      }
      
      public static void add(Preson p){
          p.age++;
          System.out.println(p.age)//101
      }
      
      class Preson{
          int age;
      }
      

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值