一、什么是对象
面向对象的思想(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是类中的默认引用,代表当前实例;
当类服务于某个对象时,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(实参)调用有参构造
构造时必须写在构造函数的首行