javaSE中的类与对象

基本概念

我自己最初接触java时,自己看书就有些模糊,现在在这里梳理一下:

先说类:所谓的类其实就是对一些共性的描述,具有一系列共同特征的集合。
对象:那么对象是什么?对象其实就是将类具体化了,对类的描述,类说的是一个大的范围总和,对象就是类的实例化。
如果到这里你还是理解不了,你可以将类想象成一个结构体,而对象就是每个结构体变量。

那么理解了概念,我们就知道,一定是先有了类,之后才会有对象的,因为对象的一切行为都是在类中的。如果你不先定义类,那么对象就无法产生了。
这就决定了,类的组成:

1.属性
2.方法

类与对象的定义

理解了概念,我们具体写一个类来看看:

class Person{//类的定义
	public String name;//姓名属性
	public int age;//年龄属性
	public Person(String name,int age){//构造方法
		this.name = name ;
		this.age = age ;
	}
	public String getPersonInfo(){//方法
		return "姓名:"+this.name+",年龄:"+this.age;
	}
}

在上面的代码中,我们写了一个类,类名是Person,你会注意到,这里类名首字母大写(驼峰命名法),然后在类里面,我们定了两个属性,之后又有了两个方法,第一个是构造方法,这个之后会讲到,第二个是方法,这就是一个完整的类了

我们会发现这个类是对Person这一类的描述,类写完了,那么对象如何产生呢?我们继续看:

Person p2 = new Person("Steven",25);

上面这一个语句就是产生了一个对象,具体语法:类名+对象名=new +类名(参数列表)
通过对象调用实例变量与实例方法

Person p = new Person("Steven",25);
System.out.println(p.name);
System.out.println(p.getPersonInfo());

注意:对象(引用数据类型)必须实例化之后才可以调用,如果没有实例化对象,编译时不会出错,但是运行时会抛出NullPointerException

封装和构造方法

这里先说明一下:我们的java是面向对象的一门语言,那么java面向对象有三个特征:
1.封装性
2.继承性
3.多态性

今天我们先说第一种:封装性

封装封装可见其严谨,这么说吧,安全性比较高,比如我写的代码里面,有些东西不想被别人访问或者修改,那我就可以对我的代码进行封装。

那么如何实现封装呢?这就要用到我们的第一个关键字private

关键字private

使用private封装属性

private String name;
private int age;

我们对属性进行封装,只需在属性前面加上private关键字即可。这样外部就很难访问到我们的私有属性,若此时要访问私有属性,按照java的设计原则必须提供以下两种方法:
setter方法和getter方法
我们先来看看这两个方法的功能:

setter方法:主要用于进行属性内容的设置与修改
getter方法:主要用于属性内容的取得

当我们想要修改私有属性的内容,就可以通过外部调用setter方法传参进行修改设置
而getter方法只允许访问,不允许修改。

!!!!!注意!!!!!getter方法是没有参数的
举个例子,看一段代码:

public class Person {
	private String name;//私有属性
	private int age;//私有属性
	
	public void setName(String name){//可以通过外部传参修改姓名
		this.name=name;
	}
	
	public int getAge(){//年龄只能访问
		return age;
	}
	public void getPersonInfo(){
		System.out.println("姓名:"+name+" 年龄:"+age);
	}
}


public class Test{
	public static void main(String[] args){
		Person person=new Person();//实例化一个Person对象
		person.setName("张三");//设置姓名
		person.getAge();//获取年龄
		person.getPersonInfo();
	}
}

上面这一段代码很清楚的解释了setter方法和getter方法,可以看到我们一开始对两个属性都未设置值,姓名属性痛setter方法传参进去的,而年龄只是获取了,所以应该是默认值0;运行结果如下:

在这里插入图片描述

如果我们一开始给年龄个初值再来看看结果,将上面属性那里改为如下:

private String name;//私有属性
	private int age=18;//私有属性

此时结果便是如下:
在这里插入图片描述
这就更加验证了我们的getter方法只是单纯的获取属性,并不能改变。
通过以上代码我们可以发现,private实现封装的最大特征在于:只允许本类访问,而不允许外部类访问

