类和对象

类(Class)

类是一类对象的模板。
类包含对象的属性和方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Person
{
String name;
int age;

void learn()
{
System.out.println("learn sth");
}

void eat()
{
System.out.println("eat sth");
}

void sleep()
{
System.out.println("zzzzzzz");
}
}

对象(Object)

对象是一个类的实例,有该对象特有的属性和方法。

如上图,人(Person)是一个类,而小明是人这个类的一个对象,
小红是人这个类的另一个对象。每个对象有各自的名字和各自的年龄。
生成对象的这个动作,我们称为实例化。

类的声明与初始化

1
2
Person xiaoMin, xiaoHong; //对象的声明 
xiaoMin = new Person(); //对象的实例化
  • 在对象声明的时候,这个内存的值一般是null。
  • 在对象实例化的时候,才会对对象进行进行内存分配
  • new是创建对象的关键字

访问控制修饰符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Person
{
private String name;
private int age;

public String getName()
{
return this.name;
}
public void setName(String name)
{
this.name = name;
}
}
其他包的类子类同包其他类内部类
public(+)
protected(#)
defalut()
private(-)
  • 包,可以理解为同目录下的不同文件夹
  • this.为了调用本类的属性,以便于区分方法内的类属性和传入参数
  • public一般用于修饰方法,如上用于getName和setName
  • protected一般是修饰父类的属性,以便于子类能够直接使用父类属性
  • default如果不对属性添加修饰符,系统则会给他一个默认修饰符。
  • private用来保护数据和隐藏类,因为被private修饰的只能被所属类访问。

要求:类的所有属性必须被private修饰。(个人觉得父类的方法可以用protected修饰)

Getter和Setter

当一个另一类无法访问此类的私有属性。我们可以用getter来获取此属性的值,用setter来修改属性的值。

构造方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class Person
{
private String name;
private int age;

//----------------Construire------------------
public Person(String name)
{
this(name,18);//调用下面那个构造方法,age默认为18岁
}

public Person(String name, int age)
{
this.name = name;
this.age = age;
}

public Person(int age)
{
this("???",age);//调用上面那个构造方法,无名氏
}

//-----------------GETTER-------------
public String getName()
{
return this.name;
}
//-----------------SETTER-------------
public void setName(String name)
{
this.name = name;
}
}
1
2
3
4
5
6
7
8
public class TestPerson {
public static void main(String[] args) {
Person xiaoHong = new Person("xiao hong"); //调用上面第一个构造方法
Person xiaoMing = new Person("xiao ming" ,18);//调用上面第二个构造方法

System.out.println(xiaoHong);
}
}
  • 构造方法没有返回值。
  • 一般方法名字开头必须小写,但是构造方法例外,因为构造方法的名字必须是类名。
  • 构造方法可以有多个(参数数量或参数类型不同),每次new一个对象调用的构造方法是根据传入参数的数量来决定的。
  • 如果一个类没有写构造方法,那么他会调用他顶级父类个Object的构造方法。
  • Object是所有类的父类。(这是个Object类不是上面说的对象)

当我们使用new的时候的jvm的操作顺序。

      为该对象租用内存地址。
      为对象中的属性赋值,如果没有指定值就给一个默认值
      调用对应的构造方法。

默认值整型默认为0,浮点型默认为0.0,布尔类型默认为false,所有对象的默认类型是null,构造方法是jvm赋予默认值之后才被调用。

主方法

主方法(main)是程序启动的入口,如上面的TestPerson的main是我们运行TestPerson的入口。而且有主方法的类必须被public修饰。

toString()方法

1
2
3
4
5
6
7
8
9
public class Person
{
//照上

@Override
public String toString() {
return "i'm " + this.name + " and " + this.age + " years old";
}
}

如果类没有写toString()方法,则系统会调用Objectt的toString()方法,此时在控制台会显示一串十六进制的地址。
而这个地址指向的就是我们的toString()方法。所以如果我们写了此方法,控制台就会返回对应的信息。

1
2
3
4
5
6
$ java TestPerson 
Person@14dad5dc

$ javac TestPerson.java
$ java TestPerson
i'm xiao hong and 18 years old

总结

一个非Test类一般包含他的属性和方法,如构造方法用于创建对象,Getter和Setter用于访问和修改属性,toString()用于输出信息。而Test类一般不包含属性,只有一个主函数来启动我们的程序。

如果发现错误请留言告知,万分感谢。

参考资料


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!