java的类与对象

                                     java的类与对象

1 面向对象

1.1 面向对象与面向过程的区别

面向过程和面向对象都是解决问题的逻辑方法,面向过程是强调解决问题的步骤,可以先定义多个函数,在使用的使用调用函数即可;面向对象把问题分解成多个对象,强调的是解决问题的行为,总结如下:

面向过程:强化函数,过程(步骤),实现功能模块。

面向对象:用类和对象的方法来解决问题的行为或功能。

1.2 对象

对象(实例):具有属性和行为的个体,称为对象。万物皆对象。比如人:   名字、年龄、高矮, 吃饭、睡觉、跑步——具体的每一个人就是一个对象。属性是名词,行为是动词,不同的对象具有不同的属性值和行为。

对象在内存中存储结构,有如下代码

public class ObjectStructure {public static void main(String[] args) {int n = 10;  //栈存储int m = 10;  //栈存储Person p = new Person();//属性赋值p.name="张三";System.out.println(p.name);  //   张三System.out.println(p.age);   //0		//调用String name = "ls";   //局部变量(常量池)String aaaa="ls";String pwd = "123";p.login(name,pwd);System.out.println("name:"+name);   //lsSystem.out.println("执行");}
}class Person {// 属性String name;int age;//用户登录String userName;String pwd;public void login(String userName,String pwd){	System.out.println(userName+"===="+pwd);   //ls  123}public void show() {System.out.println("姓名:" + name + ",年龄:" + age);}
}

其内存图如下:

1.3 类

类:具有相同属性(特征)和行为(动作)对象的集合。

类和对象之间的关系,从设计层面与编码层面分析如下:

(1)设计层面:众多的对象,从众多的对象中,根据需求,划分成不同的类别。
           (2)编码层面:从类别出发,编写类的代码——对应的就是我们的class  关键字后面的类名。

可以简单的理解为类是模板,蓝图,对象是类具体实例化出来的对象,个体。

 

2 类的创建和初始化

2.1 类的定义

【访问权限修饰符】【修饰符】 class 类名{
                       类体
             }

权限修饰符如下:

权限修饰符描述

