目录
一.什么是类和对象
一谈到对象,我们往往想到的就是男朋友或者女朋友,但其实在计算机语言中,对象包括了很多事物,可以这样说,世界上任何一个具体的物理实体都可以看作一个对象,所以包括上面所说的男女朋友等等,都可以是对象。
而类呢,就比较抽象了,是用来对一个对象来进行描述的,主要描述该对象具有哪些属性,比如说对于洗衣机来说,它的属性有产品品牌,型号,外观尺寸,颜色等等,它的功能又包括洗衣,烘干,脱水,定时等等。简单了解完什么类和对象之后,我们接下来看如何定义一个类以及实例化一个对象。
二.类的定义和实例化
2.1类的定义
在java中定义类时需要用到class关键字
//创建类
class 类名{
//属性或者成员变量
//行为或者成员方法
}
class为定义类的关键字,类名可以自己命名,括号中的内容中为类的主体。那么接下来我们来定义一个狗类。
class Dog {
public int age;
public String color;
public String name;
public void bark() {
System.out.println(name+"汪汪汪");
}
public void eat() {
System.out.println(name+"吃饭");
}
}
注:如果你的类前加上了public,那么public修饰的类名必须要和文件名相同,并且不要轻易去修改public修饰的类的名称
2.2 类的实例化
那么在创建好类之后,如何实例化一个类呢?
public static void main(String[] args) {
Dog dog1=new Dog();//通过new实例化对象
dog1.name="大黄";//使用.来访问成员中的属性或者方法
dog1.bark();
Dog dog2=new Dog();//可以创建多个实例,但是实例的名字不能相同
dog2.name="小白";
dog2.eat();
}
这样我们就实例了dog1和dog2两个对象,那么如果我们不给狗的姓名赋值,又会输出什么呢?
当我们不给成员变量name赋值时,name的默认值为空值null,那么其他类型的默认值是什么?
reference指的是引用数据类型,包括数组,String类等等
三.this引用
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。那么为什么要使用this呢,我们依然以狗为例子
public class Dog {
public int age;
public String color;
public String name;
public void setDog(int age,String name,String color) {
age=age;
name=name;
color=color;
}
public void show() {
System.out.println("姓名:"+name);
System.out.println("年龄:"+age);
System.out.println("颜色:"+color);
}
public static void main(String[] args) {
Dog dog=new Dog();
dog.setDog(3,"大黄","黄色");
dog.show();
}
}
为什么会出现这样的输出结果呢?我们可以看到name,age以及color都是默认值,说明我们并没有给这三个成员变量赋值,问题就出在setDog方法上,通过setDog方法我们想要达成的目的是传入参数并给本类中对应的成员变量赋值,但由于形参与成员变量名字相同,变成了形参自己给自己赋值,导致成员变量没有被正常赋值,那么解决这个问题就要用到this
public void setDog(int age,String name,String color) { this.age=age;//通过.引用本类中的成员变量 this.name=name; this.color=color; }
这样一来就成功给类中的成员变量赋了值,保证了age,name,color指向的正确性。
四.构造方法
4.1 构造方法的定义
构造方法是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。上面我们是通过setDog方法传参来给成员变量赋值,而通过构造方法,我们能够在实例化对象时就传入参数。
public class Dog {
public int age;
public String color;
public String name;
// 构造方法:
// 名字与类名相同,没有返回值类型,设置为void也不行
// 一般情况下使用public修饰
// 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
public Dog(int age,String color,String name) {//构造方法
this.age=age;
this.color=color;
this.name=name;
}
public void show() {
System.out.println("姓名:"+name);
System.out.println("年龄:"+age);
System.out.println("颜色:"+color);
}
public static void main(String[] args) {
Dog dog=new Dog(1,"白色", "小白");
dog.show();
}
}
注意事项:
1. 构造方法没有返回值类型,设置为void也不行2. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
4.2 this()调用构造方法
构造方法中,可以通过this调用其他构造方法来简化代码
public Dog() {
this(2,"黑色","老黑");//this调用本类中含三个参数的构造方法
}
public Dog(int age,String color,String name) {
this.age=age;
this.color=color;
this.name=name;
}
public void show() {
System.out.println("姓名:"+name);
System.out.println("年龄:"+age);
System.out.println("颜色:"+color);
}
public static void main(String[] args) {
Dog dog=new Dog();
dog.show();
}
}
注意事项:this(...)必须是构造方法中第一条语句,不然会出报错
五.封装
5.1 封装是什么
什么是封装呢?简单来说就是套壳屏蔽细节,是指将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来对隐藏的信息进行操作和访问。
封装的好处:1.只能通过规定的方法访问数据;2.隐藏类的实例细节,方便修改和实现;
5.2 访问限定符
访问控制符有private,default(默认),protected,public四种,每种控制符的作用范围不同
接下来我们重点看一下private修饰符,将Dog类中的public成员变量改用private修饰
public class Dog {
private int age;
private String color;
private String name;
public Dog(int age,String color,String name) {
this.age=age;
this.color=color;
this.name=name;
}
public void show() {
System.out.println("姓名:"+name);
System.out.println("年龄:"+age);
System.out.println("颜色:"+color);
}
}
class Testprivate{
public static void main(String[] args) {
Dog dog=new Dog(2,"黄色","柯基");
System.out.println(dog.age);
}
}
当主函数不在Dog类中时候,由于成员变量都是由private修饰,所以没有权限访问成员变量,编译报错(private修饰的成员方法同理)
那么当我们想要修改成员变量的值时,该怎么办呢?
只需要在Dog类中添加setName的方法
public void setName(String name) { this.name = name; }
同时在main方法中添加修改语句
dog.setName("拉布拉多"); dog.show();
如果想得到dog对象中的成员变量name的值
只需要在 Dog类中添加getName的方法
public String getName() { return name; }
在main方法中添加打印语句
System.out.println(dog.getName());
注:
Alt+Insert(有Fn的话也要一起按)可以快速创建上述get和set方法,以及类的构造方法
六.static成员
static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。被static修饰的成员方法称为静态成员方法,与静态成员变量类似,是类的方法,不是某个对象所特有的。那么在方法调用上加static与不加static的方法有什么区别,我们来看下面这个例子
public class test01 {
public static int n=10;
public static int sum(int x,int y){
return x+y;
}
}
class Main1{
public static void main(String[] args) {
test01 test=new test01();
System.out.println(test.sum(5, 4));
System.out.println(test01.sum(5,4));
System.out.println(test.n);
System.out.println(test01.n);
}
}
输出结果为9 9 10 10
由此可见,我们可以通过实例化对象来调用静态成员变量或者方法,也可以直接通过类名调用,但是更推荐使用后者
注:不能在静态方法中访问任何非静态成员变量
七.代码块
7.1 普通代码块
普通代码块:定义在方法中的代码块,用{}括起来
public class test {
public static void main(String[] args) {
{//普通代码块
int x = 10;
System.out.println(x);//输出10
}
}
}
7.2 构造代码块
构造代码块:定义在类中的代码块,用{}括起来
public class student {
public int age;
public String name;
public void print() {
System.out.println("年龄:"+this.age);
System.out.println("姓名:"+this.name);
}
{//构造代码块
System.out.println("构造代码块被执行");
name="李四";
age=18;
}
public static void main(String[] args) {
student stu=new student();
stu.print();
}
}
7.3 静态代码块
静态代码块:使用static定义的代码块称为静态代码块
public class student {
public int age;
public String name;
public static String classroom;
public void print() {
System.out.println("班级:"+classroom);
}
static {//静态代码块
System.out.println("静态代码块被执行");
classroom="001";
}
public static void main(String[] args) {
student stu=new student();
stu.print();
}
}