java初识类和对象

目录

1.什么是类和对象

2.创建类和对象

3.实例化对象

1.初始值

 2.就地初始化和默认初始化

3.浅谈实例化对象过程

4.This引用

1.为什么要有this引用

2.隐式this​

3.成员方法中的this

4.this还可以用于构造方法

5.构造方法

构造方法中的this

this用法总结:

构造方法的作用

6.封装的概念

7.关键字决定的权限问题

8.static关键字,静态的问题

9.代码段


1.什么是类和对象

可以理解成类是抽象出来的一个模板,然后对象就是利用这个模板创造出来的(new 出来),然后一个模板可以创建很多个对象,然后对象和类之间的交互编程就是面向对象思想的编程。你可以不用关心具体的实现方式,你只需要关心他们之间是怎么交互的。

好比下五子棋,面向过程就是一方黑一方白,然后你下一步我下一步,然后判断谁获胜。

面向对象就是把黑白双方,棋盘,判断获胜给抽象出来,下棋的过程就是这些对象交互的过程,你不用关心他是怎么下棋的这些内部细节

2.创建类和对象

class Student{  
    int age;
    String name;
//这里是定义属性(成员变量)
//_________________________________________
//下面是定义方法(行文)
    public void Sleep(){
        System.out.println("正在睡觉");
    }
    public void Eat(){
        System.out.println("正在吃饭");
    }
}


//在main函数调用
public class test_1 {
    public static void main(String[] args) {
        Student stu1 = new Student();//创建对象的过程
        System.out.println(stu1.age);
        System.out.println(stu1.name);

        stu1.Eat();
        stu1.Sleep();
    }
}

注意类名要用大驼峰的命名方式(每个单词的首字母大写) 如 class MyStudent(m,s大写)

1.上面代码是创建一个类,然后再另一个类中的main函数用这个类创建了一个对象stu1

2.class前的修饰,如public,这些在后面的访问权限和封装里说明(这些关键字是用来控制访问权限的)【要么加public,要么什么都不加】

3.一个类里面包括有成员变量,成员变量前的public代表改变量的权限;还有方法,public同理;

还有上面代码没写的静态类型(静态变量,静态方法)(用static修饰)[后面专门讲]

3.实例化对象

名字高大上,其实就是Student stu1 = new Student();

new Student()就是创建对象的过程,也叫实例化对象,前面的Student的类型可以理解是你创建的一个类型,就像int,等等。

注意:

1.初始值

与直接在main中开辟的局部变量不同,局部变量不初始化就用编译器会报错;但是在对象中,不论是什么对象,你没初始化他有一个默认值 ,比如数组名也是一个引用类型,数组内容就是对象,int [ ]a = new int [ 20];里面就全是0. 

 2.就地初始化和默认初始化

默认就是上面那种;就地初始化就是在定义的时候赋值;这种比较少用,因此类就是一个模板,当你的模板一开始就写死了,局限性就大了。

class Student{  
    int age=19;
    String name='zhangsan';


    public void Sleep(){
        System.out.println("正在睡觉");
    }
    public void Eat(){
        System.out.println("正在吃饭");
    }
}

3.浅谈实例化对象过程

1.为对象分配内存

2.调用合适的构造方法

什么是构造方法?可能细心的初学者会发现创建对象的过程最后是有括号的

Student stu1 = new Student();

这就是调在调用构造方法。在你没有写构造方法的时候,系统会默认给你一个没有参数的构造方法,因此你调用就是无参数(),但是如果你自己定义了一个构造方法,那就没有系统默认的。

什么是合适的构造方法,你给一个参数他就去找一个参数的构造方法,给两个就找两个,不给也就是只给括号(),他就找无参数的(也就是这里jvm提供的)

如何定义构造方法和一些细则在后面标题构造方法中

4.This引用

1.为什么要有this引用

先看一个代码,想想结果是什么

class Student{
    int age;
    String name;

    public void stu1(int age,String name){
        age=age;
        name=name;
    }
    public void stu2(int n,String s){
        age=n;
        name=s;
    }
}
public class test_1 {
    public static void main(String[] args) {
        Student stu1 = new Student();

        stu1.stu1(20,"zhangsan");
        System.out.println(stu1.age);
        System.out.println(stu1.name);
        System.out.println("______________________________________");
        stu1.stu2(21,"lisi");
        System.out.println(stu1.age);
        System.out.println(stu1.name);
    }
}

 一个赋值到了一个却没有

解析:stu2方法中,编译器知道age,name是类中的成员变量来进行赋值

在stu1方法中age,name遵循局部变量优先的原则,因此都是局部变量,所以赋值没有给到类中的age,name

这种类型与定义名字相同的怎么解决?

这就是this的作用了

this里面放的是@482也就是stu1的引用,因此this指向的是stu所指向的对象

