Java面向对象的基本概念

面向对象的基本概念

1、什么是面向对象?

​ Java语言就是面向对象的语言。要使用Java进行面向对象编程,首先建立一个面向对象的思想。面向对象是一种直观而且程序结构简单的程序设计方法。它比较符合人类认识现实世界的思维。

基本思想:把问题看成若干对象的组成,这些对象之间是独立的,但是他们之间又可以相互配合,连接和协调,从而共同完成整个程序实现的任务。

​ 面向对象有三大特征:封装、继承、多态

2、什么是对象?

​ 对象就是用来描述客观事物的一个实体。用面向对象的方法解决问题,需要对现实世界中的对象进行分析与归纳,找出哪些对象与解决问题的关联。

例如:华为手机、小米手机、苹果手机,把这些手机看成对象。

但是他们的之间具有不同特征。具体来说就是品牌、价格、性能不同。
3、什么是类?
上面所提到的手机对象之间具有一些共同的特征(属性):都有触摸屏,都有扬声器等、
还有一些共同的功能(或行为):能打电话,能拍照等。

把这些共同的特征和共同的行为组织到一个单元中,就得到类。

类是具有相同的属性和方法的一组对象集合。类定义了对象将会拥有一些特征(属性)和行为(方法)。

类与对象的关系就如同模具和用整个模具制作出的物品之间的关系。
一个类给出了他的全部对象的的一个统一的定义,而他的每个对象则都是符合这种定义的一个实体。
因此类和对象的关系就是抽象和具体的关系。类是多个对象进行综合的抽象的结果,是实体对象的概念模型,而一个对象是一个类的实例。

3、类的定义
面向对象的设计就是一个抽象的过程。

1.发现类,类定义了对象将会拥有的特征(属性)和行为(方法)。

​2.发现类的属性,对象拥有的静态特征在类中表示时称为类的属性。

3.发现类的方法,对象执行操作称为类的方法

例:定义一个Person类

[访问修饰符]  class 类名{...//类的内部代码}

访问修饰符:如public、private等。

class表示声明类的关键字。

类名首字母要大写。

属性

​ Java中的类的内部主要就包括属性和方法,对象所拥有的特征在类中称为属性。

定义属性的语法格式:

[访问修饰符] 数据类型   属性名;

​访问修饰符可以选的
除了访问修饰符之外,其他的语法和声明变量属性
方法
​ 对象执行操作的行为称为方法,
例如:人有工作的行为,称工作这个行为就是人这个类中的一个方法
​ Person 类还有其他的方法,如吃、喝、睡觉等。

​ 定义方法的语法格式:

[访问修饰符]  返回类型  方法名称(参数类型 参数名1,参数类型2 参数名2...){//方法体代码}

在定义行为(方法)时:
1.访问修饰符可以选择

​2.返回的类型可以是void,返回类型是void时,

表明没有返回值,方法体中不必使用”return“关

键字来返回具体数据,但是可以使用”return“关

键字来退出方法

​3.返回类型不是void,那么再方法体中一定要使

用”return“关键字,返回对应类型的结果,否则

程序会出现编译错误。

4.当需要在方法执行时,为方法传递参数时,

则需要参数列表,如果不需要参数传递,参数

列表可以省略

不过小括号不能省略,传递多个参数使用“,“分隔。

一个完整的简单Person类。

public class Person {

    public  String name;  //定义声明一个name属性

    public String sex;  //定义声明一个性别属性

    public  int age;     //定义年龄


    //Person类的一个工作行为()方法
    public void work(){

        System.out.println("工作理念是巴拉巴拉~~");
    }

2.1 对象的创建和使用
1、创建对象
类是一个事物的集合和抽象,代表这类事物共有的属性和方法,以后个对象称为类的实例,是类的一次实例化的结果,例如”张三“ 一个”Person“类的具体对象。

​ 类的对象可以调用类中的成员,如属性,方法

​ 创建对象的语法格式:

类名  对象名=new   类名();

1.new 是关键字
2.左边的类名为对象的数据类型
3.右边的类名称为类的构造方法

public static void main(String[] args) {

        //创建一个Person对象,对象名为person
       //person就是Person类的一个对象实例
        Person person = new Person();
        person.name="张三";//调用对象的name属性
        person.gender="男";//调用对象的gender属性
        person.age =18;   //调用对象的age属性
        person.work();   //调用对象的work方法
        
         //一个类中可以创建多个对象!
         Person person1 = new Person(); 
         Person person2= new Person();
              ...
              ...
              ...
    }

2.使用Java中的对象

​ 在java中,要引用对象的属性和方法,需要”.“

​ 使用java对象的语法格式:

	对象名.属性   //引用对象的属性
 person.name="张三";//调用对象的name属性
​	对象名.方法   //引用对象的方法
 person.work();   //调用对象的work方法

​ 面向对象的优点:

​ 1).与人类的思维习惯一致:面向对象的思维方式是从人类考虑问题的角度出发,把人类解决问题的思维过程转变为程序能够理解的过程、面向对象程序设计使用"类"来模拟现实世界中的抽象概念,用"对象"来模拟现实世界的实体从而用计算机解决现实问题

​ 2)信息隐藏,提高了程序的可维护性和安全性:封装实现了模块化和信息隐藏,即将类的属性和行为封装在类中,这保证了对他们的修改不会影响到其他对象,利于维护。
同时,封装使的在对象外部不能随意访问对象的属性和方法,避免了外部错误对它影响,提高了安全性.

​ 3)提高了程序的可重用性:一个类可以创建多个对象实例,体现了重用性。

