栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

06 面向对象

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

06 面向对象

面向对象
  • 简单概念
    • 成员方法
      • this关键字
          • 注意:

简单概念

+++++++++++++++++++++++++++++++++++++++

1面向对象的三个特点:继承 封装 多态


2对象是什么 可以是车 可以是人 可以是任何能够具体描述的东西


3什么是类
类可以具有属性和方法
例如人类
具有什么样子的特点可以描述叫做属性
方法是指能够做什么事情(对象执行的操作)

用Class来定义类
class 类名

public  class  Person{
  
  //省略类的内部具体的代码
}

@1定义类名要注意首字母要大写
@2访问修饰符如public、private、等是可选的


4属性的定义(对象所具有的特征)

public class Person1 {

    

    public String name; //定义一个人的姓名
    public String gender; //定义一个人的性别
    public int   age ;    //定义年龄

}


5方法的定义
@1定义方法的格式:
【访问修饰符}】返回类型 方法名称 (参数类型 参数1,参数类型 参数2,){
方法体代码
}

@2访问修饰符是可选的
@3返回类型可以是VOID,在定义方法时,返回类型为VOID时没有标明返回值,方法体中不必使用return;返回具体数值时,可以使用return返回数值,并且要注意返回值的对应类型,否则会出现编译错误。
@4当需要方法体执行时候才为方法传递参数列表,如果不需要传递参数就可以省略;小括号不可以省略,传递多个参数时用半角逗号进行分隔

public class person2 {

    public String name;
    public String gender;

    public int age;


    //定义人类的行为
    public void work(){
        System.out.println(this.name+"的工作理念,搞钱");
    }
}


6 创建和使用对象
@1创建对象
格式 类名 对象名 =New 类()
例如Person hanbing = new Person();

new是关键字
左边的类名为对象的数据类型
右边的类名()为类的构造方法

@2使用JAVA对象
对象名,属性 //引用对象的属性
对象名.方法名() //引用对象的方法

如下所示

public static void main(String[] args) {

        //创建对象
        person2 person2 = new person2();

        //使用对象
        person2.name = "老王";  //为对象的name属性赋值
        person2.gender ="男";   //调用对象的gender的属性赋值
        person2.age = 18;       //调用对象的age的属性赋值
        person2.work();         //调用对象的work方法

    }

7对象数组
需求:

​ 定义包含3个元素的对象数组,数据类型为Person,并使用for循环遍历

public static void main(String[] args) {

        Person3[] person3s = {new Person3(22,"老王"),new Person3(23,"小王"),new Person3(24,"王炸")};

        for (int i = 0; i < person3s.length; i++) {

            System.out.println("age属性等于"+person3s[i].age+","+"name属性等于"+person3s[i].name);

        }

    }

对象数组,其实对象数组的数据基本类型就是具体的类名,对象数组存储的就是这个类的对象,每个数组元素就是一个对象,当根据下标找到某个元素时,可以按照对象的使用来使用该元素
​

成员方法

类成员主要包含两部分:成员方法和成员变量
1 每个人都有不同的工作理念,在person类中定义工作的方法,并通过参数接受工作理念;

分析:带有参数的work()方法可以接受用户输入的内容。创建work()方法时定义的参数叫做形式参数,简称形参。调用方法时传入的参数叫做实际参数,简称实参。

eg:

public class Person4 {

    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 "实现财富自由";
    }
}

