首页 > 其他分享 >类与对象(2)

类与对象(2)

时间:2023-07-19 19:06:21浏览次数:19  
标签:String Person 对象 int num1 public name

方法重载

java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致。

使用方法重载,减轻了起名和记名的麻烦。

//实现一个方法重载
class Calculator {
    //整数+整数
    public int calculate(int num1 , int num2){
        return num1 + num2;
    }
    //浮点数+整数
    public double calculate(double num1 , int num2){
        return num1 + num2;
    }
    //整数+浮点数
    public double calculate(int num1 , double num2){
        return num1 + num2;
    }
    //整数+整数+整数
    public int calculate(int num1 , int num2 , int num3){
        return num1 + num2 + num3;
    }
}

注意事项:

1)方法名必须相同

2)参数列表必须不同(参数类型、个数、顺序,至少一个不同)

3)返回类型没有要求

//例题:定义三个重载方法
//求2个int数中最大值
//求2个double数最大值
//求3个数最大值
class Max{
	public int max(int num1 , int num2){
    	return num1 > num2 ? num1 : num2;
    }
    public double max(double num1 , double num2){
    	return num1 > num2 ? num1 : num2;
    }
    public int max(int num1 , int num2 , int num3){
    	return (num1 > num2 ? num1 : num2) > num3 ?
            (num1 > num2 ? num1 : num2):num3;
    }
}

可变参数

java允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。

访问修饰符  数据类型  方法名(数据类型...  变量名)

//例如: 求两数和,求三数和,求四数和,求五数和......
//  在此时,若分别写出每一个函数,太过于繁琐,
//  可以在此时利用可变参数列表,封装为一个方法,传入任意数量的参数
//  都可以求其和
class Sum{
	public int sum(int... nums){  
        //将传入的参数以数组的形式展现
        //nums的本质是一个数组
    	int re = 0;
        for (int i = 0; i < nums.length; i++ ){
        	re += nums[i];
        }
        return re;
    }
}

注意事项:

1)可变参数的实参可以为0个或任意多个。

2)可变参数的实参可以为数组。可变参数的本质为数组。

4)可变参数可以和普通类型的参数一起放在形参列表,但必须可变参数在最后

//演示:
public void spp(String sp, int... p){
		......
}

5)一个形参列表中只能出现一个可变参数

作用域

1)在java编程中,主要的变量就是属性(成员变量)和局部变量。

2)我们说的局部变量一般是指在成员方法中定义的变量。

全局变量:也就是属性,作用域为整个类

局部变量:也就是除了属性之外的其他变量,作用域为定义它的代码块中

【全局变量可以不赋值,直接使用,因为有默认值,局部变量必须赋值后,才能使用,因为没有默认值】

class Person{
	String name;   		// 全局变量  --- 有默认值 --- 作用范围 整个类
  	int age;   			// 全局变量  --- 有默认值 --- 作用范围 整个类
    String gender;  	// 全局变量  --- 有默认值 --- 作用范围 整个类
    
    public void speak(){
        //全局变量可以在 类中任意位置被调用
        //name全局变量
    	System.out.println("My name is " + name);
    }
    
    public int card(){
        // 局部变量 
        // --- 没有默认值	需要赋初始值
        // --- 作用范围		只能在该方法中调用 
    	double money = 100;
    }
    
    //简单记法:
    //{}以中括号为判别,其定义为位置以中括号{}为一个完整的作用范围
    
}

注意事项:

1)属性和局部变量可以重名,访问时遵循就近原则。

class Person{
	//全局变量
    String name = "小王";
    
    public void speak(){
    	String name = "小李";
        System.out.println("my name is "+name);
        //按就近原则: 
        //my name is 小李
    }
}

2)在一个作用域中,两个局部变量,或两个全局变量,不能重名。

3)生命周期

全局变量:生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁。

局部变量:生命周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而销毁。

4)作用域范围不同

全局变量:可以被本类使用,或其他类使用(通过对象调用)

局部变量:只能在本类中对应的方法中使用