         public

公共的,在同包,不同包中的类该权限修饰修饰的属性都可以访问
缺省:默认的只能在同包中的类进行访问

注意:protected和private只能修饰内部类,不能修饰外部类。外部类就只有以上两种修饰符。

static不能修饰外部类,能修饰内部类直接作为一个普通类来使用,而不需先实例一个外部类。

修饰符如下:

修饰符描述
abstarct可以被指示一个类只能作为其它类的基类
final不能再申明子类

注意:一个java文件中,可以有多个class,但是只能有一个public class

2.2 类的属性

属性:描述类中对象的特征。

语法:【访问权限修饰符】【修饰符】类型 属性名 【= 初始值】;

访问权限修饰符:private 缺省(default)默认 protected  public

修饰符如下:

修饰符描述

static

指定变量被所有对象共享,即所有实例都可以使用该变量。变量属于这个类。

final

最终修饰符,指定此变量的值不能变

transient

指定该变量是系统保留,暂无特别作用的临时性变量。修饰的属性不能序列化

volatile

指定该变量可以同时被几个线程控制和修改。

其中初始值,可以在声明的同时对属性进行赋值。也可以在使用之前进行赋值。在声明的同时赋值,和在使用之前进行赋值有本质的区别:(1)在类中,声明成员变量的同时赋值,相当于创建的所有对象默认的属性值就是赋予的默认值;(2)在使用之前,使使用  对象名a.属性名  进行赋值,只针对当前这个对象a有效,对其他对象无效。

成员变量(属性)与局部变量的异同:

相同点

①定义的语法格式相同:  类型  名称 = “初始值”;

②都有作用域 (作用范围)  

不同点

①定义位置不同,成员变量定义在类中,方法外;局部变量定义方法内或者方法的参数或者是代码块中;

②成员变量有默认的初始值;基本类型:

整型:byte short int long 默认值 :0

浮点类型:float double 默认值:0.0

字符类型:char 默认值 :空格  \u0000

布尔类型:boolean 默认值 :false

引用类型 :都是null;

局部变量没有初始值。

③在内存在的位置不同,成员变量存放在堆中;局部变量存放在栈中。

④成员变量的访问权限修饰符有四个(public 默认 protected private );局部变量没有权限修饰符;

 

2.3 类的方法

类中定义一个行为或者动作。

语法:【访问权限修饰符】【修饰符】  返回值类型  方法名字(参数类型  参数1,参数类型   参数2,....){ 方法体  }

访问权限修饰符: private 缺省(default)默认 protected  public;

修饰符如下:

修饰符描述
static

指定不需要实例化就可以激活的一个方法。

final

指定该方法不能被重载。

abstract指定此方法不需要实现,实现留给子类覆盖,子类覆盖该方法之后方法才能够生效。  
native

本地修饰符。指定此方法的方法体是用其他语言在程序外部编写的。

synchronized

同步修饰符,在多个线程中,该修饰符用于在运行前,对他所属的方法加锁,以防止其他线程的访问,运行结束后解锁。

方法的参数:分为形式参数和实际参数

形式参数

形式参数,没有值的参数,在函数定义时候的参数

实际参数

有具体值的参数,在函数调用时候的参数

在调用方法的时候,会自动的将实际参数的值,赋予给形式参数。

方法的返回值:一个方法是用来实现某一个或者多个功能的模块,方法执行的结果有的时候,需要传递出来,被调用端来使用。

设置返回值:(1)在方法内部,写return 返回值表达式。(2)在方法定义的时候,将返回值类型设置成,跟返回值表式匹配的类型。

注意:在方法中,程序当执行到return的时候,一定会跳出当前的方法;在方法中,return后面的代码段一定不执行。

2.4 方法重载

定义:如果有两个方法的方法名相同,但参数不一致,那么可以说一个方法是另一个方法的重载,如下代码构成重载。

class GetMax{public void max(int a,int b) {int max=a>b?a:b;System.out.println("最大值:"+max);}public double max(double a,double b) {double max=a>b?a:b;return max;}public double max(double a,double b,double c) {//double max=a>b?a:b;double result = max(a,b)>c?max(a,b):c;return result;}
}

特点:

(1)方法必须在同一类中且方法名相同;

(2)方法名必须相同;

(3)参数列表必须不一致(a.参数类型 b.参数个数 c.参数的顺序);

(4)与方法的返回值类型无关(可以相同也可以不同)。

2.5 匿名对象

匿名对象 :创建的对象是匿名的,代码如下

//创建学生对象,并且要输入学生信息
Student student = new Student();
student.info();
//匿名对象 
new Student().info();

缺点:对象只能创建一次.。

对象中的成员只调用一次时,可以使用匿名对象.。

2.6 方法的可变参数

语法:访问权限修饰符 返回值类型 方法名(类型…变量名){}

特点:

(1)可变参数与同名方法构成重载;

(2)可变参数只能出现一次,并且必须放在最后;

(3)可变参数的使用和数组的使用方式一致。

2.7 意类型作为方法的返回值类型

作为返回值:返回一个该类型的对象

public class TestCar {public static void main(String[] args) {Car car = factory.getCar("benz", "黑色");car.info();		}
}
//工厂
class Factory{	public Car getCar(String brand,String color) {Car car = new Car();car.brand=brand;car.color=color;return car;}
}
//汽车
class Car{//属性String brand;String color;//方法输出汽车的信息public void info() {System.out.println("品牌:"+brand+",颜色:"+color);}
}

 

2.8 值类型和引用类型作方法的参数区别

值类型作为方法的参数:值传递的过程只是将实参的值复制给形参,它们实参与形参并不是共享一段相同的内存,因此形参的改变只是改变自己占用的内存的值,而不改变实参。

引用类型作为方法的参数:通过指针和引用将实参传给形参,因为此时实参与形参共享同一地址单元,形参改变值了,实参自然也要改。

通过内存图可以明确的区分,代码及内存图如下:

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

2.9 构造器

作用:(1)用于创建对象;(2)创建对象的同时给当前对象的属性赋值

语法:访问权限修饰符 类名(参数列表) {}

特点:(1)用户没有手动创建构造器系统会自动创建一个无参构造器;