this引用代表该变量是在当前对象下的,现在是什么对象,是stu1对象,不是(方法stu1,只是名字恰好相同)

2.隐式this

 不仅是成员变量,方法也是如此,

在调用方法的时候,第一个参数其实是类名+this,只是编译器隐藏了,这也是为什么在stu1方法中赋值可以找到类的成员变量成功赋值

最后:我们在对应的成员变量面前加上this,这是一个良好的代码风格,可以避免很多问题的出现,虽然编译器会自己加,但是总会有特殊情况。 

3.成员方法中的this

在成员方法中也可以通过this来调用其他的成员方法

4.this还可以用于构造方法

详解见下

5.构造方法

构造方式就是在类中定义的,方法名等于类名的方法,在实例化对象过程中调用该方法,如果未定义构造方法,编译器会提供一个不带参数的构造方法。构造方法是名字一样,但是参数不一样的方法,因此这些构造方法也构成了重载

 圈出来的就是我们自己定义的构造方法,可以看到实例化过程中我们传递了 18,lisi给它,因此打印结果如图所示。

那如果我们不调用参数,程序还可以正常运行吗?

 程序报错了,因为我们自己定义了一个构造方法,所以编译器不会提供它的无参数构造方法给我们。

构造方法中的this

构造方法中可以利用this调用其他的构造方法

 可以看到在无参数的构造方法中加了this(21,"wangwu")这里会调用有两个参数的构造方法。

但是如果this调用不在第一行呢?

程序就报错了,这个this语句是一定要在第一行

this用法总结:

1.引用属性,方法

2.构造方法中调用其他的构造方法(不可形成环,且在第一行)

3.可解决参数和成员名冲突问题

4.良好的代码风格,在成员名前加上this

构造方法的作用

一般构造方法都是起初始化作用,在你实例化对象的时候直接传参来进行对象的初始化,但是一个成员一个成员的赋值效率太低了,我们在可以通过编译器自己生成

 按住ctrl,把要初始化的成员选中然后ok

系统就会自动生成关于对应成员的赋值语句

6.封装的概念

前面提到类,方法,变量前面是有关键字的,比如public,这些是起什么作用

这就与封装有关了,public代表在任意地方,都可以访问到它修饰的东西,而private只能在当前类中访问(什么意思,就是在类的定义这边,定义属性,定义方法都可以使用你private的东西,但是到了比如main函数那边,就不可以调用了)

这就好比我们把一个功能封装成盒子,然后别人只能使用我创造的接口,而不能访问到我内部的东西(把类的实现细节封装,只对外提供接口),可以降低代码的耦合度。

 我们的grade是用private修饰的,因此出了类Student后就不可以直接访问得到了。

那怎么使用?右键generate

 getter是获得,setter是设置,你可以根据自己的需求来确定是要一个还是两个都要

在我点击确认后编译器会生成一个修改或者获取的方法,而别人不可以访问到你的private的成员变量,只能通过这样来访问

相当于封装了一个盒子,而我只提供接口给你,不给你看我内部的细节

一般默认都是public修饰的不能轻易改动,因为可能会有别人在其他地方使用,但是privte可以任意改动而不造成影响

7.关键字决定的权限问题

 其中protected涉及继承和多态,因此这里不讲

default就是默认的意思,也就是我们直接class类,他的权限就是default类型,同一个包是什么意思,就是当前程序下都可以;java把多个类合成一个包,要用到相关类的时候先导入包,再调用类里面要的东西,可以理解成包就是一个文件夹,管理着一些类

public是什么都可以

private是只有当前类可以

8.static关键字,静态的问题

前面我们讲类的方法,属性都没用static修饰,这里单独拎出来说,首先为什么需要一个static修饰属性,方法。比如我Student类,new了两个对象,也就是两个学生,他们什么都不一样,但是唯独他们的年级grade是一样的,那我每次new的时候都要传一次grade吗?

这时候就引申出静态static了,在定义类的时候用static修饰grade,然后只用对他赋一次值就行了,这个赋值可以是new的时候赋,也可以定义的时候赋值。

是不是很奇怪,还没实例化对象的时候就可以赋类里面的成员?

其实在类中,一旦用static修饰后,这个属性/方法就不在是属于对象了,而是属于这个类,你的修改是对这个类的修改,而不是基于对对象的修改

static修饰的成员变量叫类变量,修饰的方法叫类方法(都是属于类的)

我没有实例化对象,而是直接通过类来寻找我的静态成员grade

那我可以通过对象来找grade吗?可以,合法但是不合理! 

虽然编译器允许,但是这个grade是属于类的,而不是某个变量

 stu2 这个对象中根本没有grade,也就是编译器也默认这个静态成员不属于对象

9.代码段

http://t.csdn.cn/9qvph

转载了另一位博主写的,通俗易懂

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值