5)修饰符不同

全局变量:可以加修饰符

局部变量:不可以加修饰符

this关键字

this代指当前对象。

class Person{
    String name;
    int age;
}

//main函数
public static void main(String[] args){
    Person p1 = new Person();
    // new Person() 是对象本身
    // p1 中存储的 只是对象在堆区中的地址
    // this 是每一个对象 隐含存在的值 --- 记录着自己的对象的地址
    // this中的值就是堆区中自己对象的地址
    // 假设 生成对象的地址 为 0x123456
    // p1 ---> 0x123456
    // this ---> 0x123456、
    
    //所以可以自己调用自己内部的成员变量或方法   (只能在本类中使用)
    
    // 简单来说:哪个对象调用它,this就代表那个对象
    Dog d1 = new Dog();
    d1.name = "旺财";
    d1.speak; // bark bark bark 旺财
    
    Dog d2 = new Dog();
    d2.name = "假旺财";
    d2.speak; // bark bark bark 假旺财
}

class Dog{
	String name;
    
    public void speak(){
    	System.out.println("bark bark bark " + this.name);
    }
}

注意事项:

1)this关键字可以用来访问本类的属性、方法、构造器

2)this可以区分当前类的属性和局部变量

3)访问成员方法的语法:this.方法名(参数列表);

4)访问构造器语法:this(参数列表);注意只能在构造器中使用(即只能在构造

器中访问另外一个构造器,必须放在第一条语句)

class Person{
    String name;
   Person(){
      	this("小王"); // 必须放在第一条语句
        //  具体原因 --- 在继承中会进行解释
       	System.out.println("无参构造器");
    }
    public Person(String name){
     	System.out.println("有参构造器");
    }
}

5)this不能在类定义的外部使用,只能在类定义的方法中使用。

构造器

构造器(constructor),是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。

1)无参数构造器:(若未写任何构造器,则默认存在无参构造器)

初始化一个类的对象、并返回这个对象的地址、里面的数据都是默认值

2)有参数构造器:

初始化一个类的对象、并返回这个对象的地址,并且可以同时为对象赋值

构造器的特点

1)方法名和类名相同

2)没有返回值

3)在创建对象时,系统会自动的调用构造器完成对类的初始化

class Person{
    String name;
    int age;
    // 无参构造器 --- 系统默认存在 (在用户定义构造器后,将会被覆盖)
    Person(){}
    // 有参构造器
    public Person(String name , int age){
    	this.name = name;
        this.age = age;
    }
    //注意!!!
    //如果你在这个类中定义了一个有参数构造器了,那么无参数构造器就消失了,
    //此时没如果你还要使用无参数构造器,你必须自己写一个
}

注意事项:

一旦定义了自己的构造器,默认的构造器就覆盖了,就不可以再使用默认的无参构造器,除非显式的定义一下

//演示
public static void main(String[] args){
	//情况一
    Person p1 = new Person();
    	//	程序不会报错,p1中name存储默认值 --- 存在无参构造器
    //情况二
    Person p2 = new Person(); //X 报错 --- 无参构造器已经不存在了
    Person p2 = new Person("小王") // 只可利用有参构造器
    //情况三 (推荐形式) 	
    Person p3 = new Person();
    Person p3 = new Person("小王");
    //两者都可使用
}
//情况一
class Person{
	String name;
}
//情况二
class Person{
	String name;
    // 定义了有参数构造器后 , 将原来的无参构造器覆盖了
    public Person(String name){
    	this.name = name;
    } 
}
//情况三
class Person{
	String name;
    // 定义无参数构造器
    Person(){
  
    } 
    // 定义有参数构造器
    public Person(String name){
    	this.name = name;
    } 
}

练习题

1、利用方法重载并调用,分别计算2*1.3*4,2*11*4*6*12*9,3*1.3*0.7的值

class Calcultor{
	public double mul(int num1, double num2, int num3){
    	return num1*num2*num3;
    }
	public double mul(int... nums){
    	int re = 0;
        for (int i = 0; i < nums.length; i++ ){
        	re *= nums[i];
        }
        return re;
    }
    public double mul(int num1, double num2,double num3){
        return num1*num2*num3;
    }
}