3.1成员方法

类中成员主要包含两个部分:成员方法和成员方法

1、带参数的方法
在实际应用中经常使用带参数或有返回值的方法

例:
每个人的工作目标都不一样。
所以在Person类中定义不同的方法

public class Person{

    public String name;
    public String gender;
    public int age;

    //无参的工作方法
    public void work(){
        System.out.println(this.name+"工作目标: 搞钱");
    }

    //有参的工作方法
    public void work(String contect){
	System.out.println(this.name+"的工作目标:"+contect);
    }
      //带有返回值的无参方法
    public String works(){
        return "实现财富自由";
    }
}

带有参数的work()方法可供用户自己输入内容。
创建work方法时定义的参数 (String contect)叫形式参数,简称形参。
在调用work方法时用户输入并传入的参数为实参。

测试代码:

  public static void main(String[] args) {

        Person person = new Person();

        person.name ="老王";
        person.age =18;
        person.gender ="男";

        //将works方法的返回值赋给 contect变量
        String contect = person.works();
        System.out.println(person.name+"的工作目标:"+contect);
    }

2、方法重载:
方法重载是指一个类中定义多个同名的方法,但要求每个方法具有不同的参数类型或者参数个数。

特点:
1、在同一个类中。
2、方法名相同
3、参数个数或者类型不同
4、方法的返回值不能作为判断方法是否构成重载的依据。

3.2成员变量与局部变量

1、成员变量

类中的属性,即直接在类中定义的变量称为成员变量;
定义在方法的外部。
成员变量的作用域在整个类内部都是可见的,所有的成员变量都可以使用它,如果访问权限允许,还可以在类的外部使用成员变量。
如果在类的定义中没有给成员变量赋值,Java会给一个默认值,基本数据类型的值为0;引用数据类型值为null。
在下面的代码中Person类中的name、gender既不属于eat()方法也不属于work()方法,而是属于Person类本身的属性,就是Person类的成员。

public class Person{
	public String name;
	public String genger;
	public int age;
	
	public void eat(String name){
		System.out.println(this.name+"邀请"+name+"共进晚餐");
	}
	 public void work(){
        int age =18;
        System.out.println(this.name+age+"岁的工作理念: 搞钱");
    }

    public  void  work(String contect){

        System.out.println(this.name+"的工作理念:"+contect);
    }

    public void  showDetails(){
        System.out.println("姓名是:"+this.name+",性别为"+this.gender+",年龄是:"+this.age);
    }
}

成员变量可以在声明时赋初始值!

2、局部变量

局部变量就是定义在方法中的变量

work()方法中的变量age就是局部变量
虽然成员变量和局部变量age名称一样,但表示的不是一个变量。
局部变量在使用前需要赋值;否则可能编译出错。
局部变量和成员变量可以同名,并一起使用,局部变量具有更高的优先级。
作用域仅限于定义它的方法,在该方法外无法访问该局部变量。

3、数据类型

在java中变量的数据类型分为两种:基本数据类型、引用数据类型
java中引用数据类型包括三种:类、数组、接口

public class Person {
	public int age;
	}

