面向对象编程——JAVA

@月月鸟

Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心。
围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范、继承是类与类之间联系的一种形式、而多态为系统组件或模块之间解耦提供了解决方案。

在这里插入图片描述
面向对象和面向过程的思想有着本质上的区别, 作为面向对象的思维来说,当你拿到一个问题时,你分析这个问题不再是 第一步先做什么,第二步再做什么(面向过程) 这是面向过程的思维
   面向对象有一个非常重要的设计思维:合适的方法应该出现在合适的类里面

面向对象

对象是用于计算机语言对问题域中事物的描述,对象通过“属性(attribute)”和“方法(method)”来分别对应事物所具有的静态属性和动态属性。

类是用于描述同一类的对象的一个抽象的概念,类中定义了这一类对象所具有的静态属性和动态属性

  • 类是用于描述同一类的对象的一个抽象的概念,类中定义了这一类对象所具有的静态属性和动态属性
  • 类可以看成一类对象的模板,对象可以看成该类的一个具体实例。

1. 定义类

抽象对象之间的共同特征,是具有相同属性和方法的一组对象的集合

  • 类 格式:
   【访问修饰符】class 类名{
    // 类的内部具体代码
  	   }
  
 // 人类
public class person {   
  // 类的内部具体代码
}
  • 类 属性:
  【访问修饰符】数据类型 属性名
 // 人类
public class person {
	//姓名
 	public String name;
 	//年龄
 	publi  int ags;
}
  • 类 方法
  【访问修饰符】返回类型 方法名称(参数类型  参数名1,参数类型  参				数名2,······){
   // 方法的内部具体代码	
  }
public void work(){
	System.out print(this.name+"    ");
}

2 . 创建和使用对象

  • 创建对象
类名 对象名 = new 类名();
Person  hanbing = new Person();
  • 使用对象
对象名. 属性
对象名. 方法名
hanbing.name = "寒冰";
hanbing.age =  22;
  • 对象数组
public class Person {

	// 属性
	public int age;
	public String name;

	// 有参构造方法
	public Person(int age, String name) {
		this.age = age;
		this.name = name;
	}

	public static void main(String[] args) {
		Person s = new Person(2, "康");
		Person q = new Person(3, "李");
		Person[] a = { s, q };
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i].age + a[i].name);
		}

	}
}

输出结果为:
2康3李

成员方法

1. 带参数的方法

方法的返回值(两种情况):

  • 如果方法具有返回值,方法中必须使用关键字return返回该值,返回值类型为该返回值的类型
public class Student{

    String name = "张三";

    public String  getName(){

            return name;

  }

   //……

}

语法:return 表达式; 作用: 跳出方法、返回结果;

  • 如果方法没有返回值,返回值类型为void
public class Student{

    String name = "张三";

    public void getName(){

    }

   //……

}

方法调用:
在这里插入图片描述
定义带参数的方法:

<访问修饰符>  返回类型  <方法名>(<形式参数列表>) {

     //方法的主体

}

访问修饰符:该方法允许被访问调用的权限范围;返回类型:方法返回值的类型;形式参数列表:传送给方法的形参列表

public class StudentsBiz {

String[ ] names = new String[30];   

public void addName(String name) {   (没有返回值)

//增加学生姓名                   (一个形式参数)

}

public void showNames() { //显示全部学生姓名

                }

}

调用带参数的方法:

对象名.方法名(参数1, 参数2,……,参数n)   (实参列表)

public static void main(String[] args) {

        StudentsBiz st = new StudentsBiz();      (先实例化对象,再使用方法)

        Scanner input = new Scanner(System.in);

        for(int i=0;i<5;i++){

            System.out.print("请输入学生姓名:");

            String newName = input.next();

            st.addName(newName);      (实参的类型、数量、顺序都要与形参一一对应)

        }

        st.showNames();

    }

总结:

形参和实参
1.方法定义处,参数叫做形式参数,也叫形参(主要约束参数的类型的)
2.形参名字可以随便取,但是要符合驼峰命名规则,同时要有意义
3.方法调用处,参数叫做实际参数,也叫实参
4.实参名字也可以随便取,但是遵循驼峰命名规则,同时也要有意义
5.实参和形参的类型必须一致,名字可以一致,也可以不一致
6.方法有没有返回值,和方法有没有参数,没有任何关系
7.方法参数可以有一个,也可以有多个,多个参数之间用逗号隔开(形参和实参都是这样)
8.形整和实参数量一定要一致,数据类型一定要一致

2.方法重载

在这里插入图片描述
方法名 一样,但参数不一样,这就是重载。
所谓的参数不一样,主要有两点:第一是参数的个数不一样,第二是参数的类型不一样。只要这两方面有其中的一方面不一样就可以构成方法的重载了。

public class TestOverLoad {
    void max(int a, int b) {
        System.out.println(a > b ? a : b);
    }
    /*
     * int max(int a, int b) { 
     *         return a > b ? a : b; 
     * }
     */
    void max(float a, float b) {
        System.out.println(a > b ? a : b);
    }
}

