**
面向对象
**
1.1 世界是有什么构成的?
只要能看见的东西都可以认为是一个具体的对象。
思考:你是如何认识新事物的?
从过往的见过的事物中总结特征和行为并上升为类的概念,通过类去认知新事物,对新事物进行归类。进而分析新事物的特性和行为。
1.2 类(Class)的概念
类是一组具有相同特征和行为的对象的抽象描述。
类描述的是抽象(抽出象的部分)概念,用于描述一个群体。
类就是现实生活中所说的”类型”
类的概念用于对新事物归类,用于在现实生活中认知新事物。但在程序中,类的作用是?
类在程序中用于快速的创建更多同类型的对象。
1.3 对象的概念
对象是类的一个具体实现,是客观存在的一个具体事物/实体。具有唯一性和独立性。
对象用于描述客观事物的一个实体,由一组特性和行为构成。
ð 客观存在的对象一定属于某个类型,且一定具备该类型的特性和行为。
类是抽象的,表示群体概念
对象是具体的,表示个体概念。
1.4 程序中的类和对象
1.4.1 属性(property/attribute)
类或者对象的特征称为属性.对象属性具备的值称为属性值。
同一类对象都具有相同的属性,但属性值一定不一样。
对象是数据的载体。
属性 field,或者叫成员变量
属性用于定义该类或该类对象包含的数据
属性作用范围是整个类体
在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。
(数值:0,0.0 char:\u0000, boolean:false, 所有引用类型:null)
1.4.2 方法
类或者对象的行为称为方法.
同一类对象都具有相同的方法。
总结
类是一组具有相同属性和方法的对象的集合。
对象是用来描述客观事物的一个实体,由一组属性和方法构成
1.5 类的定义
定义类的语法
[修饰符] class 类名{
// 属性
// 方法
}
类中方法的定义语法
[修饰符] 返回值类型 方法名(形成列表){
//、、、
}
此时修饰符不需要static。
需求:定义一个学生类
public class Student{
// 属性
String sId;
String name;
int age;
char gender;
// 方法
public void sayHi(){
System.out.println(name + " say hello!");
}
public void learn(String cName){
System.out.println(name + " is learning " + cName);
}
}
类中包含两个成员,一个是成员变量也叫属性,有些地方也称为字段(field),一个是成员方法简称方法。
1.6 对象的初始化
1.6.1 实例化
类创建后,可以用于类来创建一个对象。语法
类型 对象 = new 类型();
public class Test01{
public static void main(String[] args){
// 创建一个对象
// 【1】s1是引用数据类型,其指向的内存在heap区
// 【2】通过Student实例化了一个对象s1
Student s1 = new Student();
// System.out.println(s1);
// 【3】.语法访问属性和方法
s1.name = “张三”;
s1.sId = “001”;
s1.age = 20;
s1.showInfo();
s1.sayHi();
s1.learn(“java”);
Student s2 = new Student();
System.out.println(s2);
}
}
总结
[1] 对象的属性和方法都通过.语法类访问。对象.xxx 或者 对象.xxx() 来调用。故此成员变量/属性也称为实例变量。s1称为Student的一个实例。实例就是对象,对象就是实例。
[2] 通过对象或者实例调用的方法称为实例方法。
1.6.2 对象的内存图
1.7 面向对象编程
在未来的软件开发过程中,需要完成很多功能,功能的完成需要方法完成,方法需要操作数据。
编程过程中需要一个逻辑体把数据和方法整合在一起。这个逻辑体就是对象。所以完成一个功能时,一定要先找到对应的对象。对象是由类产生的。类可用于把显示生活中的需求抽象成类,并实例化对象解决具体需求。这种思维方式就是面向对象思维,这个编程方法称为面向对象编程。
需求:用手机播放歌曲。
public class Test03{
public static void main(String[] args){
Phone phone = new Phone();
phone.brand = “Apple”;
phone.type = “iPhone x”;
phone.price = 5999.0f;
Music music = new Music();
music.name = “光年之外”;
music.author = “G.E.M”;
music.player = “G.E.M”;
music.lrc = “感受停在我发端的指尖\n”+
“如何瞬间冻结时间\n”+
“记住望着我坚定的双眼\n”+
“也许已经没有明天\n”+
“面对浩瀚的星海\n”+
“我们微小得像尘埃\n”;
phone.play(music);
}
}
类方法、构造方法、实例方法的区别
-
构造方法
构造方法负责对象的初始化工作,为实例变量赋予合适的初始值。必须满足以下的语法规则:
方法名与类名相同;
不要返回类型(例如return、void等);
不能被static、final、native、abstract和synchronized修饰,不能被子类继承。
例如以下例子:
1.1. 默认构造方法
默认构造方法时没有参数的构造方法,分为
a.隐含的默认构造方法:public ClassName(){}
b.程序显示定义默认构造方法:public Employee(){this("无名氏");}
可以调用ClassName类的默认构造方法来创建对象,没有默认构造方法则不合法,例如:
1.2. 重载构造方法
通过new创建一个对象后,在不同的条件下,对象可能会有不同的初始化行为,可以通过重载构造方法来表达对象的初始化行为。具体参考this关键字的用法。
1.3. 子类调用父类的构造方法
父类的构造方法不能被子类调用,可以通过super语句调用父类的构造方法。例如:
用super调用父类的构造方法必须遵守以下规则:
1. 子类的构造方法中不能直接通过父类的方法名调用父类的构造方法,使用super语句;
2. 加入在子类的构造方法中有super语句,它必须作为构造方法的第一条语句(同this语句);
1.4. 构造方法的作用域
当前类的其他构造方法通过this语句调用;
当前类的子类的构造方法通过super语句调用;
在程序中通过new语句调用。
1.5. 构造方法的private访问级别
构造方法为private级别时,意味着只能在当前类中访问它:当前类的其他构造方法中可以通过this语句调用,此外还可以在当前类的成员方法中使用new调用。
以下场合中,可以把类的所有构造方法声明为private:
这个类中仅仅包含一些供其他程序调用的静态方法,没有任何实例方法。
禁止这个类被继承。声明为private后,如果定义了它的子类,子类的方法中无法调用父类的任何构造方法。
类需要把构造自身实例的细节封装起来,不允许其他程序通过new语句创建这个类的实例。提供静态方法。
Java中类的方法分为类方法(用static修饰,也叫静态方法)和实例方法(没有用static修饰,也叫非静态方法),这两种方法之间有什么区别呢?
一. 实例方法
当类的字节码文件加载到内存中时,类的实例方法并没有被分配入口地址,只有当该类的对象创建以后,实例方法才分配了入口地址。从而实例方法可以被类创建的所有对象调用,还有一点需要注意,当我们创建第一个类的对象时,实例方法的入口地址会完成分配,当后续在创建对象时,不会再分配新的入口地址,也可以说,该类的所有对象共享实例方法的入口地址,当该类的所有对象被销毁,入口地址才会消失。
二. 类方法
当类的字节码文件加载到内存,类方法的入口地址就会分配完成,所以类方法不仅可以被该类的对象调用,也可以直接通过类名完成调用。类方法的入口地址只有程序退出时消失。
因为类方法的入口地址的分配要早于实例方法的入口地址分配时间,所有在定义类方法和实例方法是有以下规则需要遵循:
- 在类方法中不能引用实例变量
实例变量的定义类似实例方法,没有用static修饰的变量,实例变量的创建与实例方法的创建相同,也是在类的对象创建时完成,所以在类方法中是不能引用实例变量的,因为这个时候实例变量还没有分配内存地址。
- 在类方法中不能使用super和this关键字
这是因为super和this都指向的是父类和本类的对象,而在类方法中调用的时候,这些指代的对象有可能都还没有创建。
- 类方法中不能调用实例方法
原因同1。
与类方法相比,实例方法的定义就没有什么限制了:
-
实例方法可以引用类变量和实例变量
-
实例方法可以使用super和this关键字
-
实例方法中可以调用类方法