public static void main(String[] args){
	Calcultor n = new Calcultor();
    n.mul(2,1.3,4);
    n.mul(2,11,4,6,12,9);
    n.mul(3,1.3,0.7);
}

2、创建公司对象,名称:侠客公司,老板:BOSS,员工数量:1000,市场价值:12345678910.99。【要求:使用this和构造器】

class Company{
	String name;
  	String top;
  	int member;
  	double price;
	Company(){}
  	public Company(	String name,String top,int member,double price){
        this.name = name;
        this.top = top;
        this.member = member;
        this.price = price;
    }
}
public static void main(String[] args){
	Company C1 = new Company("侠客公司","BOSS",1000,12345678910.99);

}


标签:String,Person,对象,int,num1,public,name
From: https://blog.51cto.com/u_16188762/6779120

相关文章

  • 对象存储、文件存储、块存储
    转自https://cloud.tencent.com/developer/article/2147181?shareByChannel=link并进行部分修改什么是文件存储?文件存储带有文件系统,主要是以文件的形式存放数据,能将所有的目录、文件形成一个有层次的树形结构来管理,通过“树”不断伸展的枝丫就能找到你需要的文件。存储协议主......
  • C# 对象序列化和反序列化复制
    ///<summary>///对象深度Copy///</summary>///<typeparamname="T"></typeparam>///<paramname="obj"></param>///<returns></returns>p......
  • Java学习day05~06: 面向对象
    我在B站上大学......
  • 如何在 Java 8 中将 List 转换为可变参数对象
    我有一个函数(findByNames)接受传播参数,如下例所示:List<Users>findByNames(String...names){...}作为参数,我有一个列表:List<String>names=asList("john","abraham");所以我想将names列表转换为传播对象以使用findByNames函数,这可以使用Java8吗?我试过这个解......
  • 面向对象2
    面向对象2编译完源程序以后,生成一个或多个字节码文件。我们使用JVM中的类的加载器和解释器对生成的字节码文件进行解释运行。意味着,需要将字节码文件对应的类加载到内存中,涉及到内存解析。《JVM#规范》虚拟机栈,即为平时提到的栈结构。我们将局部变量存储在栈结构中堆,我们......
  • 面向对象编程
    面向对象编程初识面向对象面向过程思想步骤清晰简单,第一步做什么,第二步做什么...面向过程适合处理一些较为简单的问题面向对象思想物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考.最后,才对某个分类下的细节进行面向过程的思......
  • js 判断对象数组里面是否存在重复数据
    可以使用JavaScript来判断对象数组中是否存在重复数据。下面是一种常见的解决方法:functionhasDuplicate(array){constseen=newSet();for(leti=0;i<array.length;i++){constobjString=JSON.stringify(array[i]);if(seen.has(objString))......
  • request请求对象
       浏览器的原生请求--->发送到django入口wsgi---->进入django对environ做进一步处理-->路由匹配     ----->  (很多组件留给试图函数)------->视图函数调用GET/HTTP1.1         请求会被封装成environ        req......
  • 多线程开发 使用Semaphore和BoundedSemaphore对象
    多线程开发使用Semaphore和BoundedSemaphore对象一、使用Semaphore和BoundedSemaphore对象在Python中,可以使用Semaphore和BoundedSemaphore来控制多线程信号系统中的计数器。1.Semaphore在Python程序中,类threading.Semaphore是一个信号机,控制着对公共资源或者临界区的访问......
  • Android使用Dagger注入的方式初始化对象的简单使用
    一.Dagger简介Dagger2是Google开源的一款依靠注入结构,它的前身是square的Dagger1,Dagger2在Android中有着较为广泛的运用。Dagger2根据Java注解,采用annotationProcessor(注解处理器)在项目编译时动态生成依靠注入需求的Java代码,然后咱们在合适的位置手动完结......