注意:

  • 这里有void修饰符的两个max方法名字相同,但它们的参数类型不一样,所以可以构成重载。
  • 而int max(int a , int b)方法与void max(int a, int b)方法是不构成重载的,现在它们是重名的两个方法,在一个类中声明两个重名的方法是不允许的,编译会出错。
  • 方法名一样,参数类型一样,只有返回值不一样,这个不构成重载,因为方法可以这么调用,调用一个方法时可以不使用的它返回值,所以当调用这两个方法时,把整型的数传进去,由于两个方法都是一样的名字,一样的参数类型,所以编译器无法区分到底要调用的是哪一个方法。
  • 构成重载深层次的原因:只要这两个方法编译器能区分开来,在调用的时候知道要调用的是哪一个,不会产生混淆,这两个方法就构成重载。

示例:

int max(int a, int b) {
    System.out.println("调用的int max(int a, int b)方法");
    return a > b ? a : b;
}
     
int max(short a, short b) {
    System.out.println("调用的int max(short a, short b)方法");
    return a > b ? a : b;
}

这两个方法也是可以构成重载的,因为编译器一看到整数,就会把它当作int类型。所以当把整数传进来的时候,编译器首先调用的是max(int a , int b)这个方法。而要想调用max(short a ,short b)这个方法,那么就得在main方法里面这样写:

public static void main(String[] args) {
    TestOverLoad t= new TestOverLoad();
    t.max(3,4);  //这里调用的是max(int a , int b)这个方法
    short a = 3;
    short b = 4;
    t.max(a, b);  //这里调用的是max(short a , short b)这个方法。
}

3.成员变量

成员变量和局部变量:

变量声明的位置决定变量作用域

变量作用域确定可在程序中按变量名访问该变量的区域

成员变量和局部变量的区别:

  • 作用域不同

局部变量的作用域仅限于定义它的方法

成员变量的作用域在整个类内部都是可见的

  • 初始值不同

Java会给成员变量一个初始值

Java不会给局部变量赋予初始值

注意:

  1. 在同一个方法中,不允许有同名局部变量;在不同的方法中,可以有同名局部变量

  2. 在同一个类中,成员变量和局部变量同名时,局部变量具有更高的优先级

4.构造方法

一个新对象初始化的最终步骤是通过new关键字去调用对象的构造方法,构造方法需满足如下要求:

(1)方法名必须与类名称完全相匹配;

(2)构造方法不需要返回类型;

(3)构造方法不能被static、final等关键字修饰,且不能有return返回语句。
(4)在创建对象时,要调用new,如:book b1=new book();

(5)当没有指定构造方法时,系统会自动添加无参的构造方法

(6)当有指定构造方法时,无论该构造方法是有参,还是无参,系统都不会再自动添加无参的构造方法

(7)构造方法的重载:方法名相同,但参数不同的多个方法,调用时会自动根据不同的参数选择相应的方法

无参的构造方法

class person{

  public person(){

    System.out.println("无参的构造方法被调用了。。。");

  }

}

class Ex11{

  public static void main(String[] args){

     person p=new person();

  }

}

有参的构造方法(目的就是为了给对象实例变量赋值)

class person{

  int age;

  public person(int a){

    age=a;

  }

  public void speak(){

    System.out.println("I am "+age+" years old");

  }

}

class Ex11{

  public static void main(String[] args){

    person p=new person();

    p.speak();

  }

}

构造方法重载

package test;

public class Person {
    String name;
    int age;
    public Person() {
        System.out.println("无参数构造方法");
    }
    public Person(String name) {
        this();
        this.name = name;
        System.out.println("姓名:"+name);
    }
    public Person(String n, int a) {
        this(n);
        this.age = a;
        System.out.println("姓名:"+name+" "+"年龄:"+age);
    }
    

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void getName() {
        System.out.println("姓名:"+name);
    }
    public void getAge() {
        System.out.println("年龄:"+age);
    }

    public static void main(String[] args) {
        Person p = new Person("张三",20);
        p.getAge();
        p.setAge(30);
        p.getAge();
    }
}

this关键字:


/*

  关键字this:

    1,在普通方法中,关键字this代表方法的调用者,即本次调用了该方法的对象
    2,在构造方法中,关键字this代表了该方法本次运行所创建的那个新对象
*/
class A
{
    private int i;
    public A(int i)
    {
        this.i = i;  //将形参 i 赋给该构造方法本次运行所创建的那个新对象的i数据成员
    }
    public void show(){
        System.out.println("i = " + this.i);
            //this表示当前时刻正在调用show方法的对象
            //this可以省略
    }
}
public class TestThis
{
    public static void main(String[] args){
        A aa1 = new A(100);
        aa1.show();
    
        A aa2 = new A(200);
        aa2.show();
    }   
}
  • 使用this 调用成员变量,解决成员变量和局部变量的同名冲突。
  • 使用this调用成员方法。
  • 使用this调用重载的构造的方法,只能在构造方法中使用,且必须是构造方法的第一条语句。

下期了解面向对象的特性之一‘封装’,以上内容可能会有出入,部分出自转载,欢迎大家踊跃留言指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值