public static void main(String[] args) {

        //基本数据类型
        int num1=11;
        int num2 =num1;
        System.out.println("num1等于:"+num1);
        num2=22;
        System.out.println("把num1赋给num2后,修改num2的值."+"num1等于:"+num1);
        System.out.println("*********");

        //引用数据类型
        Person person1=new Person();
        person1.age=11;
        Person person2=person1;
        System.out.println("person1.age等于:"+person1.age);
        person2.age=22;
        System.out.println("把person1对象赋给person2对象后,修改person2的age属性,"+"person1.age等于:"+person1.age);
    }

int为基本数据类型,当初始化num1并赋值后,将num1赋给num2,然后修改num2的值,运行后发现num1的值没有改变。

​ class为引用数据类型,当实例化person1对象并对其属性赋值后,将person1对象赋给person2对象,然后修改person2的值,运行后发现person1的属性值发生变化。

几乎同样的操作,为什么会有完全相反的结果?
这是因为int和class在内存种的存储方式不同,这也是基本数据类型和引用数据类型的主要区别。

对于基本数据类型,
不同的变量会分配不同的存储空间,并且存储空间中存储的是该变量的值,赋值操作传递的是变量的值,改变一个变量的值不会影响另外一个变量的值

对于引用数据类型
赋值是把原对象的引用(可以理解内存地址)传递给另外一个引用,对数组而言,当用一个数组名直接给另一个数组赋值时,相当于传递一个引用,此时,这两个引用指向同一个数组,也就是指向同一内存空间。

3.3构造方法

Java中,当类创建一个对象时会自动调用该类的构造方法,构造方法分为默认构造方法和带参数的构造方法

1.构造方法的定义

​ 构造方法的主要作用是进行一些数据的初始化

​ 定义构造方法的语法格式如下。

[访问修饰符] 方法名(参数列表){//方法体的代码}

​ 1).构造方法没有返回值

​ 2).默认构造方法没有参数,因此参数列表可选

​ 3).构造方法的方法名与类名相同

例:

为Person类定义一个构造方法

public class Person {

    
    public String name;
    
    public Person(){
        
        this.name="张三";
    }

}

Person的构造方法的作用是当Person类的对象创建时,将这个对象的name属性设置为“张三”。

​当开发人员没有编写自定义构造方法时,Java会自动默认添加构造方法,默认构造方法没有参数
若自定义了一个或者多个构造方法,则Java不会自动添加默认构造方法。

2.构造方法重载

​ 构造方法也可以重载,即在同一个类中可以定义多个重载的构造方法。

public class Person {

    public String name;
    
    public String gender;
    
    public int age;
    
    public Person(){  //无参的构造方法

        this.name="张三";
    }
    
    public Person(String name){
        this.name=name;      //带参数构造方法
    }
}

3.4 this关键字

(1)this.属性名

表示本对象自己的属性使用this调用成员变量,解决变量和局部变量的同名冲突

(2)this.方法名

表示本对象自己的方法

​ 我们给Person类增加了一个”打招呼”的方法叫做greet。在introduce方法当中,就可以通过”this.方法名”的方式来调用这个方法,表示调用的是”本对象自己的greet”方法。这是this关键字的第二种用法。当然,在introduce方法中并没有出现其他对象,所以方法名前面的this关键字也可以省略不写。

 public void greet(){
        System.out.println("hello,大家好");
    }
    
 public void introduce(){
        this.greet();
        System.out.println("我叫"+name+",今年"+age+"岁");
    }

​ 再跑一次测试:运行结果如下:

hello,大家好
我叫张三,今年20岁
s
Process finished with exit code 0


(3)this()
在this关键字的后面加上小括号,这样就表示调用了某个类自身的构造方法

//构造方法1
    public Person(String name,int age,double height){
        this(name,age); //调用构造方法2
        this.height=height;
    }
    
     //构造方法2
    public Person(String name,int age){

        this.name=name;
        this.age=age;
    }

(4)外部类名.this.属性

​ this关键字在我们编写内部类代码的时候,还有一种用途,那就是区分属性或方法的具体归属

public class Outter {

    public int a=0; //外部类的属性

    class Inner{
        public  int a=10;//内部类的属性
        public void printA(){
            System.out.println(a);//调用内部类的a属性,输出10
            System.out.println(this.a);//调用内部类的a属性,输出10
            System.out.println(Outter.this.a);//调用外部类的a属性,输出0
        }
    }
}

因为this是在对象内部指代自身的引用,所以this只能调用实例变量、实例方法和构造方法,不能调用类变量和类方法,也不能调用局部变量


版权声明:本文为zzq_001原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。