七、 面向对象(二)

  匿名类对象

  创建的类的对象是匿名的。当我们只需要一次调用类的对象时,我们就可以考虑使用匿名的方式创建类的对象。特点是创建的匿名类的对象只能够调用一次!

package day007;//圆的面积
class circle {double radius;public double getArea() {// TODO Auto-generated method stubreturn Math.PI * radius * radius;}public void setRadius(double r){radius = r;}public double getRadius(){return radius;}public void show(){System.out.println("我是一个圆");}}public class lambda{public void printArea(circle c, int time){System.out.println("radius"+"\t"+"area");for(int i =1;i<= time;i++){c.setRadius(i);System.out.println(c.getRadius() + "\t" + c.getArea());}}public static void main(String[] args){lambda p = new lambda();circle c = new circle();//新的圆半径为0p.printArea(c, 5);new circle().show();//这个对象就是匿名对象,只使用一次后就无法再次调用
    }
}
对象作为参数传递

  在上面这个例子里,我们使用new circle()直接调用circle的方法。这个对象就是匿名类对象,这个对象产生时,在内存堆中开辟内存存储了数据,但是在栈中并没有相应的变量名指向这块内存地址,那么我们无法再第二次调用这个匿名类,即我们不可以使用此类再次调用circle类的属性与方法。

  在java虚拟机中,这个匿名类对象很快就被垃圾回收机制收走了,切记,当我们某个类对象只需要使用一次的情况,我们才会考虑使用匿名类对象。

  可变个数的行参的方法:

  格式:对于方法的形参: 数据类型 ... 形参名;

  可变个数的形参的方法与同名的方法之间构成重载;

  可变个数的形参在调用时,个数从0开始,到无穷多个都可以。

  使用可变多个形参的方法与方法的形参使用数组是一致的。

  若方法中存在可变个数的形参,那么一定要声明在方法形参的最后。

  在一个方法中,最多声明一个可变个数的形参。

package day007;public class javaArgs {public static void main(String[] args) {// TODO Auto-generated method stubjavaArgs jargs = new javaArgs();jargs.getSum(1,2,3,4);new javaArgs().getSum(123,223);jargs.getSum("求和是", 2,3,5,8);}
//    public int getSum(int ... args){public void getSum(int ... args){int sum = 0;//args使用与数组一致for(int i = 0; i<args.length;i++){sum += args[i];}System.out.println(sum);
//        return sum;
        }//重载,可变个数的形参声明在方法形参的最后public void getSum(String s,int ... args){int sum = 0;for(int i = 0; i<args.length;i++){sum += args[i];}System.out.println(s + ":"+ sum);}
}
java的*args的使用

   java中形参与实参

  形参:方法声明时,方法小括号内的参数,实参:调用方法时,实际传入的参数的值。

  我们之前做的两个值转换:

