JavaSE04、什么是类和对象,如何使用?
一、定义一个类
类名命名:大驼峰
包括:字段、成员方法
class Person {//字段 -> 属性 -> 成员变量// --> 类的内部,方法的外部// 成员变量:1. 普通成员变量,2. 静态成员变量public String name = "gaobo";public int age = 18;// 一个对象存储到哪里,和被final修饰无关public final int size1 = 10; // 对象中public static final int size2 = 20; // 方法区// 成员方法// 1. 成员变量:普通成员方法,静态成员方法public void eat() {System.out.println(name+" 正在吃饭");}public void sleep() {System.out.println(name+" 正在睡觉");}
}
二、成员变量
1、怎样访问成员变量
普通成员变量的访问需要通过对象的引用
由 类 产生 对象 的过程:实例化,用new
由类Person实例化了一个对象
class Person {public String name = "gaobo";public int age = 18;public void eat() {System.out.println(name+" 正在吃饭");}public void sleep() {System.out.println(name+" 正在睡觉");}
}public class TestDemo {public static void main(String[] args) {// 由类定义的变量:引用变量Person person1 = null;Person person2 = new Person();}
}
2、局部变量,成员变量
- 局部变量没有赋初值,打印报错
- 成员变量如果没有赋值,打印的name是null,而age是0
成员变量没有赋初值的默认值:
* 整数 byte short int long(默认值:0)* 浮点数 float double(默认值:0.0)* 基本数据类型 字符 char(默认值:'\u0000')* 布尔 boolean(默认值:false)* 数据类型* 引用类型 String 数组 类 接口 枚举……(默认值:null)*
以下打印null:
class Person {public String name;public int age;public void eat() {System.out.println(name+" 正在吃饭");}public void sleep() {System.out.println(name+" 正在睡觉");}
}public class TestDemo {public static void main(String[] args) {Person person = new Person();System.out.println(person.name);}
}
3、每个对象都有 name age
class Person {public String name;public int age;public void eat() {System.out.println(name+" 正在吃饭");}public void sleep() {System.out.println(name+" 正在睡觉");}
}public class TestDemo {public static void main(String[] args) {Person person = new Person();person.name = "bit";person.age = 10;System.out.println(person.name); // bitSystem.out.println(person.age); // 10System.out.println("=======================");Person person2 = new Person();System.out.println(person2.name); // nullSystem.out.println(person2.age); // 0}
}
三、成员方法
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 TestDemo {public static void main(String[] args) {Person person = new Person();person.eat(); // gaobo 正在吃饭person.sleep(); // gaobo 正在睡觉}
}
四、静态成员
字段-属性-成员变量:
1.普通成员变量
2.静态成员变量 --> 类名.静态的成员属性/方法
class Person {// 普通的成员变量 -都是属于对象的public String name; // 实例变量 存放在对象内public int age;// 静态成员变量 -类变量 -> 方法区public static int count;public void eat() {System.out.println(name+"正在吃饭!");}public void sleep() {System.out.println(name+"正在睡觉!");}
}
1、方法区
class Person {public String name; public int age;// 静态成员变量 -类变量 -> 方法区public static int count;
} public class TestDemo {public static void main3(String[] args) {Person person1 = new Person();person1.count++;System.out.println(Person.count); // 1System.out.println("===================");Person person2 = new Person();person2.count++;System.out.println(Person.count); // 2}public static void main2(String[] args) {Person person1 = new Person();person1.age++;System.out.println(person1.age); // 1System.out.println("===================");Person person2 = new Person();person2.age++;System.out.println(person2.age); // 1}public static void main1(String[] args) {Person person = new Person();person.count = 1999;System.out.println(person.count); // 1999}
}
2、访问静态成员变量
class Person {public String name; public int age;// 静态成员变量 -类变量 -> 方法区public static int count;
} public class TestDemo {public static void main(String[] args) {/*Person person1 = new Person();person1.count++;*/// 通过类名访问静态成员变量// 类名.静态的成员属性/方法// 不需要new两个对象 节省了2个对象的空间Person.count++;System.out.println(Person.count); // 1System.out.println("===================");/*Person person2 = new Person();person2.count++;*/Person.count++;System.out.println(Person.count); // 2// 方法区}
}
2、访问静态方法:直接用类名
class Person {public void eat() {System.out.println(name+" 正在吃饭");}// 类方法/静态方法public static void staticFunc() {System.out.println("static::func()");}
} public class TestDemo {public static void main(String[] args) {// 访问静态方法:直接用类名Person.staticFunc();// 需要引用指向对象Person p = new Person();p.eat();}
}
3、注意事宜
① 普通的方法内部,不能定义静态的变量
- static 定义的变量,是类变量,属于类
- eat方法的调用,需要对应的引用来调用,但是如果可以定义static的变量,类名Person就可以调用
class Person1 {public String name;public int age;public static int count;public void eat() {// static int size = 0; // errSystem.out.println(name+"正在吃饭!");}
}public class TestPerson {public static void main(String[] args) {}
}
② 静态的成员变量,是不可以在方法中定义的
class Person1 {public String name;public int age;public static int count;// 类方法/静态方法public static void staticFunc1() {// static int size = 0; // errcount = 1; // 可以赋值静态成员变量}
}public class TestPerson {public static void main(String[] args) {}
}
③ 普通方法内部,可以调用静态的方法
class Person {public String name;public int age;public static int count;public void sleep() {// 普通方法依赖于对象,静态方法不依赖对象staticFunc();System.out.println(name+"正在睡觉!");}// 类方法/静态方法public static void staticFunc() {System.out.println("static::func()");}
}public class TestPerson {public static void main(String[] args) {Person person = new Person();p.sleep();}
}
④ 静态方法内部,不能调用普通方法
class Person1 {public String name;public int age;public static int count;public void sleep() {System.out.println(name+"正在睡觉!");}// 类方法/静态方法public static void staticFunc() {// 通过类名就可以调用静态方法,而普通方法需要对象// sleep(); // errSystem.out.println("static::func()");}
}public class TestPerson {public static void main(String[] args) {}
}
例1:
public class TestPerson {public static void func1() {}public void func2() {}public class TestDemo {public static void main(String[] args) {func1(); // ok// func2(); // err 普通成员方法需要对象TestDemo testDemo = new TestDemo();testDemo.func2(); // ok}
}
main函数为什么是静态的
main是不是静态的都可以,取决于JVM如何实现的
例2:
class Test{public int a;public static int count;
}public class Main{public static void main(String[] args) {Test t1 = new Test();t1.a++; // 1Test.count++; // 1System.out.println(t1.a); // 1System.out.println(Test.count); // 1System.out.println("============");Test t2 = new Test();t2.a++; // 1Test.count++; // 2System.out.println(t2.a); // 1System.out.println(Test.count); // 2}}
五、引用
1、null
public class TestDemo { public static void main(String[] args) {Person person = null; // 此引用不指向任何对象}
}
2、该引用指向?
public class TestDemo { public static void main(String[] args) {Person person = new Person();Person person1 = person; // person1这个引用指向person这个引用所指向的对象}
}
3、一个引用能否同时指向多个对象?
public class TestDemo { public static void main(String[] args) {// 一个引用不能同时指向多个对象Person person = new Person();person = new Person();person = new Person();person = new Person();person = new Person(); // 最后一次}
}
4、引用一定在栈上吗?
不一定
public class TestDemo { // 成员变量Person person = new Person();public static void main(String[] args) {TestDemo testDemo = new TestDemo();Person person = new Person();}
}
JavaSE04、什么是类和对象,如何使用?相关推荐
- C++ 笔记(18)— 类和对象(this 指针、指向类的指针、类静态成员变量和函数)
1. this 指针 在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址. this 指针是所有成员函数的隐含参数.因此,在成员函数内部,它可以用来指向调用对象. 友元函数没有 thi ...
- C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)
1. 类的定义 类定义是以关键字 class 开头,后跟类的名称.并在它后面依次包含类名,一组放在 {} 内的成员属性和成员函数,以及结尾的分号. 类声明将类本身及其属性告诉编译器.类声明本身并不能改 ...
- C02-程序设计基础提高班(C++)第9周上机任务-类和对象
第9周:阅读教材第8章(p231-262),主要内容是类和对象,学会定义类和对象解决问题,完成第9周上机任务: (回到C02-程序设计基础提高班(C++)学习安排) 实践任务: [任务1]阅读.运行下 ...
- 函数返回类的对象与拷贝构造函数
C++中,如果我们在一个函数中,定义了一个类的对象,然后返回这个对象,在main函数中用一个对象去接受这个返回的对象的时候,这里面参与的函数调用大家可能不熟悉,这里通过程序和注释的方式给大家讲解一下. ...
- ZJU-java进阶笔记 第一、二周(类与对象,对象交互)
对象变量是对象的管理者,而非所有者 VendingMachine vm = new VendingMachine(); this指代当前对象 成员函数可以直接(不需要点运算符)调用本类的其他成员函数 ...
- 3个题目熟悉类和对象基础
1.按要求编写Java应用程序: (1)编写西游记人物类(XiYouJiRenWu)其中属性有:身高(height),名字(name),武器(weapon)方法有:显示名字(printName),显示 ...
- 刻意练习:Python基础 -- Task10. 类与对象
背景 我们准备利用17天时间,将 "Python基础的刻意练习" 分为如下任务: Task01:变量.运算符与数据类型(1day) Task02:条件与循环(1day) Task0 ...
- java中具有继承关系的类及其对象初始化顺序
先说结论 对于具有继承关系的类,它们的类和对象构造顺序为:父类的类构造器() -> 子类的类构造器() -> 父类成员变量的赋值和实例代码块 -> 父类的构造函数 -> 子类成 ...
- python的类和对象_Python类与对象实验
一.任务描述 本实验任务主要对Python类与对象进行一些基本操作,通过完成本实验任务,要求学生熟练掌握Python类与对象的关系,并对Python类与对象的基本操作进行整理并填写工作任务报告. 二. ...
最新文章
- 各大视觉技术看透女神吗
- 实习的第一天——培训
- 微信推出“腾讯QQ”小程序;马化腾又要发红包;GitLab 12.5 稳定版发布| 极客头条...
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-在UI中应用DataUIMapper组件...
- 如何选择VC界面库产品
- python中merge函数_Python Merge函数原理及用法解析
- win10彻底禁用chrome自动升级方法
- 联想服务器改xp系统,联想win7改xp蓝屏怎么解决
- mpchart点击_在MPAndroidChart中,如何为Barchart中的每个Bar添加click事件?
- cst和ansys_CST、HFSS、ADS几款电磁仿真软件区别对比
- vue 自动播放视频
- DNS的集群与更新(远程更新,加密更新)
- Python编程小记:基本语法
- abap 在屏幕如何调用选择屏幕以及如何获得选择屏幕的操作
- Unity项目优化-Alpha通道分离
- Websphere远程代码执行-CVE-2015-7450
- 202203读书-《 测试有道:微软测试技术心得》
- 开发日志:浏览器宽度大于400px,td的宽度按百分比自适应,小于400px时,宽度为指定的值
- android三星note20.6,三星Galaxy Note 20 Ultra依旧是“安卓机皇”,用过的都说好
- C# 关于WinForm界面在触摸屏上显示点触型按钮会引发右键导航栏功能