类的设计原则

  • 编写类时,类中的所有属性必须使用private封装。
  • 属性若要被外部访问,必须定义setter、getter方法。

构造方法

在上面定义类时,你会发现我写了一个构造方法,那么现在我们来说一下构造方法,其实这里我也是弄了很久才分清了构造方法和setter方法:

刚才我们说setter方法是为了从外部修改我们的属性值,那么构造方法,其实是对整体进行一个初始化,这么说吧:如果没有构造方法的话,我们想要获取或者改变私有属性的话只能用getter和setter方法对吧,但是你有没有想过如果这个类中属性特别多,那你就得对每个属性都创建它的getter和setter方法,然后在外部一一调用,想来这样实在是太麻烦了。

但是我们用构造方法的话,我们可以在创建对象的同时将你想要修改的每个属性,先给个初值,之后你也可以通过setter方法再修改呀,这样就大大简化了代码。

通过以上分析可以得知,所谓的构造方法就是使用关键字new实例化新对象时来进行调用的操作方法。对于构造方法的定义,也需要遵循以下原则:

  • 方法名必须与类名相同
  • 构造方法没有返回值类型声明
  • 每个类中一定至少存在一个构造方法(若类中没没有定义构造方法,系统会自动生成一个无参构造方法)

说了这么一大段,我们还是拿前面的例子来具体看一下:

class Person{//类的定义
	private String name;//姓名属性
	private int age;//年龄属性
	private String sex;//性别属性
	public Person(String name,int age){//构造方法
		this.name = name ;
		this.age = age ;
	}
	public String getSex(){
		return this.sex;
	}
	public void setSex(String sex){
		this.sex=sex;
	}
	public void getPersonInfo(){//方法
		System.out.println("姓名:"+this.name+",年龄:"+this.age+",性别:"+this.getSex());
	}
}
public class Test {
	public static void main(String[] args){
		Person per = new Person("张三",20);
		per.setSex("男");
		per.getPersonInfo();
	}
}

上面这个类中我就定义了构造方法,一般情况下,我们的性别不能随意改变对吧,那我们给sex个getter和setter方法,其他的属性我们在构造方法时穿进去就可以了,看看结果:

在这里插入图片描述

构造方法重载

我们还是拿刚才那个例子来说明,重载一个构造方法:

class Person{//类的定义
	private String name;//姓名属性
	private int age;//年龄属性
	private String sex;//性别属性
	public Person(String name){//构造方法1
		this.name=name;
	}
	public Person(String name,int age){//重载构造方法
		this.name = name ;
		this.age = age ;
	}
	public String getSex(){
		return this.sex;
	}
	public void setSex(String sex){
		this.sex=sex;
	}
	public void getPersonInfo(){//方法
		System.out.println("姓名:"+this.name+",年龄:"+this.age+",性别:"+this.getSex());
	}
}

可以看到,我的Person类里面写了两个构造方法,这两个构造有什么区别?对了,参数列表不同。一个只有参数,另一个有两个参数。那么这样我们如何使用呢?继续看:

public class Test {
	public static void main(String[] args){
		Person per = new Person("张三");
		per.setSex("男");
		per.getPersonInfo();
		Person per1=new Person("李四",21);
		per1.setSex("女");
		per1.getPersonInfo();
	}
}

在这里插入图片描述

从上面可以看到我们实例化了两个Person对象,一个传了一个参数,另一个传了两个参数,并且都打印了出来,这就叫构造方法重载。

当然了,不止构造方法可以重载,普通方法也可以重载,方法类似。
建议:建议:若干构造方法,请按照参数个数升序或降序

匿名对象

在上篇将数组的时候,提到那你明数组,当然这里也有匿名对象

new Person("张三",20).getPersonInfo();

由于匿名对象不会有任何的栈空间所指向,所以使用一次后就成为垃圾空间。

猜你喜欢

转载自blog.csdn.net/qq_40550018/article/details/84196451