05-面向对象(上)

5.1 面向对象编程

5.1.1 类和对象

1、什么是类

是一类具有相同特性的事物的抽象描述,是一组相关属性行为的集合。

  • 属性:就是该事物的状态信息。

  • 行为:就是在你这个程序中,该状态信息要做什么操作,或者基于事物的状态能做什么。

2、什么是对象

对象是一类事物的一个具体个体(对象并不是找个女朋友)。即对象是类的一个实例,必然具备该类事物的属性和行为。

例如:做一个养宠物的小游戏

类:人、猫、狗等

public class Dog{
    String type; //种类
    String nickname; //昵称
    int energy; //能量
    final int MAX_ENERGY = 10000;
    
    //吃东西
    void eat(){
        if(energy < MAX_ENERGY){
            energy += 10;
        }       
    }
}
public class Person{
    String name;
    char gender;
    Dog dog;
    
    //喂宠物
    void feed(){
        dog.eat();
    }
}
public class Game{
    public static void main(String[] args){
        Person p = new Person();
        p.name = "张三";
        p.gender = '男';
        p.dog = new Dog();
        
        p.dog.type = "哈巴狗";
        p.dog.nickname = "小白";
        
        for(int i=1; i<=5; i++){
            p.feed();
        }
        System.out.println(p.dog.energy);
    }
}
3、类与对象的关系
  • 类是对一类事物的描述,是抽象的

  • 对象是一类事物的实例,是具体的

  • 类是对象的模板,对象是类的实体

5.1.2 如何定义类

1、类的定义格式

关键字:class(小写)

【修饰符】 class 类名{
​
}

类的定义格式举例:

public class Student{
    
}
2、对象的创建

关键字:new

new 类名()//也称为匿名对象
​
//给创建的对象命名
//或者说,把创建的对象用一个引用数据类型的变量保存起来,这样就可以反复使用这个对象了
类名 对象名 = new 类名();

那么,对象名中存储的是什么呢?答:对象地址

public class TestStudent{
    public static void main(Strin   g[] args){
        System.out.println(new Student());//Student@7852e922
​
        Student stu = new Student();
        System.out.println(stu);//Student@4e25154f
        
        int[] arr = new int[5];
        System.out.println(arr);//[I@70dea4e
    }
}

发现学生对象和数组对象类似,直接打印对象名和数组名都是显示“类型@对象的hashCode值",所以说类、数组都是引用数据类型,引用数据类型的变量中存储的是对象的地址,或者说指向堆中对象的首地址。

那么像“Student@4e25154f”是对象的地址吗?不是,因为Java是对程序员隐藏内存地址的,不暴露内存地址信息,所以打印对象时不直接显示内存地址,而是JVM帮你调用了对象的toString方法,将对象的基本信息转换为字符串并返回,默认toString方法返回的是“对象的运行时类型@对象的hashCode值的十六进制值”,程序员可以自己改写toString方法的代码(后面会讲如何改写)。

5.2 包(Package)

5.2.1 包的作用

(1)可以避免类重名:有了包之后,类的全名称就变为:包.类名

(2)可以控制某些类型或成员的可见范围

如果某个类型或者成员的权限修饰缺省的话,那么就仅限于本包使用。

(3)分类组织管理众多的类

例如:

  • java.lang----包含一些Java语言的核心类,如String、Math、Integer、 System和Thread等,提供常用功能

  • java.net----包含执行与网络相关的操作的类和接口。

  • java.io ----包含能提供多种输入/输出功能的类。

  • java.util----包含一些实用工具类,如集合框架类、日期时间、数组工具类Arrays,文本扫描仪Scanner,随机值产生工具Random。

  • java.text----包含了一些java格式化相关的类

  • java.sql和javax.sql----包含了java进行JDBC数据库编程的相关类/接口

  • java.awt和java.swing----包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。

5.2.2 如何声明包

关键字:package

package 包名;

注意:

(1)必须在源文件的代码首行

(2)一个源文件只能有一个声明包的package语句

包的命名规范和习惯: (1)所有单词都小写,每一个单词之间使用.分割 (2)习惯用公司的域名倒置开头

例如:com.haogu.xxx;

建议大家取包名时不要使用“java.xx"包

5.2.3 如何跨包使用类

注意:只有public的类才能被跨包使用

(1)使用类型的全名称

例如:java.util.Scanner input = new java.util.Scanner(System.in);

(2)使用import 语句之后,代码中使用简名称

import语句告诉编译器到哪里去寻找类。

import语句的语法格式:

import 包.类名; 
import 包.*;

注意:

使用java.lang包下的类,不需要import语句,就直接可以使用简名称

import语句必须在package下面,class的上面

当使用两个不同包的同名类时,例如:java.util.Date和java.sql.Date。一个使用全名称,一个使用简名称

示例代码:

package com.haogu.test02.pkg;

import com.haogu.test01.oop.Student;

import java.util.Date;
import java.util.Scanner;