测试代码

 public static void main(String[] args) {

        Person4 person4 = new Person4();

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

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

输出结果为

老王的工作理念:实现财富自由

Process finished with exit code 0


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

eg1:定义一个不带参数的work()的方法并观察 他们之间的区别。

public class Person5 {


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

    public void eat(String name){
        System.out.println(this.name+"邀请"+name+"共进晚餐");
    }

    public void work(){

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


    public  void  work(String contect){

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

}

一个需要输入参数一个不需要参数

@2方法重载的特点……………………重要
1在同一个类中
2方法名相同
3参数类型和个数不相同
4方法返回值不能作为判断方法之间是否构成方法重载的依据


3 成员变量
1成员变量的作用域
类中的属性,也就是直接定义在类里面的变量称为 成员变量,它定义在方法 的外部。

在下面代码person类中的name gender既不属于eat()方法,也不属于work() 而属于
person类本身的属性,他们是person类的成员变量
代码如下

public class Person5 {

    public  String name=;
    public  String gender;
    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 成员变量和局部变量之间的区别:

@1作用域不同
局部变量的作用域仅限于定义它的方法,在该方法外无法访问它,成员变量的作用域在整个类内部都是可见的,所有的成员方法都可以使用它,如果访问权限允许,还可在类外部使用成员变量
@2初始值不同
对于成员变量,如果在类定义中没有赋予初始值,JAVA会自动给他一个默认值,基本数据类型的值为0,引用类型的值为null,但是java不会赋予局部变量初始值,因此局部变量需要赋值后使用。
@3同名规则
在同一个方法中,不允许有同名 的局部变量,在不同的方法里,允许有同名的局部 变量
局部变量可以和成员变量名同名,并一起 使用,局部变量具有更高的优先级


4.数据类型
在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在内存种的存储方式不同,这也是基本数据类型和引用数据类型的主要区别。

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

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


4 构造方法
@1定义
1java中,当类创建一个对象时会自动调用该类的构造方法,构造方法分为默认构造方法和带参数的构造方法。
2构造方法的主要作用是进行一些数据的初始化
书写格式
【访问修饰符】方法名(【参数列表】){
//省略
}
构造方法没有返回值
默认构造方法没有参数,因此参数列表可选
构造方法的方法名与类名相同
eg:

public class Person {

    
    public String name;
    
    public Person(){
        
        this.name="寒冰";
    }

}

在这个构造方法里面为person类的对象创建后,将其name值赋值为寒冰;如果没有编写自定义的构造方法,那么系统会自动添加默认的构造方法,默认的构造方法没有参数;如果自定义一个或者多个构造方法,系统不会自动添加默认的构造方法。


2 构造方法重载

构造方法也可以重载,和一般方法重载等技术实现信息的输出。
eg:

public class Person {

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

        this.name="寒冰";
    }
    
    public Person(String name){
        this.name=name;      //带参数构造方法
    }
    
    public void work(){
        System.out.println(this.name+"的工作理念,干活挣钱又饭吃");
    }
    
    public void work(String contect){
        
        int age =this.age;
        System.out.println(this.name+age+"岁的工作理念:"+contect);
    }
}
 public static void main(String[] args) {


        Person guest = new Person("寒冰");

        System.out.println("大家号,欢迎"+guest.name+"来到地球村");

        Scanner input =new Scanner(System.in);

        switch (input.nextInt()){


            case 1:
                guest.gender="男";
                break;

            case 2:
                guest.gender="女";
                break;
            default:
                System.out.println("操作失误");
                return;
        }

        System.out.println("请输入您的年龄:");
        guest.age=input.nextInt();     //为对象的年龄赋值
        guest.work();             //调用无参work()方法
        System.out.println("请重新输入您的工作理念:");
        String contect=input.next();
        guest.work(contect);    //调用有参work()方法
        System.out.println("***********");
    }

测试代码

this关键字

在成员变量的示例中多次用到了this关键字,this的含义是什么呢?

​ this关键字是对一个对象的默认引用,每个实例方法内部都有一个this引用变量,指向调用这个方法的对象,其实就是指当前对象的引用,通俗点理解本对象自己

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

public class Person {

    public String name;

    public int age;

    public double height;


    public Person(String n,int a,double h){
        name=n;
        age=a;
        height=h;
    }

    public void introduce(){
        System.out.println("我叫"+name+",今年"+age+"岁");
    }

}

public static void main(String[] args) {
        Person person = new Person("张三", 20, 178.5);
        person.introduce();
    }
    

运行结果:

我叫张三,今年20岁

Process finished with exit code 0

二.This.方法名:
我们 on类增加了一个”打招呼”的方法叫做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

三.this.关键字
​ 还有另外一种很重要的用法,那就是在this关键字的后面加上小括号,这样就表示调用了某个类自身的构造方法,为了讲解这种用法我们再来修改一下Person类:

​ 我们给Person类又增加了一个构造方法。这个构造方法只有2个参数,并且只初始化2个属性。为了讲述方便,我们把上面的3个参数的构造方法称之为”构造方法①”,把下面的2个参数的构造方法称之为”构造方法②”。通过观察不难发现,这两个构造方法当中前2行代码是相互重复的,为了避免这种重复性的代码出现,我们可以在”构造方法①”当中调用”构造方法②”。调用的方式如下:

//构造方法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;
    }

四.外部类名.this.属性
内部类可以直接访问外部类的属性

public class Outter {

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

    class Inner{

        public void printA(){
            System.out.println(a);//内部类方法调用外部类的属性
        }
    }
}

测试代码

 public static void main(String[] args) {

        //先创建外部类
        Outter outter = new Outter();
        //再创建外部类的内部类
        Outter.Inner inner = outter.new Inner();
        inner.printA();
    }

实际输出

0

Process finished with exit code 0
//表示内部类方法调用外部类的属性

分析:

​ 在这段代码中,定义了外部类Outter,Outter有一个属性a,并且Outter中又定义了内部类,在内部类的printA()方法中调用了外部类的a属性。我们都知道,一个内部类可以直接访问它所在外部类的属性和方法。这个特性在我们的上面这段代码中得到了体现。但是,如果内部类中出现了与外部类同名的属性或方法时,该如何区分调用的到底是哪个属性或方法呢?比如说,在Inner类中也出现了a属性,那么输出语句中的a到底是指哪个a呢?很简单,如果输出语句中直接写a,那么调用的是内部类的a属性。为了强调它是内部类的a属性,我们也可以在a的前面加this关键字。如果我们希望调用的是外部类的a属性,可以用”外部类名.this.a”的方式来调用

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只能调用实例变量、实例方法和构造方法,不能调用类变量和类方法,也不能调用局部变量。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1014073.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号