- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章带你用Java全面剖析类和对象由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
。
C 语言是一门过程语言,在求解问题的时候关注的是过程,因此 C 语言是面向过程的.
JAVA 语言与之不同,JAVA 语言是面向对象的语言,在求解问题的时候,将问题拆分成好几个对象,对象与对象之间相互交互从而解决问题。对象是 JAVA 语言的核心.
用通俗的例子来解释这两者的区别就应该是这样的.
想要吃一碗蛋炒饭,如果是面向过程的话就应该是这样的.
如果是面向对象的话就应该是这样的.
过程:
我付钱厨子做蛋炒饭服务员将蛋炒饭端上来我吃蛋炒饭
整个过程是四个对象之间交互完成的,对于我而言,厨子具体炒蛋炒饭的步骤我并不需要知道,这就是面向对象.
在用 JAVA 进行设计开发时,我们需要做的就是找到对象,建立对象,使用对象,维护对象之间的关系.
。
类实际上就是一类对象的统称,相当于一个模板;对象其实就是对类实例化出来的结果,相当于由模板产生的样本.
一个模板可以产生多个样本,一个类可以实例化出多个对象.
在 JAVA 当中,类是一个引用类型,需要用到关键字 class 来申明一个类,实际上就相当于创建一个新的数据类型 。
基本语法形式
//创建一个类class <类的名字> { field;//成员变量 method;//成员方法}//实例化一个对象<类的名字> <对象名> = new <类的名字>();
。
代码示例:
class Person { public int age; public String name;//成员变量放在对象当中,即堆上 public void show() { //int a = 10; //a变量定义在方法中,它不是成员变量,是局部变量,在栈上开辟内存 System.out.println("姓名: " + name + " 年龄: " + age); }}public class TestDemo { public static void main(String[] args) { Person person1 = new Person(); person1.age = 18; person1.name = "富春"; person1.show(); Person person2 = new Person(); person2.age = 21; person2.name = "山居"; person2.show(); }}
代码结果:
代码解释:
内存分布:
注意:
代码示例:
class Person { public int age; public String name; public boolean ans; public char ch; public void show() { System.out.println("姓名: " + name + " 年龄: " + age); System.out.println("ans:" + ans + " ch:" + ch); }}public class TestDemo { public static void main(String[] args) { Person person = new Person(); person.show(); }}
代码结果:
。
代码示例:
class Person { public int age; public static int count; public static final int COUNT = 99; //COUNT 是静态常量 public static void staticTest() { System.out.println("这是静态成员方法"); }}public class TestDemo { public static void main(String[] args) { Person person1 = new Person(); person1.age = 18; Person.count = 20; System.out.println(person1.age + " " + Person.count); Person.staticTest(); }}
代码结果:
代码解释:
内存分布:
注意:
。
在面向对象编程中,封装是将对象运行所需的资源封装在程序对象中――基本上,是方法和数据。对象是“公布其接口”。其他附加到这些接口上的对象不需要关心对象实现的方法即可使用这个对象。这个概念就是“不要告诉我你是怎么做的,只要做就可以了。” 。
。
属性和方法都有自身的访问权限,private/ public 这两个关键字表示 “访问权限控制” 。
public: public 表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用 private: private 表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用.
在本章第一段代码示例中,成员变量 age 和 name 分别被 public 所修饰,就可能出现以下的问题:
类的使用者必须要了解 Person 类内部的实现, 才能够使用这个类. 学习成本较高。如果 Person 这个类的实现者修改了成员变量的名字,类的使用者就需要将自己的代码随之更改,如果项目的规模较大,就会导致维护的成本过高, 。
每个成员变量或方法的访问权限是需要依据具体的情况仔细斟酌,而不应当随意的设置为 public.
在这样的思考下,private 关键字显得尤为重要,被其修饰的属性,类的使用者是不能够直接使用的(根本没有访问到),需要借助接下介绍的 getter 和 setter 方法,这样就可以不用对类里面的实现细节进行知晓.
。
当用 private 来修饰字段的时候,如果需要获取或者修改这个 private 属性,就需要使用 getter 和 setter 方法 。
代码示例:
class Person { private int age; private String name; public int getAge() { return age; } public void setAge(int myAge) { age = myAge; } public void setName(String myMame) { name = myMame; } public String getName() { return name; } public void show() { System.out.println("姓名: " + name + " 年龄: " + age); }}public class TestDemo { public static void main(String[] args) { Person person1 = new Person(); person1.setAge(18); person1.setName("富春"); int age = person1.getAge(); String name = person1.getName(); System.out.println(name + " " + age); person1.show(); }}
代码结果:
代码解释:
getName 和 getAge 即为 getter 方法, 表示获取这个成员的值 。
setName 和 setAge 即为 setter 方法, 表示设置这个成员的值 。
。
实例化对象时分两步:
1。为对象分配内存空间 。
2.调用对象的构造方法(构造方法不止一种) 。
构造方法是一种特殊方法, 使用关键字new实例化新对象时会被自动调用,不仅可以构造对象,也可以帮助我们对成员变量进行初始化.
。
规则:
方法名和类名是相同的,并且没有返回值 。
在类中没有提供任何的构造函数的情况下,编译器会默认生成一个不带有参数的构造函数 。
如果类中定义了构造方法,就不会默认生成无参的构造方法 。
构造方法支持重载,规则和普通方法的重载一致 。
代码示例:
class Person { private int age; private String name; public Person() { System.out.println("不带参数的构造方法"); } public Person(String name) { this.name = name; System.out.println("带一个参数的构造方法"); } public Person(String name,int age) { this.name = name; this.age = age; System.out.println("带两个参数的构造方法"); } public void show() { System.out.println("姓名: " + this.name + " 年龄: " + this.age); }}public class TestDemo { public static void main(String[] args) { Person person1 = new Person(); person1.show(); Person person2 = new Person("富春"); person2.show(); Person person3 = new Person("山居",18); person3.show(); }}
代码结果:
。
在此之前的代码中出现了很多的 this 关键字,那么该关键字代表什么呢?
该关键字在对象被构造的过程中被使用,对象还未构造完,因此它并不代表当前对象,this 关键字代表着当前对象的引用, 。
可以借助 this 关键字来访问对象的成员变量和成员方法,也可以通过它来调用其他的构造方法 。
方法:
注意:
用 this 关键字调用其他的构造方法时一定要放在第一行静态方法里不允许出现 this 关键字,因为该关键字代表着当前对象的引用,而静态的方法是不依赖于对象的
代码示例:
class Person { private int age; private String name; public Person() { this("富春",18);//调用其他的构造方法 System.out.println("不带参数的构造方法"); } public Person(String name,int age) { this.name = name; this.age = age; System.out.println("带两个参数的构造方法"); } public void show() { System.out.println("姓名: " + this.name + " 年龄: " + this.age); }}public class TestDemo { public static void main(String[] args) { Person person1 = new Person(); person1.show(); }}
代码结果:
加 this 关键字是一个良好的代码习惯.
。
Java 中用大括号 { } 将多行代码括起来,并形成一个独立的代码区间的代码形式称为代码块,它是 Java 中常见的代码形式.
根据代码块定义的位置以及关键字,又可分为以下四种:普通代码块、构造代码块、静态代码块、同步代码块.
接下来主要向大家介绍前三种,最后一种讲解多线程部分时在涉及一下.
。
它是最常见的代码块,是类中方法的方法体或在方法名后面.
代码示例:
public class TestDemo { public static void main(String[] args) { int a = 10; { int b = 20; System.out.println(b); } System.out.println(a); }}
代码解释:
在这里,main 方法后面跟着的 { } 所包裹的内容是一个普通代码块,将定义变量 b 并且打印它的代码包裹起来的 { } 中的内容也是一个普通代码块 。
。
定义在类中的不加修饰符的代码块叫构造代码块也叫实例代码块。构造代码块一般用于初始化实例成员变量 。
代码示例:
class Person { private int age; private String name; { this.name = "山居"; this.age = 18; } public void show() { System.out.println("姓名: " + this.name + " 年龄: " + this.age); }}
。
使用 static定义的代码块,一般用于初始化静态成员属性和需要提前准备的一些数据 。
代码示例:
class Person { private int age; private String name; public static int count; static { count = 20; } public void show() { System.out.println("姓名: " + this.name + " 年龄: " + this.age); }}
。
构造代码块优先于构造函数执行静态代码块优先于构造代码块执行,且对于同一个类来说只执行一次当代码块和成员变量同为静态的或同为实例的时候,其值和定义的顺序是有关系的
。
。
在本章第一段代码示例中,类里面通过 show 方法将对象的属性进行打印,但当属性很多时,就显得不那么方便。因此,可以用快捷键.
步骤一:alt + insert 或者 鼠标右键点一下选择 Generate (要在类的代码区域执行) 。
步骤二:选择 toString() 。
步骤三:选择需要打印的属性 。
步骤四:选择 OK 。
代码示例:
class Person { public int age; public String name; @Override public String toString() { return "Person{" + "age=" + age + ", name="" + name + """ + "}"; }}public class TestDemo { public static void main(String[] args) { Person person1 = new Person(); person1.age = 18; person1.name = "富春"; System.out.println(person1); }}
代码结果:
代码解释:
@Override 是注解,用于解释该方法是重写的方法未重写 toString 方法时,打印 person1,将会是一个地址
当重写 toString 方法时,打印 person1,将会直接调用 toString 方法
。
setter / getter 方法也可以使用快捷键自动生成 。
步骤一:alt + insert 或者 鼠标右键点一下选择 Generate (要在类的代码区域执行) 。
步骤二:选择 Getter and Setter 。
步骤三:选择需要该方法的属性 。
步骤四:选择 OK 。
代码示例:
class Person { private int age; private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; //age = age;错误 } public String getName() { return name; } public void setName(String name) { this.name = name; } public void show() { System.out.println("姓名: " + name + " 年龄: " + age); }}
代码解释:
自动生成的 setter 方法形参名字和类中的成员属性的名字一样的时候,如果不使用 this , 相当于自赋值。this 表示当前对象的引用 。
。
当想要快速生成参数个数不同的构造方法时,也有快捷键.
步骤一:alt + insert 或者 鼠标右键点一下选择 Generate (要在类的代码区域执行) 。
步骤二:选择 Constructor 。
步骤三:选择需要该方法的属性 。
步骤四:选择 OK(无参的话,跳过步骤三,直接选择 Select None) 。
代码示例:
class Person { private int age; private String name; public Person() { } public Person(String name) { this.name = name; } public Person(int age, String name) { this.age = age; this.name = name; }}
。
本篇文章就到里了,希望能够给你带来帮助,也希望您能够多多关注我的更多内容! 。
原文链接:https://blog.csdn.net/weixin_46103589/article/details/120250269 。
最后此篇关于带你用Java全面剖析类和对象的文章就讲到这里了,如果你想了解更多关于带你用Java全面剖析类和对象的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
运行 PostgreSQL(7.4 和 8.x),我认为这是可行的,但现在我遇到了错误。 我可以单独运行查询,它工作得很好,但如果我使用 UNION 或 UNION ALL,它会抛出错误。 这个错误:
我试图为我的应用程序创建一个导航,使用抽屉导航我的 fragment 之一(HomeFragment)有一个 ViewPager,可容纳 3 个 fragment (Bundy Clock、Annou
以我目前正在开发的应用为例: - 它有一个包含多个项目的抽屉导航;现在有两个项目让我感兴趣,我将它们称为 X 和 Y。 X 和 Y 都在单击时显示包含 x 元素或 y 元素列表的 fragment 选
我有一个形状为 (370,275,210) 的 NumPy 数组,我想将其重新整形为 (275,210,370)。我将如何在 Python 中实现这一点? 370是波段数,275是行数,210是图像包
我们如何与被子 UIViewController 阻止的父 UIViewController(具有按钮)交互。显然,触摸事件不会通过子 Nib 。 (启用用户交互) 注意:我正在加载默认和自定义 NI
我是 Jpa 新手,我想执行过程 我的代码如下 private static final String PERSISTENCE_UNIT_NAME = "todos"; private static
与安装了 LAMP 的 GCE 相比,选择与 Google Cloud SQL 链接的 GCE 实例有哪些优势? 我确定 GCE 是可扩展的,但是安装在其上的 mysql 数据库的可扩展性如何? 使用
这个问题在这里已经有了答案: Value receiver vs. pointer receiver (3 个答案) 关闭 3 年前。 我刚接触 golang。只是想了解为 Calc 类型声明的两种
我不小心按了一个快捷键,一个非常漂亮的断线出现在日期上。 有点像 # 23 Jun 2010 -------------------- 有人知道有问题的快捷方式吗?? (我在 mac 上工作!) 在
我正在Scala中编写正则表达式 val regex = "^foo.*$".r 这很好,但是如果我想做 var x = "foo" val regex = s"""^$x.*$""".r 现在我们有
以下 XML 文档在技术上是否相同? James Dean 19 和: James Dean 19 最佳答案 这两个文档在语义上是相同的。在 X
我在对数据帧列表运行稳健的线性回归模型(使用 MASS 库中的 rlm)时遇到问题。 可重现的示例: var1 <- c(1:100) var2 <- var1*var1 df1 <- data.f
好的,我有一个自定义数字键盘,可以在标签(numberField)中将数字显示为 0.00,现在我需要它显示 $0.00。 NSString *digit = sender.currentTitle;
在基于文档的应用程序中,使用 XIB 文件,创建新窗口时其行为是: 根据最后一个事件的位置进行定位和调整大小 window 。 如果最后一个事件窗口仍然可见,则新窗口 窗口应该是级联的,这样它就不会直
我想使用参数进行查询,如下所示: SELECT * FROM MATABLE WHERE MT_ID IN (368134, 181956) 所以我考虑一下 SELECT * FROM MATABLE
我遇到一些性能问题。 我有一个大约有 200 万行的表。 CREATE TABLE [dbo].[M8]( [M8_ID] [int] IDENTITY(1,1) NOT NULL,
我在 jquery 中的按键功能遇到问题。我不知道为什么按键功能不起作用。我已经使用了正确的 key 代码。在我的函数中有 2 个代码,其中包含 2 个事件键,按一个键表示 (+) 代码 107 和(
我想显示音频波形,我得到了此代码,它需要.raw音频输入并显示音频波形,但是当我放入.3gp,.mp3音频时,我得到白噪声,有人可以帮助我如何使其按需与.3gp一起使用使用.3gp音频运行它。 Inp
我无法让 stristr 函数返回真值,我相信这是因为我的搜索中有一个 $ 字符。 当我这样做时: var_dump($nopricecart); 完整的 $nopricecart 值是 $0 ,我得
如果我有这样的循环: for(int i=0;i O(n) 次。所以do some执行了O(n)次。如果做某事是线性时间,那么代码片段的复杂度是O(n^2)。 关于algorithm - 带 If 语
我是一名优秀的程序员,十分优秀!