目录
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.代码段
转载了另一位博主写的,通俗易懂
743

被折叠的 条评论
为什么被折叠?