public class TestPackage {
    public static void main(String[] args) {
/*        java.util.Scanner input = new java.util.Scanner(System.in);
        com.haogu.test01.oop.Student stu = new com.haogu.test01.oop.Student();*/

        Scanner input = new Scanner(System.in);
        Student student = new Student();

        Date d1 = new Date();
        java.sql.Date d2 = new java.sql.Date(0);
    }
}

5.3 成员变量

5.3.1 如何声明成员变量

【修饰符】 class 类名{
    【修饰符】 数据类型  成员变量名; 
}

示例:

public class Person{
	String name;
    char gender;
    int age;
}

位置要求:必须在类中,方法外

类型要求:可以是Java的任意类型,包括基本数据类型、引用数据类型(类、接口、数组等)

修饰符:成员变量的修饰符有很多,例如:public、protected、private、static、volatile、transient、final等,后面会一一学习。

其中static可以将成员变量分为两大类,静态变量和非静态变量。其中静态变量又称为类变量,非静态变量又称为实例变量或者属性。接下来先学习实例变量。

5.3.2 对象的实例变量

1、实例变量的特点

(1)实例变量的值是属于某个对象的

  • 必须通过对象才能访问实例变量

  • 每个对象的实例变量的值是独立的

(2)实例变量有默认值

分类 数据类型 默认值
基本类型 整数(byte,short,int,long) 0
浮点数(float,double) 0.0
字符(char) '\u0000'
布尔(boolean) false
数据类型 默认值
引用类型 数组,类,接口 null
2、实例变量的访问
对象.实例变量

例如:

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 覆盖,又称重写或重载,是面向对象编程中的一种重要概念。它指子类对父类中已有的方法进行重新定义,使得子类中的方法能够覆盖父类中的方法,从而实现多态性。 要使用覆盖,需要遵循如下规则: - 方法名、参数列表、返回类型必须完全一致 - 方法的访问权限不能比父类中的方法更严格 - 方法的异常类型不能比父类中的方法更广 覆盖有助于提高代码的复用性和可维护性。 ### 回答2: 面向对象编程中最重要的概念之一是覆盖。覆盖发生在两个有继承关系的类之间,其中,子类覆盖了父类中的方法。简单来说,子类中的方法与父类中的方法具有相同的名称和参数列表。 覆盖主要包括三个方面的内容:方法名称、参数列表以及返回类型。在覆盖的过程中,子类可以改变任何一个或多个方面的内容,但只要方法的名称和参数列表相同,就可以进行覆盖。 覆盖的主要作用是实现多态性。在面向对象编程中,多态指的是同一个方法或同一个类在不同的情况下表现出不同的行为。例如,一个父类有一个run方法,这个方法被多个子类继承并覆盖,这些子类的run方法可以根据不同的需要执行不同的代码,这就是多态性的体现。 需要注意的是,在进行覆盖时,子类的方法访问控制符不能低于父类的方法访问控制符。例如,如果父类的方法是public,那么子类的方法也必须是public,不能是private或protected。 覆盖还有一些注意事项。首先,覆盖必须使用@Override注解,这样可以确保方法签名的正确性。其次,在覆盖过程中,可以使用super关键字调用父类的方法实现,这个功能非常有用。 最后,需要注意的是,覆盖只适用于非静态方法。静态方法不受覆盖影响,因为静态方法是根据类调用,而不是根据对象调用。 总之,覆盖是面向对象编程中非常重要的一个概念。它可以实现多态性,并且可以根据不同的需求调用不同的方法实现。同时,需要注意覆盖的访问控制符、使用@Override注解以及调用父类方法的方式。 ### 回答3: Java中的覆盖指的是在子类中使用相同的方法名称、参数列表和返回类型重新定义父类中已经存在的方法,从而达到替代父类中方法的效果。 父类中的方法被子类覆盖后,当调用子类对象的该方法时,实际上是优先调用子类中的方法,而不是父类中的方法。这就是覆盖的作用。 覆盖也可以称作重写,其实质是子类继承了父类的方法,并重新实现了这些方法,从而强化了子类对这些方法的掌控能力,实现了更加灵活的程序设计。 在将一个方法覆盖时,需要注意以下几点: 1.方法名称、参数列表、返回类型必须与被覆盖的方法相同,否则无法实现覆盖。 2.子类中覆盖的方法不能比父类中的方法访问级别更严格,例如:如果父类中的方法为public,那么子类中被覆盖的方法也必须为public,不能为private或者protected。 3.被覆盖的方法不能为final或者static,因为final的方法不能被重新定义,而static的方法不属于任何对象,不能被继承。 在实际程序设计中,也需要注意覆盖的使用方式。例如,当父类中的方法被覆盖时,子类中的方法可以根据需要选择是完全重写父类中的方法,还是在父类方法的基础上增加新功能。同时,在使用super关键字调用父类中被覆盖的方法时,需要注意调用的方式和位置,避免出现死循环或者错误的调用结果。 总的来说,覆盖是Java中一个重要的特性,它使得程序设计更加灵活,同时也需要程序员在设计时根据实际需要合理使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值