JavaSE:5、类与对象

1、类的定义与对象的创建

 定义属性

创建对象

2、对象的使用

使用一个变量来指代某个对象,只不过引用类型的变量,存储的是对象的引用,而不是对象本身
public class Main {
    public static  void main(String [] argv)
    {
      Person p1=new Person();
      Person p2=p1;
      Person p3=new Person();
      //等号判断两个对象存的是不是同一个对象的引用
      System.out.println(p1==p2);  //true
      System.out.println(p1==p3);   //false
    }
}
类使用的都是引用类型。
可以由此访问对象的属性,不同对象修改不互相影响
public class Main {
    public static  void main(String [] argv)
    {
      Person p1=new Person();
      Person p2=p1;
      Person p3=new Person();
       p1.name="1";
       p2.name="2";
       p3.name="3";

      System.out.println(p1.name);  //2
      System.out.println(p3.name);   //3
    }
}
引用类型变量初始可以为空,但调用成员时会运行异常
//空指针异常
public class Main {
    public static  void main(String [] argv)
    {
      Person p1=null;
     p1.name="a";
      System.out.println(p1.name);
    //NullPointerException: Cannot assign field "name" because "p1" is null
        //	at Main.main(Main.java:5)
    }
}
对象建立但未初始化,引用类型为null,基本类型为0
public class Main {
    public static  void main(String [] argv)
    {
      Person p1=new Person();
      System.out.println(p1.name);  //null
    System.out.println(p1.age);    //0
    }
}

3、方法创建与使用

返回值类型 方法名称() { 方法体... } 
public class Person {
    String name;
    int age;
    void hello(String n,int a)
    {
        name=n;
        age=a;
        System.out.println("我的名字:"+n+",我的年龄:"+a);
        return ;
      //  System.out.println();   ERROR ,不可达语句
    }
}
public class Main {
    public static  void main(String [] argv)
    {
      Person p1=new Person();
      p1.hello("小明",18);
      //  我的名字:小明,我的年龄:18
    }
}
return 语句后面为不可达语句,除void外,其它返回类型必须要return。
函数参数传递为开辟新空间拷贝,基本类型拷贝值,引用类型拷贝地址
public class Main {
    public static  void main(String [] argv)
    {
      Person p1=new Person();
      String  a="8",b="6";
      p1.swap(a,b);
      System.out.println(a+" "+b);//8 6
        //因为引用传递本质是开辟新空间拷贝地址,
        //而我们没法从指针修改String的对象
      p1.name="小红";
      p1.test(p1);
      System.out.println(p1.name);//小明
        //此处test通过指针找到该对象存的位置直接修改该对象
        //所以能影响到外部
    }
}
public class Person {
    String name;
    int age;
    void swap(String a,String b)
    {
        String t=a;
        a=b;
        b=t;
    }
    void test(Person p)
    {
        p.name="小明";
    }
}

4、方法进阶使用

使用this来处理重名情况
public class Person {
    String name;
    int age;

    void test(String name)
    {
        this.name=name;
    }
}
public class Main {
    public static  void main(String [] argv)
    {
      Person p1=new Person();

      p1.name="小红";
      p1.test("小明");
      System.out.println(p1.name);//小明
    }
}
方法重载:根据参数类型,数量来区分,不依靠返回类型区分
方法之间可以相互调用
public class Person {
    String name;
    int age;

    int add(int a,int b)
    {
        System.out.println("intadd");
        return a+b;
    }
  //  double add(int a,int b)   ERROR
    double add(double a,double b)
    {
        System.out.println("doubleadd");
        return a+b;
    }
}
public class Main {
    public static  void main(String [] argv)
    {
      Person p1=new Person();
     int a=3,b=5;
     System.out.println(p1.add(a,b));
      //  intadd
      //  8
     double c=9.0,d=35.6;
     System.out.println(p1.add(c,d));
     //   doubleadd
     //   44.6
    }
}

5、构造方法

构造方法不需要填写返回值,并且方法名称与类名相同,默认情况下每个类都会自带一个没有任何参数的无参构造方法,在对象建立的时候会执行
在我们自己定义一个构造方法之后,会覆盖掉默认的那一个无参构造方法,除非我们手动重载一个无参构造
构造对象顺序:成员变量初始化和代码块,构造函数
前者从上到下执行,若代码块调用了成员变量,而成员变量为初始化则会报错
public class Person {
 //   {
   //     System.out.println(name);
        //无法在定义字段 'name' 之前读取它的值
 //   }
    Person(String name,int age)
    {
        this.name=name;
        this.age=age;
        System.out.println("我是构造函数");
    }
    {
        System.out.println("我是代码块2");
    }
    String name="name";
    int age=-1;

    {
        System.out.println("名字:"+name);
    }
}
public class Main {
    public static  void main(String [] argv)
    {
      Person p1=new Person("小红",18);
       // 我是代码块2
       // 名字:name
       // 我是构造函数
    }
}

6、静态变量与静态方法

静态的内容,我们可以理解为是属于这个类的,也可以理解为是所有对象共享的内容。
有静态变量,静态代码块,静态函数
创建对象执行顺序:静态变量和代码块、变量和代码块、构造函数
前两者分别从上往下执行
可以直接通过类调用静态函数和变量
public class Person {
   // static {
     //   System.out.println(str);
       // 无法在定义字段 'str' 之前读取它的值
   // }
    {
        System.out.println(str);
    }
    Person(String name,int age)
    {
        this.name=name;
        this.age=age;
        System.out.println("我是构造函数");
    }

    {
        System.out.println("我是代码块2");
    }

    String name="name";
    int age=-1;
     static String  str;

    static void test()
    {
        System.out.println("我是静态函数");
    }
    static
    {
        System.out.println("我是静态代码块");
    }
}
public class Main {
    public static  void main(String [] argv)
    {
      Person p1=new Person("小红",18);
    Person.test();
    /*
我是静态代码块
null
我是代码块2
我是构造函数
我是静态函数
     */
    }
}
静态方法无法使用this关键字,且只能使用类的静态变量
我们在Java中使用一个类之前,而是在需要时才会去加载(优化)一般遇到以下情况时才会会加载类
  • 访问类的静态变量,或者为静态变量赋值
  • new 创建类的实例(隐式加载)
  • 调用类的静态方法
  • 子类初始化时
还有一些情况在反射那部分会讲到 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值