ClassAndObject -类与对象 - java(万字篇)
Posted Dark And Grey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ClassAndObject -类与对象 - java(万字篇)相关的知识,希望对你有一定的参考价值。
文章目录
- 类与对象的初步认知
- 面向对象概念
- 面向对象设计
- 简而言之
- 那么我们问题是︰对象从何而来,从类来,你可以想象成一个类型,假设我们都是人,额,就这样吧。那么我们要定义一个类,这个类我们要定义出来,该怎么定义呢?
- 类和类的实例化
- 访问 类的成员变量(通过引用来访问)
- 类的成员
- 这里讲一个dan疼的面试题
- 在这里们再稳固一下知识
- 引用 一定是在栈上吗?
- 总结 static 关键字
- 在这里大家想想如果我们的类体中,字段/属性/成员变量,越来越多, 如果我们想打印一下内容,要写很多方法,很麻烦
- 在这里引入一个概念 封装
- 这时就需要 getter和setter方法 来创建公开的2个接口,用来输出和输入
- 构造方法
- 在我们这篇博客代码中 this 频繁出现。现在我们就来讲解一下this的用法
- 代码块
- 匿名对象
- 本文结束
类与对象的初步认知
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
JAVA是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
面向过程注重的是过程,在整个过程中所涉及的行为,就是功能。
面向对象注重的是对象,也就是参与过程所涉及到的主体。是通过逻辑将一个个功能实现连接起来
面向对象概念
1.面向对象是思考问题的一种思考方式,是一种思想。
2.类就是一类对象的统称。对象就是这一类具体化的一个实例。
3.面向对象的好处:将复杂的事情变简单了,只要面对一个对象就行。
面向对象设计
面向对象设计把握一个重要的经验:谁拥有数据,谁对外提供操作这些数据(私有)的方法!
(被动的一方是数据的拥有者,主动的一方是执行者)
开发时:找对象,建对象,用对象,并维护对象之间的关系。
简而言之
面向对象就是用代码(类)来描述客观世界的事物的一种方式. 一个类主要包含一个事物的属性和行为
图 1
图 2
通过 图1 和 图2 ,我们更加清楚 面向对象 与 面向过程的区别。
那么我们问题是︰对象从何而来,从类来,你可以想象成一个类型,假设我们都是人,额,就这样吧。那么我们要定义一个类,这个类我们要定义出来,该怎么定义呢?
类和类的实例化
类就是一类对象的统称。对象就是这一类具体化的一个实例
创建类 ( 基本语法 )
class <class_name>{
field;//成员属性
method;//成员方法
}
实例化对象
<class_name> <对象名> = new <class_name>();
class为定义类的关键字,ClassName为类的名字,{}中为类的主体(类体)。
类中的元素称为:成员属性(成员变量)。类中的函数称为:成员方法。
代码如下
注意类的定义是写在我们文件类的外面(初识Java中,我们说了类名要和文件相同,所以我写成文件类,方便你们区别)
class Person{
// 现在我们定义了 一个类 Person (注意类名要大驼峰结构,这个初识Java的时候就讲过了)
// 类里面包含字段(又称 属性 和 成员变量) 和 方法
// 字段又称属性,属性什么意思,比如人的属性
public String name;// 每个人都有自己的名字
public int age; // 年龄
// 这两个成员变量虽然可以赋值,但不推荐,跟前面 数组文章中的不规则二维数组是一样的
// 可以 根据后期的需要, 进行赋值的,而且你总不能每个人的名字和年龄都一样把。
// 注意 创建在 在类的内部,方法的外部的变量,被称为 成员变量(属性/字段)
// 定义写到方法的内部 是 局部变量
另外 成员变量 又可分为 普通成员变量(该程序的成员变量就是普通的) 和 静态成员变量(static)
// 而方法(又称 成员方法) 可以解析为 人的行为
// 比如说吃
public void eat(){
System.out.println(name + "正在吃饭。");
}
public void sleep(){
System.out.println(name + "睡着了。");
}
}
public class ClassAndObject {
public static void main(String[] args) {
// 我们经过图1,得出的结论是 有了类才有对象
// 现在我们有了类,那么怎么产生对象的呢?
// 通过 new 去实例化一个对象,也就是说去产生一个对象
Person person = new Person();
// 注意此时的变量是由类定义的,由类定义的变量,都是引用变量,意味着初值可以赋 null
// Person person = null;
// 而且 前面也说,同一个类,我们可以产生很多对象
// 意味着 我们生成 很多人 person
Person person2 = new Person();
Person person3 = new Person();
Person person4 = new Person();
Person person5 = new Person();
// .
// .
// .
}
}
访问 类的成员变量(通过引用来访问)
基本语法
引用(由类定义的定义的类名).普通成员变量名
代码实例1
class Person{
public String name;// 每个人都有自己的名字
public int age; // 年龄
public void eat(){
System.out.println(name + "正在吃饭。");
}
public void sleep(){
System.out.println(name + "睡着了。");
}
}
public class ClassAndObject {
public static void main(String[] args) {
Person person = new Person();
// 普通成员变量的访问需要 通过对象 的引用(person)来访问的
System.out.println(person.name);// name 是引用类型,存的是首字符地址
System.out.println(person.age);// int 整形
}// 图 3
}// 图4 , 图中的默认值,是针对于 成员变量,不包括局部变量,而且局部变量不初始化是无法使用的
图 3
图4(成员变量和引用的默认值)
代码实例2
class Person{
public String name;// 每个人都有自己的名字
public int age; // 年龄
public void eat(){
System.out.println(name + "正在吃饭。");
}
public void sleep(){
System.out.println(name + "睡着了。");
}
}
public class ClassAndObject {
public static void main(String[] args) {
Person person = new Person();
person.name = "author";
person.age =10;
System.out.println(person.name);
System.out.println(person.age);
Person person2 = new Person();
System.out.println(person2.name);// name 是引用类型,存的是首字符地址
System.out.println(person2.age);// int 整形
}// 图 5
}// 图解6
图5
图6
代码实例3 (调用成员方法)
成员方法也和成员变量一样,可分为 普通成员方法 和 静态成员方法(static)
普通成员方法跟普通成员变量是一样的,通过对象的引用来调用
class Person{
public String name;// 每个人都有自己的名字
public int age; // 年龄
public void eat(){
// eat 和 sleep 可以称其为 方法片段,方法片段 是存储在方法区中
// 如果方法里 创建了 int a 或者 其他类型的变量,在该方法被调用时,
// 方法会在栈上开辟内存(没被调用,就放在方法区里)
// 那么方法的空间就会分出4byte来存储它
System.out.println(name + "正在吃饭。");
}
public void sleep(){
System.out.println(name + "睡着了。");
}
}
public class ClassAndObject {
public static void main(String[] args) {
Person person = new Person();
person.name = "author";
person.age =10;
person.eat();
person.sleep();
}// 图 7
}
图 7
类的成员
类的成员可以包含以下:字段、方法、代码块、内部类和接口等
本文主要讲字段、方法,代码块。
字段 等价于 (属性/成员变量)
成员变量又可分为两类: 普通成员变量,静态成员变量
代码样本1
class Person{
// 普通成员变量 都是属于对象的
public String name;// 引用类型(存的字符串首字符地址),默认值为null
public int age;// 默认值为 0
// 静态成员变量
public static int count;// 默认值为 0
}
public class ClassAndObject {
public static void main(String[] args) {
Person person = new Person();
person.age = 10;// 访问普通成员
person.count = 1;
System.out.println(person.age);
System.out.println(person.count);
}
}// 图 8
图8
代码样本2(访问普通成员变量)
class Person{
// 普通成员变量 都是属于对象的
public String name;// 引用类型(存的字符串首字符地址),默认值为null
public int age;// 默认值为 0
}
public class ClassAndObject {
public static void main(String[] args) {
Person person = new Person();
person.age++;
System.out.println(person.age);
System.out.println("======================");
Person person2 = new Person();
person2.age++;
System.out.println(person2.age);
}
}// 图 9,10
图9
图10
代码样本3(访问静态成员变量)
class Person{
// 普通成员变量 都是属于对象的
public String name;// 引用类型(存的字符串首字符地址),默认值为null
public int age;// 默认值为 0
public static int count;
}
public class ClassAndObject {
public static void main(String[] args) {
Person person = new Person();
person.age++;
person.count++;
System.out.println(person.age);
System.out.println(person.count);
System.out.println("======================");
Person person2 = new Person();
person2.age++;
person2.count++;
System.out.println(person2.age);
System.out.println(person2.count);
}
}// 图 11,12
图11
图12
代码样本4(由图12得出的结论,修改样本3)
class Person{
// 普通成员变量 都是属于对象的
public String name;// 引用类型(存的字符串首字符地址),默认值为null
public int age;// 默认值为 0
public static int count;
}
public class ClassAndObject {
public static void main(String[] args) {
Person person = new Person();// 没意义,静态成员变量属于类,所以实不实例化一个对象。没有影响
Person.count++;
System.out.println(Person.count);
System.out.println("======================");
//Person person2 = new Person(); 没意义
Person.count++;
System.out.println(Person.count);
}
}// 图 13
图13
代码样本5 (调用【静态成员方法/类方法】)
class Person{
// 静态成员方法/类方法
public static void staticFunc(){
System.out.println("static::func()");
}
}
public class ClassAndObject {
public static void main(String[] args) {
Person.staticFunc();
}
}// 图 14
图14
注意事项 1(能不能在方法中 创建一个 被 static修饰的变量)
class Person{
// 普通成员办法
public void eat(){
static int size = 0;// 该写法是错的
}
// 静态成员方法/类方法
public static void staticFunc(){
static int size2 = 0;// 该写法是错了
}
}// 图 15
图15
总结:
无论是 普通成员方法还是静态成员方法,都不能在其内部创建一个被static修饰的变量
因为 被static修饰了的变量,该变量就属于类了(类变量/静态变量)。
而你把一个(类变量/静态成员变量)写在方法里,就意味着属于方法(是一个局部变量,不再是 类变量了),而不属于类
所以冲突了,不合适,导致编译器报错。
还有一个原因
拿eat来说, eat是普通成员方法,是需要对应的引用来调用的。但是如果可以定义static的变量, 通过 类名Person 就能调用。
一个需要对象,不需要类;另一个需要类,不要有对象,两者就像在这里卡bug一样存在冲突。所以这种写法是错的
而静态成员方法中,之所以不能创建一个被 static修饰的变量,是因为,你是在内部定义的。在内部定义,就意味着属于方法,而不属于类,所以错的
总得来说: 只要是被 static 修饰的变量/方法,都是属于类的。
注意事项 2(能不能在方法中调用方法)
普通成员方法 调用动态成员方法
class Person{
public String name = "author";
public void eat(){
staticFunc();// 可以这样写,没有警告
System.out.println(name+"正在吃饭.");
}
public static void staticFunc(){
System.out.println("static::func()");
}
}
public class ClassAndObject {
OOZIE:JA009:RPC 响应超出最大数据长度