面向对象的思想(Object Oriented Programming):
一切客观存在的事物都是对象,万物皆对象
任何对象,一定具有自己的特征和行为
→ 特征:→ 属性,一般为名词,代表对象有什么
对象
→ 行为:→ 方法,一般为动词,代表对象能做什么
在一组相同或类似的对象中,抽取出共性的特征和行为,保留所关注的部分。
同一个类,都有不同的特征属性和行为方法
属性:
通过变量表示,又称实例变量
数据类型 属性名; Stringname; int age;
属性定义在类的内部,方法的外部
方法:
通过方法表示,又称实例方法
public 返回值类型 方法名(){
//主体方法
}
public class Dog { //类名 String name; //属性的定义 int age; String sex; String furColor; public void eat() { //定义行为方法1 System.out.println("eat........"); } public void sleep() { //定义行为方法2 System.out.println("sleep......."); } }
public class Test { public static void main(String args[]) { Dog dahuang=new Dog(); dahuang.name="大黄"; //访问属性,赋值 dahuang.age=2; //对象名.属性名=值; dahuang.sex='母'; dahuang.furColor="黄色"; dahuang.eat(); //调用方法, 对象名.方法名(); dahuang.sleep(); } }
类: 定义了对象应具有的特征和行为,类是对象的模板。
对象: 拥有多个特征和行为的实体,对象是类的实例。
一个类可以对应多个对象实例
比如说 "狗" 这个类就可以有很多个对象,比如说对象1:大黄,对象2:旺财。。。。
每一个对象都有类该有的属性,而各个对象属性的值都各有不同
实例变量不会因为未赋值而出现编译错误,他们都有自己的默认值。
实例变量的默认值:
整数: 0
小数: 0.0
字符: \u0000(空格)
布尔: false
其他: null
也就是说在创建对象后未给对象对应的属性值赋值时,此时输出对象属性都会显示上述的默认值。
实例变量存在于类的内部,方法的外部,仅在本类有效,实例变量不允许重名,可以与局部变量重名,局部变量优先。
对象的实例方法包含两部分:方法的声明和方法的实现
方法的声明:
代表对象能做什么
组成:修饰符 返回值类型 方法名(形参列表)
方法的实现:
代表对象怎么做:级如何实现相对应的功能
组成:{逻辑代码}
在有些情况下,对象的同一种行为可能存在多种实现过程
例如:
人对象的“吃”行为就存在差异,吃饭和吃药的过程就存在差异。
public class Person { public void eat(食物a) { //吃食物 //咀嚼 //咽下 } public void eat(药物a) { //吃药 //喝水 //咽下去 } }
重载:一个类中定义多个相同名称的方法
要求:
方法名称相同
参数列表不同(参数的类型、个数、顺序不同都算)
与访问修饰符、返回值类型无关
调用带有重载的方法时,需要根据传入的实参去找到与之匹配的方法
好处:灵活,方便、屏蔽使用差异
public class Person { //四种都算重载 public void eat(){ } public void eat(String food) { } public void eat(String food,int i) { } public void eat(int i,String food) { } }
构造方法:
类中的特殊方法,主要用于创建对象。
特点:
名称与类名完全相同
没有返回值类型
创建对象时,触发构造方法的调用,不可通过句点手动调用
注意:
如果没有在类中显示定义的构造方法,则编译器默认提供无参的构造方法。
public class Test { public static void main(String args[]) { Dog dahuang=new Dog(); //new Dog();触发对象创建 dahuang.name="大黄"; //访问属性,赋值 dahuang.age=2; //对象名.属性名=值; dahuang.eat(); //调用方法, 对象名.方法名(); dahuang.sleep(); } } class Dog{ String name; int age; public Dog() { System.out.println(); } }
对象创建的过程:
内存中开辟对象空间
为各个属性赋予初始值
执行构造方法中的代码
[将对象的地址赋值给变量]
在上述代码块中dahuang(引用)中保存对象的地址,通过变量中的地址访问对象的属性和方法
构造方法也可以重载,遵循重载规则
public class Test { public static void main(String args[]) { Dog dahuang=new Dog(); //new Dog();触发对象创建 Dog wangcai=new Dog("wangcai");//创建对象时,传入参数,匹配对应的构造方法 Dog huahua=new Dog("huahua",1);//创建对象的同时,传值进入构造方法 } } class Dog{ String name; int age; public Dog() { System.out.println(); } public Dog(String name) { System.out.println(name); } public Dog(String name,int age) { System.out.println(name+"--"+age); } }
在类中,如果没有显示定义构造方法,则编译器默认提供无参构造方法
如果手动添加构造方法,编译器就不会默认提供无参构造方法,
这是根据自己的需求手动添加无参构造方法。
类是模板,可服务于此类的所有对象;this是类中的默认引用,代表当前实例;
当类服务于某个对象时,this则指向这个对象。
public class Demo { public static void main(String[] args) { Student s1=new Student(); s1.sayHi(); System.out.println(s1); Student s2=new Student(); s1.sayHi(); System.out.println(s2); } } class Student{ String name; int age; public void sayHi() { System.out.println(this.name); } }
上述代码块中,s1.sayHi()中调用的this指向的是s1开辟的地址空间块
com.qf.pro2103.day01.Student@15db9742
s2.sayHi()中调用的this指向的是s2开辟的地址空间块
com.qf.pro2103.day01.Student@6d06d69c
访问时根据this的指向不同,得到不同的name。
this用法(一):
调用实例属性、实例方法。
如:this.name this.sayHi()
public class Demo { public static void main(String[] args) { Student s1=new Student(); s1.sayHi(); } } class Student{ String name="罗翔"; int age; public void sayHi() { String name="张三"; System.out.println(name); System.out.println(this.name); } }
在上述代码中,实例变量和局部变量重名时,优先访问局部变量;
此时,如需访问实例变量,就需要添加this前缀。
不重名时可以省略this
this用法(二):
调用本类中的其他构造方法。如:this() this(实参)
class Student{ String name; int age; int id; public Student() { } public Student(String name,int id) { this.name=name; this.id=id; } public Student(String name,int id,int age) { this(name,id); //调用上面构造参数的逻辑代码this.name=name;和this.id=id; this.age=age; } public void sayHi() { System.out.println(name+"--"+age); } }
在构造方法中,调用本类的其他构造方法,即可复用构造方法的逻辑代码
上面的第二个和第三个构造方法中,有name和id的冗余代码
this()调用无参构造
this(实参)调用有参构造
构造时必须写在构造函数的首行