package day007;public class TestArgsTransfer {public static void main(String[] args) {// TODO Auto-generated method stub//两个值转换int i = 10;int j = 5;System.out.println("i:" + i + " j:" + j);int temp = i;i = j;j = temp;System.out.println("i:" + i + " j:" + j);}}
两个值交换

  然后你可能会想用一个类封装一个方法完成交换。然后你写了这样一个方法。

package day007;public class TestArgsTransfer {public static void main(String[] args) {// TODO Auto-generated method stub//两个值转换int i = 10;int j = 5;//封装到类方法TestArgsTransfer tt = new TestArgsTransfer();System.out.println("i:" + i + " j:" + j);tt.swap(i, j);//将i的值传递给m,j的值传递给nSystem.out.println("i:" + i + " j:" + j);}//定义一个方法,交换两个变量的值public void swap(int m,int n){int temp = m;m = n;n = temp;System.out.println("m:" + m + " n:" + n);}}
你写的封装方法

  结果是你的i和j根本就没有变,为什么呢?

  简单来说就是i与j是你定义的类属性,你将i,j作为实参传到了类方法里面,类方法swap里的两个变量发生了位置转换,但是main中的两个值并没有发生任何变化,在内存中的表现如上图,调用swap方法时,会在栈中存两个swap的局部变量,这两个变量的值交换了,但是main的变量未发生改变。

  那我们要如何做呢。

package day007;public class TestArgsTransfer1 {public static void main(String[] args) {// TODO Auto-generated method stubTestArgsTransfer1 tt = new TestArgsTransfer1();DataSwap ds = new DataSwap();System.out.println("ds.i:" + ds.i + " ds.j:" + ds.j);tt.swap(ds);System.out.println(ds);System.out.println("ds.i:" + ds.i + " ds.j:" + ds.j);}//交换元素的值public void swap(DataSwap d){int temp = d.i;d.i = d.j;d.j = temp;System.out.println(d);//打印引用变量d的值
    }
}class DataSwap{int i = 10;int j = 5;
}
形参是引用数据类型

  这里swap方法传入的是一个引用数据类型ds,相当于d与ds一致都指向同一个堆空间,那么在swap中完成两个值的交换。

  练习一下,下面代码的执行结果是什么:

class Value {int i = 15;
}class TestValue {public static void main(String argv[]) {TestValue t = new TestValue();t.first();}public void first() {int i = 5;Value v = new Value();v.i = 25;second(v, i);System.out.println(v.i);}public void second(Value v, int i) {i = 0;v.i = 20;Value val = new Value();v = val;System.out.println(v.i + " " + i);}
}

  分析:

  第一步,定义了TestValue类,在类的main函数中,生成一个实例t,并在堆中开辟内存(0x0001),在栈中定义t指向堆中内存0x0001。实例调用实例的first方法。

  第二步,在栈中有局部变量i值为5,一个新的变量v,指向堆中新开辟内存(0x0011),v的局部变量i值为25,将v与当前局部变量i=5作为实参传给second方法。

  第三步,局部变量i的值改为0,v的局部变量i变为20,定义一个新变量val指向堆中先开辟内存(0x0111),second中实参v指向内存(0x0111)

  第四步,此时打印v.i值为内存0x0111中的i,值为15,i为局部空间中的变量i为0,first打印的v.i值为20(实参传入first,v本身未发生指向的改变)。

  面向对象:封装

  我们考虑不让对象来直接作用属性,而是通过"对象.方法"的形式,来控制对象对属性的访问。实际情况中,对属性的要求就可以通过方法来体现。

  两种方法:①将类的属性私有化,②提供公共的方法(setter & getter)来实现调用。

package day007;public class java_private {public static void main(String[] args) {// TODO Auto-generated method stubAnimal an = new Animal();
//        an.legs = 4;//飘红an.setLegs(4);an.getLegs();}}class Animal{private String name;private int legs;public void setLegs(int l){legs = l;}public int getLegs(){System.out.println(legs);return legs;}
}
私有封装

  权限修饰符

   构造器

  也就是构造方法,但是与python的__init__有相似之处,但是不完全一致。

  构造器的作用:①创建对象 ②给创建的对象的属性赋值(创建对象的话,相当于python中的__new__与__init__的作用)。

  1.设计类时,若不显式声明类的构造器的话,程序会默认提供一个空参的构造器

  默认加()就相当于调用了构造器了,类比python加()后实例化即调用了构造方法。

  2.一旦显式的定义类的构造器,那么默认的构造器就不再提供。

  3.如何声明类的构造器。格式:权限修饰符  类名(形参){ }。

   4.类的多个构造器之间构成重载。

  类对象的属性赋值的先后顺序:①属性的默认初始化 ②属性的显式初始化③通过构造器给属性初始化 ④通过"对象.方法"的方式给属性赋值。

package day007;public class init {public static void main(String[] args) {Person p1 = new Person();System.out.println(p1.getName() + ":" + p1.getAge());String str = new String("hello");System.out.println(str);Person p2 = new Person("jeff");System.out.println(p2.getName());System.out.println(p2.getAge());Person p3 = new Person("frank",23);System.out.println("name:" + p3.getName() + " age:" + p3.getAge());//体会属性赋值的过程Person p4 = new Person();System.out.println("name:" + p4.getName() + " age:" + p4.getAge());Person p5 = new Person(12);System.out.println("name:" + p5.getName() + " age:" + p5.getAge());}
}class Person{//属性private String name;private int age = 1;//构造器public Person(String n){name = n;}public Person(){
//        age = 10;
//        name = "张三";
    }public Person(int a){age = a;}public Person(String n,int a){name = n;age = a;}//方法public void setName(String n){name = n;}public void setAge(int a){age = a;}public String getName(){return name;}public int getAge(){return age;}
}
构造器

     

转载于:https://www.cnblogs.com/Jeffding/p/8681442.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/389934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习 客户流失_通过机器学习预测流失

机器学习 客户流失介绍 (Introduction) This article is part of a project for Udacity “Become a Data Scientist Nano Degree”. The Jupyter Notebook with the code for this project can be downloaded from GitHub.本文是Udacity“成为数据科学家纳米学位”项目的一部分…

2044. 统计按位或能得到最大值的子集数目

2044. 统计按位或能得到最大值的子集数目 给你一个整数数组 nums &#xff0c;请你找出 nums 子集 按位或 可能得到的 最大值 &#xff0c;并返回按位或能得到最大值的 不同非空子集的数目 。 如果数组 a 可以由数组 b 删除一些元素&#xff08;或不删除&#xff09;得到&…

redis系列:分布式锁

1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁。会从最原始的版本开始&#xff0c;然后根据问题进行调整&#xff0c;最后完成一个较为合理的分布式锁。 本篇文章会将分布式锁的实现分为两部分&#xff0c;一个是单机环境&#xff0c;另一个是集群环境下的Redis…

Qt中的坐标系统

转载&#xff1a;原野追逐 Qt使用统一的坐标系统来定位窗口部件的位置和大小。 以屏幕的左上角为原点即(0, 0)点&#xff0c;从左向右为x轴正向&#xff0c;从上向下为y轴正向&#xff0c;这整个屏幕的坐标系统就用来定位顶层窗口&#xff1b; 此外&#xff0c;窗口内部也有自己…

预测股票价格 模型_建立有马模型来预测股票价格

预测股票价格 模型前言 (Preface) If you are reading this, it’s most likely because you love to solve puzzles. I’m a very competitive person by nature. The Mt. Everest of puzzles, in my opinion, is trying to find excess returns through active trading in th…

Python 模块 timedatetime

time & datetime 模块 在平常的代码中&#xff0c;我们常常需要与时间打交道。在Python中&#xff0c;与时间处理有关的模块就包括&#xff1a;time&#xff0c;datetime,calendar(很少用&#xff0c;不讲)&#xff0c;下面分别来介绍。 在开始之前&#xff0c;首先要说明几…

大数模板Java

import java.util.*; import java.math.BigInteger; public class Main{public static void main(String args[]){Scanner cinnew Scanner(System.in);BigInteger a,b;acin.nextBigInteger();bcin.nextBigInteger();System.out.println(a.add(b));//加法System.out.println(a.…

柠檬工会_工会经营者

柠檬工会Hey guys! This week we’ll be going over some ways to work with result sets in MySQL. These result sets are the outputs of your everyday queries, such as:大家好&#xff01; 本周&#xff0c;我们将介绍一些在MySQL中处理结果集的方法。 这些结果集是您日常…

229. 求众数 II

229. 求众数 II 给定一个大小为 n 的整数数组&#xff0c;找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 示例 1&#xff1a;输入&#xff1a;[3,2,3] 输出&#xff1a;[3]示例 2&#xff1a;输入&#xff1a;nums [1] 输出&#xff1a;[1]示例 3&#xff1a;输入&#xff1a;…

写给Java开发者看的JavaScript对象机制

帮助面向对象开发者理解关于JavaScript对象机制 本文是以一个熟悉OO语言的开发者视角&#xff0c;来解释JavaScript中的对象。 对于不了解JavaScript 语言&#xff0c;尤其是习惯了OO语言的开发者来说&#xff0c;由于语法上些许的相似会让人产生心理预期&#xff0c;JavaScrip…

Pythonic---------详细讲解

作者&#xff1a;半载流殇 链接&#xff1a;https://zhuanlan.zhihu.com/p/35219750 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。Pythonic&#xff0c;简言之就是以Python这门语言独特的方式写出既简洁又优美的代码…

大数据ab 测试_在真实数据上进行AB测试应用程序

大数据ab 测试Hello Everyone!大家好&#xff01; I am back with another article about Data Science. In this article, I will write about what is A-B testing and how to use it on real life data-set to compare two advertisement methods.我回来了另一篇有关数据科…

492. 构造矩形

492. 构造矩形 作为一位web开发者&#xff0c; 懂得怎样去规划一个页面的尺寸是很重要的。 现给定一个具体的矩形页面面积&#xff0c;你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面。要求&#xff1a; 你设计的矩形页面必须等于给定的目标面积。 宽度 …

node:爬虫爬取网页图片

前言 周末自己在家闲着没事&#xff0c;刷着微信&#xff0c;玩着手机&#xff0c;发现自己的微信头像该换了&#xff0c;就去网上找了一下头像&#xff0c;看着图片&#xff0c;自己就想着作为一个码农&#xff0c;可以把这些图片都爬取下来做成一个微信小程序&#xff0c;说干…

如何更好的掌握一个知识点_如何成为一个更好的讲故事的人3个关键点

如何更好的掌握一个知识点You’re launching a digital transformation initiative in the middle of the ongoing pandemic. You are pretty excited about this big-ticket investment, which has the potential to solve remote-work challenges that your organization fac…

centos 搭建jenkins+git+maven

gitmavenjenkins持续集成搭建发布人:[李源] 2017-12-08 04:33:37 一、搭建说明 系统&#xff1a;centos 6.5 jdk&#xff1a;1.8.0_144 jenkins&#xff1a;jenkins-2.93-1.1 git&#xff1a;git-2.9.0 maven&#xff1a;Maven 3.3.9 二、部署 2.1、jdk安装 1&#xff09;下…

638. 大礼包

638. 大礼包 在 LeetCode 商店中&#xff0c; 有 n 件在售的物品。每件物品都有对应的价格。然而&#xff0c;也有一些大礼包&#xff0c;每个大礼包以优惠的价格捆绑销售一组物品。 给你一个整数数组 price 表示物品价格&#xff0c;其中 price[i] 是第 i 件物品的价格。另有…

记录一次spark连接mysql遇到的问题

在使用spark连接mysql的过程中报错了&#xff0c;错误如下 08:51:32.495 [main] ERROR - Error loading factory org.apache.calcite.jdbc.CalciteJdbc41Factory java.lang.NoClassDefFoundError: org/apache/calcite/linq4j/QueryProviderat java.lang.ClassLoader.defineCla…

什么事数据科学_如果您想进入数据科学,则必须知道的7件事

什么事数据科学No way. No freaking way to enter data science any time soon…That is exactly what I thought a year back.没门。 很快就不会出现进入数据科学的怪异方式 ……这正是我一年前的想法。 A little bit about my data science story: I am a complete beginner…

python基础03——数据类型string

1. 字符串介绍 在python中&#xff0c;引号中加了引号的字符都被认为是字符串。 1 namejim 2 address"beijing" 3 msg My name is Jim, I am 22 years old! 那单引号、双引号、多引号有什么区别呢&#xff1f; 1) 单双引号木有任何区别&#xff0c;部分情况 需要考虑…