对于小而简单的问题,为了快速,为了方便,你自己会动手从头到尾处理;对于庞大且复杂的问题,你一个人,已经不够用了,时间不够,精力不够,学识也不够,所以你会找其他人来帮忙。而且个个都是专业的,那么问题是不是很快解决了!此时你面对的是你找来的帮手,就可以说你面向对象,这个对象就是你的帮手。
1.面向对象的思考方式
遇到复杂问题,先从问题中找名词,然后确立这些名词 哪些可以作为类,再根据问题需求确定的类的属性和方 法,确定类之间的关系。
2.对象和类的概念
对象:是具体的事物
类:是对对象的抽象类
可以看做是一个模版,或者图纸,系统根据类的定义来造出对象。
两者的关系:类是一个抽象的概念,对象是类实例化出来的,对象中含有类的属性,类是对象的抽象。
一.类的定义
语法格式:class 类名{
}
class是定义类的关键字,类名需要满足命名规则和规范,类的命名应该使用大驼峰命名原则
对与一个类来说,一般有三种常见的成员:属性 field 、方法 method 、构造器 constructor(在后面笔记中) 。这三 种成员都可以定义零个或多个。
//实例代码-定义一个汽车类
public class Class003_Car {
//分析特性 颜色\价格\品牌
//定义成员变量(也叫类的属性)
public int money;
public String color;
public String barand;
//定义成员方法
public void run(){
System.out.println("一辆价值"+money+"万元的"+color+barand+"正在跑!");
}
}
(1)属性(成员变量)
属性作用范围是整个类体
属性定义格式:在类中,所有方法和代码块之外
[修饰符] 属性类型 属性名 [= 默认值] ;
注:在定义成员变量时可以对其初始化(赋值),如果不对其初始化,Java使用默认的值对其初始化。(数值:0,0.0 char:\u0000, boolean:false, 所有引用类型:null)
(2)方法
方法则用于定义该类或该类的实例的行为特征和功能实现。方法是类和对象行为特征的抽象。
面向对象中,整个程序的基本单位是类,方法是从属于类的。
方法定义格式:[修饰符] 方法返回值类型 方法名(形参列表) {
方法体;
}
二.对象的创建和使用
必须使用new关键字创建对象
( new关键字的作用:
1.为对象在堆内存开辟空间,成员变量会跟随对象进入到堆内存并附默认值
2.调用构造器为对象初始化信息
3.将地址返回给引用)重点记住
使用对象(引用).成员变量来引用对象的成员变量
使用对象(引用).方法(参数列表) 来调用对象的方法
同一类的每个对象有不同的成员变量存储空间
同一类的每个对象共享该类的方法
//实列代码
public class Class004_CarTest {
public static void main(String[] args) {
//创建汽车对象
Class003_Car car1 = new Class003_Car();
//通过引用使用对象的成员变量 引用存的是对象的地址
car1.color = "黑色";
car1.barand="保时捷";
car1.money=1200000;
//通过引用调用对象的方法
car1.run();
}
}
class Class003_Car {
//定一个小汽车类
//分析特性 颜色\价格\品牌
//定义成员变量
public int money;
public String color;
public String barand;
//定义成员方法
public void run(){
System.out.println("一辆价值"+money+"万元的"+color+barand+"正在跑!");
}
}
3.构造器(或者叫做构造方法,constructor)
构造器也是很重要的,之所以单拉出来写它,因为它对于初学java的人来说很陌生,作为类中常见的成员之一重要性不言而喻。
Java通过new关键字来调用构造器,从而返回该类的实例,它的作用是初始化对象信息,不是用来创建对象的。
格式: 修饰符 类名(参数列表){}
注:
- 构造器可以实现重载,因为是特殊的方法
- 没有显示定义构造器,编译器会默认提供空构造
- 如果存在显示 定义构造器,不会提供任何构造器,包括空构造
- 至少提供一个空构造...按需提供带参,不绝对,根据需求决定
//实例代码
public class Class01_Constructor {
public static void main(String[] args) {
//创建对象同时赋值
Dog dog = new Dog("小花","金毛");
dog.lookDoor();
new Dog("安安","金毛").lookDoor();
dog.show();
}
}
class Dog{
public String name;
public String type;
//定义没有参数的构造器
public Dog(){
}
//定义一个参数的构造器
public Dog(String dogName){
//把实参接收到的数据赋值给了当前对象的成员变量name
name = dogName;
}
//
//定义两个参数的构造器
public Dog(String name,String type){
//this关键字用在构造器中的首行
this.name = name;
this.type = type;
}
public void lookDoor(){
System.out.println(name+"正在看家!");
}
}
4.this关键字
普通方法中,this总是指向调用该方法的对象。
构造方法中,this总是指向正要初始化的对象。
让类中的一个方法,访问该类的另一个方法或属性。 访问属性更常用,用来区分同名的形参和属性。
使用this关键字调用重载构造方法。避免相同的初始化代码,只能在构造方法中用,并且必须位于构造方法的第一句。(构造器的首行调用本类中的其他构造器---this(参数列表))
区分同名的成员与局部的问题
默认就近原则
如果出现同名问题,想要指代调用成员,通过this.成员-->因为this指代对象,通过对象调用成员
如果没有同名问题,可以省略this.调用成员
在构造器中使用this,默认指代当前new的对象,存储的是this的对象的地址
在的成员方法中使用this,this在成员方法中默认指代当前调用成员方法的对象
注:
1.多个构造器之间不能相互调用,否则无法停止调用
2.在static修饰的内容中不能使用this
5.static关键字
在类中,用static声明的成员变量为静态成员变量不被static修饰的变量叫实例变量
- 它为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化
- 对于该类的所有对象来说,static成员变量只有一份。 被该类的所有对象共享!!
- 可以使用”对象.类属性”来调用。不过,一般都是 用“类名.类属性” 。
作用:成员修饰符:只能修饰成员位置的内容,不能修饰局部
修饰变量:静态变量|类变量
修饰方法:静态方法|类方法
用static声明的方法为静态方法,不被static修饰的方法叫做实例方法
不需要对象,就可以调用(类名.方法名)
也可以通过对象引用或类名(不需要实例化)访问静态成员。
注:
- 静态内容是独一份的,静态变量存在与静态区中,多个对象共享的资源
- 成员内容跟随对象存在与对象的堆内存中,多个对象,就有多份成员
- 初始加载顺序: 先静态后成员
- 静态内容在类第一次加载完成之后就会进行初始化
- 成员变量必须在执行到new对象的时候,才会存在对象的堆内存,在对象的堆内存中才会有成员变量
- 在静态内容中,可以直接使用静态的内容,需要跟随对象使用成员内容
- 在成员内容中,可以直接使用静态内容,可以直接使用成员内容
//实例代码
public class TestStatic {
int a;
static int width;//静态变量
//静态方法
public static void gg(){
System.out.println("gg");
}
//实例方法
public void tt(){
System.out.println("tt");
}
//静态方法
public static void main(String[] args){
TestStatic hi = new TestStatic();
TestStatic.width = 2;
TestStatic.gg(); //gg();一般通过类名调用
hi.gg(); //通过引用也可以访问static变量或static方法。不过,一般还是使用类名.static成员名来访问。
gg();
}
}
6.block块(了解)
{} 块 自成作用域
分类 执行时机
局部代码块|普通语句块 : {}定义在方法中 跟随方法的调用而执行
1) 作用域看待
2) 语义化
构造块 : {}定义在类中方法外 跟随new一起使用
1) 成员内容的初始信息,比构造器中的代码跟早执行
2) 对对象的某些内容进行初始
静态块 : static修饰{},定义在类中方法外 在类第一次加载完成之后执行
1) 会为静态内容进行初始化
2) 信息的配置,资源的加载
同步块 : 多线程学习
构造块中的代码会先于构造器中的代码之前执行
如果存在多个构造块,会从上到下一次执行
静态块在类第一次加载完成之后执行,并且仅会执行一次
如果存在多个静态块,会从上到下一次执行
程序执行顺序:静态块-->main-->创建对象 --> 构造块 --> 构造器