类和对象
1认知
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题
Java是基于面向对象,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成
1.1面向过程&面向对象
面向过程注重的是过程,在整个过程中所涉及的行为,就是功能
现实世界的一个执行方式
面向对象注重的是对象,也就是参与过程所涉及到的主体 是通过逻辑将一个个功能实现连接起来
类是一类对象的统称
对象就是这一类具体化的一个实例
面向对象优势:个人认为,面向对象就是预先设定好一个解决一类问题的方法,并将之命名,然后每次遇到问题,直接用这个方法解决。一个方法通吃一类问题
面向对象设计
把我一个重要的经验:谁用有数据,谁对外提供操作这些数据(私有)的方法
(被动的一方是数据的拥有者,主动的一方是执行者)
开发时:找对象,建对象,用对象,并维护对象之间的关系
2类和类的实例化
类就是一类对象的统称,对象就是这一类具体化的一个实例
类在Java中属于引用类型,Java使用关键字class来声明类
基本语法
// 创建类
class<class_name>{
field;//成员属性
method;//成员方法
}
class为定义类的关键字,ClassName为类的名字,{}中为类的主体
类中的元素称为:成员属性
类中的函数成为:成员方法
class Person{
public int age;
public String name;
public String sex;
public void eat() {
System.out.println("吃饭!");
}
public void sleep(){
System.out.println("睡觉!");
}
}
类的实例化
用类类型创建对象的过程,成为类的实例化
1.类只是一个模型一样的东西,限定了类有哪些成员
2.一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
3.类实例化出对象就像现实中使用建筑设计图建筑造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间
注意事项
new关键字用于创建一个对象的实例
使用.
来访问对象中的属性和方法
同一个类可以创建多个实例
3类的成员
类的成员可以包含以下:字段、方法、代码块、内部类和接口等
3.1字段/属性/成员变量
在类中,但是方法外部定义的变量,这样的变量我们成为"字段"或"属性"或"成员变量"(三种称呼都可以,一般不会严格区分)
class person{
public String name;
public int age;
}
class Test{
public static void main(Steing[] args){
Person person = new Person();
System.out.println(person.name);
System.out.println(person.age);
}
}
//执行结果
null
0
使用.访问对象的字段
"访问"既包含读,也包含写
对于一个对象得分自动福安如果没有显示设置初始值,那么会被设置一个默认的初值
默认值规则
1.对于各种数字类型,默认值为0
2.对于boolean类型,默认值为false
3.对于引用类型(String,Array,以及自定制类),默认值为null
3.2认识null
null在Java中为"空引用",表示不引用任何对象,类似于C语言中的空指针,如果对null进行.
操作就会引发异常
class Person{
public String name;
public int age;
}
class Test{
public static void main(String[] args){
Persong person = new Person();
System.out.println(person.name.length());
}
}
//执行结果
Exception in thread "main" java.lang.NullPointerException
at Test.main(Test.java:9)
字段就地初始化
很多时候我们不希望字段使用默认值,而是需要我们显示设定初值,可以这样写:
class Person{
public String name = "张三";
public int age = 18 ;
}
class Test{
public static void main(String[] args){
Person person = new Person();
System.out.println(person.name);
System.out.println(person.age);
}
}
//执行结果
张三
18
3.2方法(method)
用于描述一个对象的行为
3.3构造方法
在实例化对象的时候会被自动调用到的方法,方法名字和类名相同,用于对象的初始化
虽然我们前面已经能将就地初始化,但是有些时候可能需要进行一些更复杂的初始化逻辑,那么就可以使用构造方法
3.4static关键字
1.修饰属性
2.修饰方法
3.代码块
4.修饰类
1.修饰属性
Java静态属性和类相关,和具体的实例无关,换句话说,同一个类的不通事理共用同一个静态属性
2.修饰方法
如果在任何方法上应用static关键字,此方法成为静态方法
静态方法属于类,而不属于类的对象
可以直接调用静态方法,而无需创建类的实例
静态方法可以访问静态数据成隐患,并可以更改静态数据成员的值
注意:
静态方法和实例无关,而是和类相关,因此这导致了两个情况:
1.静态方法不能直接使用非静态数据成员或调用非静态方法(非静态数据成员和方法都是和实例相关的)
2.this和super两个关键字不能再静态上下文中使用(this是当前实例的引用,super是当前实例父类实例的引用,也是和当前实例相关)
注意:
main方法为static方法
实际上一个方法是不是带static是要以具体情况而定的
在开发过程中,首先通过对具体问题的分析理解,
1.找到对象
2.创建对象
3.使用对象
实际上的使用类似方法的调用
具体落实下来的要求与规则增加的同时应用模式与对象面更加广阔
例如我调用一个Person类,注意类的命名使用大驼峰命名法(每个单词首字母大写)
class Person{
public String name;
public int age;
public String eat;
public void name(){System.out.println(name);
}public void eat() {
System.out.println(this.name+" eat()!");
}}
public static void main(String[] args) {
Person per = new Person();//对于类的调用,类似一个变量per的定义过程,也就是说现在的类型是Person,我设定的类型,= new Person();是初始化变量的过程,也就是说现在我的per就是类Person的代表了,该类内部的方法我都可以调用(当然private另当别论)
System.out.println(per.name = "JKL");//我sout了一个name方法,打印了他,我在调用时给他赋值叫JKL
System.out.println(per.age);//因为我定义时并没有给他赋值,调用也没给赋值,所以打印出来就是一个初值0
per.eat();//调用了eat方法,eat方法有sout语句,所以sout了eat!
}//执行结果
JKL
0
JKL eat()!
在给予类中变量定义时,可以字段就地初始化,例如 public String name = "JKL";
也可以在调用时初始化,例如:public String name;System.out.println(per.name = "JKL")
注意:未初始化的变量,是不具备长度的,因此person.name.length();则会产生NullPointerException空指针异常
默认值规则
各种数字类型,默认值为0
boolean类型,默认值为false
引用类型,默认值为null
static变量定义
首先要理解静态static的意义
都知道main在栈中创建一个内存,然后每调用一次类就在堆上创建一个新的内存,然后通过地址调用其上边的变量
但是无论在哪,通过static修饰的变量,被存在方法区上,所以他是一个实时的数据
当然,并不是说加了static他就无敌了
main方法还是yyds
所以在使用static定义变量时,注意顺序,语句顺序,运行顺序!!
static方法定义
这里就要涉及到一个问题,关于JVM 先挖个坑,等学完JVM在具体说
根据我目前的理解,static方法 就是开始运行就跑起来的方法,随调随用
非static方法,是需要this初始化一下,才能调用的,也就是说this给他一个信号告诉他,他该动起来了
涉及到一个内存的问题,如果当前的程序十分庞大,你的栈已经不能够支持你上来就把所有的方法跑起来,直接溢出了
坑挖好了,等埋!!!
小结
普通定义都是实例变量
static定义是静态变量(常量池)
final + 类型 定义的是常量
举例还是Person类
class Person{
public String name;
public int age;
public String eat;//实例变量
public static int count;//静态变量public final int SIZE = 0;//常量
//实例成员函数
public void name(){
System.out.println(name);
count = 0 ;
}//静态成员函数
public static void age(){
count = 0 ;
age = 0 ;//报错,静态成员函数只能调用静态变量
}
封装
OOD面向对象设计方法
OOA面向对象分析方法
OOP面向对象编程(特征:多态、继承、封装)
既然是理解贴
就不讲什么概念了,直接上具体用法
都他娘的是干货
private实现封装
private/public "访问权限控制"
说白了public公共的(公交车),private私有的(私家车)
把我类中的变量都用private修饰,然后呢也在类中定义一个方法,去使用这些变量实现功能
这样主函数调用时 直接调用这个方法,而不是调用具体某几个变量去做什么
封装的意义:
协同编程,不需要完全看懂别人的代码段,直接就按方法功能去调用,这样一方面防止某人离职,同时也防止某人出门出意外昂***
getter和setter方法
这个先看完this再回来写昂
alt+insert
构造方法
作用:实例化对象
this.
代表当前对象的引用
语法规则:
方法名称必须与类名相同
构造方法没有返回值类型声明
每一个类中一定至少存在一个构造方法(我要是不主动定义,系统帮我自动生成一个)
系统默认的构造方法
实际上是一个空构造方法
public Person(){
}
诸如此类
去打印也是打印初值null 0 之类的
所以说在调用类时
Person per = new Person();
这个Person()实际上是我的构造方法,我不写 就是默认 我写了 就是我给的所谓的初值
所以写了构造方法
这样
public Person(){
this.name = "张辉";
this.age = 18;
this.sex = "男";
}
这是我给的构造方法
那么在调用时
Person per = new Person("张帅",81,"女");
我就可以直接覆盖我现在想要的东西
this
终于到了昂
表示当前对象引用(注意不是当前对象),可以借助this来访问对象的字段和方法
this的使用:
this.data;//访问成员变量
this.dut();//访问成员方法
this();//访问构造方法
首先阐述一下 静态方法不依赖对象所以不需要this帮助