          (2)用户创建够造器系统不会为类提供无参构造器;

          (3)也可以和方法一样实现重载;

          (4)默认构造器的修饰符与所属类的修饰符一致。

class Boy{private String name;private int age;//无参	public Boy() {super();}//有参public Boy(String name, int age) {this.name = name;this.age = age;}
}

2.10 package包

作用:防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等。

规范:项目类型.公司名称.项目名称.模块名称.包名(所有字母小写)

package com.refuel.java;

2.11 import导入

作用:导入相关类。

导入规范:import 包名.类名/接口名

静态导入:import static 包名.类.静态成员

特点:可以使用“*”代表包下的所有类或接口;java.lang包下接口或类自动导入不需要import ;如: String ,System,Math等

注意:如果调用不同包中的相同类名,创建对象时要定义类的全路径。如:包名.类名 对象=new包名.类名();

import com.refuel.java.Test;
import static java.lang.System.out;
public class TestPckage {
public static void main(String[] args) {Test t  = new Test();out.println(t.name);com.aura.java1.Test t1 = new com.aura.java1.Test();out.println(t1.age);}
}
class Test{String name;int age;
}

 

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

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

相关文章

04.卷积神经网络 W4.特殊应用:人脸识别和神经风格转换

文章目录1. 什么是人脸识别2. One-Shot学习3. Siamese 网络4. Triplet 损失5. 人脸验证与二分类6. 什么是神经风格迁移7. 深度卷积网络在学什么8. Cost function9. Content cost function10. Style cost function11. 一维到三维推广作业参考:吴恩达视频课深度学习笔…

java的封装,继承,多态

java的封装,继承,多态 1 封装 1.1 封装 指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过严格的…

详解一个自己原创的正则匹配IP的表达式

第一种方法(可以匹配有点毛病):检测IP地址的正则表达式 正则表达式: ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) 红色块代…

天池在线编程 2020年9月26日 日常周赛题解

文章目录1. K步编辑2. 折纸3. 字符串的不同排列4. 硬币排成线题目地址,请点这 1. K步编辑 给出一个只含有小写字母的字符串的集合以及一个目标串(target),输出所有可以经过不多于 k 次操作得到目标字符串的字符串。 你可以对字符串进行一下的3种操作:…

使用parted划分GPT分区(转)

parted命令可以划分单个分区大于2T的GPT格式的分区,也可以划分普通的MBR分区,fdisk命令对于大于2T的分区无法划分,所以用fdisk无法看到parted划分的GPT格式的分区。 Parted 命令分为两种模式:命令行模式和交互模式。 1、命令行模式…

04.卷积神经网络 W4.特殊应用:人脸识别和神经风格转换(作业:快乐屋人脸识别+图片风格转换)

文章目录作业1:快乐房子 - 人脸识别0. 朴素人脸验证1. 编码人脸图片1.1 使用卷积网络编码1.2 Triplet 损失2. 加载训练过的模型3. 使用模型3.1 人脸验证3.2 人脸识别作业2:神经风格转换1. 问题背景2. 迁移学习3. 神经风格转换3.1 计算内容损失3.2 计算风…

Maven3路程(三)用Maven创建第一个web项目(1)

一.创建项目 1.Eclipse中用Maven创建项目 上图中Next 2.继续Next 3.选maven-archetype-webapp后,next 4.填写相应的信息,Packaged是默认创建一个包,不写也可以 5.创建好项目后,目录如下: 至此,项目已经创建…

数组排序(冒泡、排序)

目前对于数组的排序有主要的两种,一种是选择排序,一种是冒泡排序。当然大学学过数据结构的知道,还有一些其他的排序,这里就不说明了,有时间自己上网查查。其实排序在开发中并不常用, 我们学习它是学一种思想…

LeetCode 1598. 文件夹操作日志搜集器

文章目录1. 题目2. 解题1. 题目 每当用户执行变更文件夹操作时,LeetCode 文件系统都会保存一条日志记录。 下面给出对变更操作的说明: "../" :移动到当前文件夹的父文件夹。如果已经在主文件夹下,则 继续停留在当前文…

Java集合Set,List和Map等

Java集合Set,List和Map等 1 Java集合框架 因为Java是面向对象的语言,对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另一方面,使用Array存储对象方面具有一些弊端 。Java集合就像一个容器&#x…

利用bootstrap框架做了一个采摘节节日活动网页

效果欣赏如下&#xff1a; 总共主要是一下两个块代码&#xff1a; 1.主题&#xff1a; <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"width, initial-scale1.0&qu…

LeetCode 1599. 经营摩天轮的最大利润(模拟)

文章目录1. 题目2. 解题1. 题目 你正在经营一座摩天轮&#xff0c;该摩天轮共有 4 个座舱 &#xff0c;每个座舱 最多可以容纳 4 位游客 。你可以 逆时针 轮转座舱&#xff0c;但每次轮转都需要支付一定的运行成本 runningCost 。摩天轮每次轮转都恰好转动 1 / 4 周。 给你一…

LeetCode 1600. 皇位继承顺序(图的深度优先遍历)

文章目录1. 题目2. 解题1. 题目 一个王国里住着国王、他的孩子们、他的孙子们等等。每一个时间点&#xff0c;这个家庭里有人出生也有人死亡。 这个王国有一个明确规定的皇位继承顺序&#xff0c;第一继承人总是国王自己。我们定义递归函数 Successor(x, curOrder) &#xff…

Java泛型,枚举,注解

Java泛型&#xff0c;枚举&#xff0c;注解 1 泛型 1.1 什么是泛型 泛型&#xff1a;即参数化类型。在不创建新的类型的情况下&#xff0c;通过泛型指定的不同类型来控制形参具体限制的类型。允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值…

LeetCode 1601. 最多可达成的换楼请求数目(回溯+剪枝)

文章目录1. 题目2. 解题1. 题目 我们有 n 栋楼&#xff0c;编号从 0 到 n - 1 。每栋楼有若干员工。由于现在是换楼的季节&#xff0c;部分员工想要换一栋楼居住。 给你一个数组 requests &#xff0c;其中 requests[i] [fromi, toi] &#xff0c;表示一个员工请求从编号为 …

LeetCode 767. 重构字符串(堆)

文章目录1. 题目2. 解题1. 题目 给定一个字符串S&#xff0c;检查是否能重新排布其中的字母&#xff0c;使得两相邻的字符不同。 若可行&#xff0c;输出任意可行的结果。若不可行&#xff0c;返回空字符串。 示例 1: 输入: S "aab" 输出: "aba"示例 2…

LeetCode 729. 我的日程安排表 I(set 二分查找)

文章目录1. 题目2. 解题2.1 set 二分查找2.2 差分思想1. 题目 实现一个 MyCalendar 类来存放你的日程安排。如果要添加的时间内没有其他安排&#xff0c;则可以存储这个新的日程安排。 MyCalendar 有一个 book(int start, int end)方法。 它意味着在 start 到 end 时间内增加…

开源代码分析技巧之——打印调用逻辑

开源代码分析技巧之——打印调用逻辑 在研究开源代码时&#xff0c;大家或许都有这样的感慨&#xff1a; &#xff08;1&#xff09;代码太庞大&#xff0c;少则几万行代码&#xff0c;多则几百万行代码&#xff0c;不知道如何入手&#xff1b; &#xff08;2&#xff09;相关的…

LeetCode 731. 我的日程安排表 II(set二分查找 / 差分思想)

文章目录1. 题目2. 解题2.1 set 二分查找2.2 差分思想1. 题目 实现一个 MyCalendar 类来存放你的日程安排。如果要添加的时间内不会导致三重预订时&#xff0c;则可以存储这个新的日程安排。 MyCalendar 有一个 book(int start, int end)方法。 它意味着在 start 到 end 时间…

05.序列模型 W1.循环序列模型

文章目录1. 为什么选择序列模型2. 数学符号3. 循环Recurrent 神经网络模型4. 通过时间的反向传播5. 不同类型的循环神经网络6. 语言模型和序列生成7. 对新序列采样8. 循环神经网络的梯度消失9. Gated Recurrent Unit&#xff08;GRU单元&#xff09;10. LSTM&#xff08;long s…