七、 面向对象(二)

  匿名类对象

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

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“成为数据科学家纳米学位”项目的一部分…

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;首先要说明几…

柠檬工会_工会经营者

柠檬工会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中处理结果集的方法。 这些结果集是您日常…

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

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

大数据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.我回来了另一篇有关数据科…

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;下…

什么事数据科学_如果您想进入数据科学,则必须知道的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…

Java基础-基本数据类型

Java中常见的转义字符: 某些字符前面加上\代表了一些特殊含义: \r :return 表示把光标定位到本行行首. \n :next 表示把光标定位到下一行同样的位置. 单独使用在某些平台上会产生不同的效果.通常这两个一起使用,即:\r\n. 表示换行. \t :tab键,长度上相当于四个或者是八个空格 …

季节性时间序列数据分析_如何指导时间序列数据的探索性数据分析

季节性时间序列数据分析为什么要进行探索性数据分析&#xff1f; (Why Exploratory Data Analysis?) You might have heard that before proceeding with a machine learning problem it is good to do en end-to-end analysis of the data by carrying a proper exploratory …

TortoiseGit上传项目到GitHub

1. 简介 gitHub是一个面向开源及私有软件项目的托管平台&#xff0c;因为只支持git 作为唯一的版本库格式进行托管&#xff0c;故名gitHub。 2. 准备 2.1 安装git&#xff1a;https://git-scm.com/downloads。无脑安装 2.2 安装TortoiseGit(小乌龟)&#xff1a;https://torto…

利用PHP扩展Taint找出网站的潜在安全漏洞实践

一、背景 笔者从接触计算机后就对网络安全一直比较感兴趣&#xff0c;在做PHP开发后对WEB安全一直比较关注&#xff0c;2016时无意中发现Taint这个扩展&#xff0c;体验之后发现确实好用&#xff1b;不过当时在查询相关资料时候发现关注此扩展的人数并不多&#xff1b;最近因为…

美团骑手检测出虚假定位_在虚假信息活动中检测协调

美团骑手检测出虚假定位Coordination is one of the central features of information operations and disinformation campaigns, which can be defined as concerted efforts to target people with false or misleading information, often with some strategic objective (…

CertUtil.exe被利用来下载恶意软件

1、前言 经过国外文章信息&#xff0c;CertUtil.exe下载恶意软件的样本。 2、实现原理 Windows有一个名为CertUtil的内置程序&#xff0c;可用于在Windows中管理证书。使用此程序可以在Windows中安装&#xff0c;备份&#xff0c;删除&#xff0c;管理和执行与证书和证书存储相…

335. 路径交叉

335. 路径交叉 给你一个整数数组 distance 。 从 X-Y 平面上的点 (0,0) 开始&#xff0c;先向北移动 distance[0] 米&#xff0c;然后向西移动 distance[1] 米&#xff0c;向南移动 distance[2] 米&#xff0c;向东移动 distance[3] 米&#xff0c;持续移动。也就是说&#x…

回归分析假设_回归分析假设的最简单指南

回归分析假设The Linear Regression is the simplest non-trivial relationship. The biggest mistake one can make is to perform a regression analysis that violates one of its assumptions! So, it is important to consider these assumptions before applying regress…

Spring Aop之Advisor解析

2019独角兽企业重金招聘Python工程师标准>>> 在上文Spring Aop之Target Source详解中&#xff0c;我们讲解了Spring是如何通过封装Target Source来达到对最终获取的目标bean进行封装的目的。其中我们讲解到&#xff0c;Spring Aop对目标bean进行代理是通过Annotatio…