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 创建类的实例(隐式加载)
- 调用类的静态方法
- 子类初始化时
还有一些情况在反射那部分会讲到