Java类及类的成员(属性、方法、构造器、代码块、内部类)
面向对象(OOP Object Oriented Programming)与面向过程(POP Procedure Oriented Programming)
- 面向对象是相对于面向过程而言的。面向过程,强调是功能行为,以函数/方法为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
- 面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
- 方法定义时:
..
的区别
面向对象的三大特征(封装、继承、多态、抽象)
- 封装:使用
private
关键字对对象的属性进行隐藏,并隐藏其具体细节,目的就是增强安全性和简化编程,并提供对外的使用方法.
- 多态:同一个行为(方法)有不同的表现形式。
- 继承:使用
extends
关键字使子类继承父类的特征(属性)和行为(方法)。
类和对象
- 类(Class)和对象(Object)是面向对象的核心概念
- 类是对一类事务的描述,数抽象的、概念上的定义
- 对象是实际存在的该类事务的每个个体,因而也称为实例(instance)
- 类的创建如下
public class Person {
// 属性
String name;
int age = 1;
// 方法
public void eat(){
System.out.println("吃东西了");
}
public void sleep(){
System.out.println("睡觉了");
}
}
public static void main(String[] args) {
// 对象(实例)的创建
Person person = new Person();
// 方法的调用
person.eat();
person.sleep();
// 属性的调用
System.out.println("我今年"+ person.age + "岁了");
}
属性的使用(成员变量)
名称 |
定义方式 |
内存区别 |
属性 |
定义在类的{}内 |
加载到堆空间 |
局部变量 |
定义在方法内、方法行参、代码块内、构造形参、构造方法内 |
加载到栈空间 |
方法的重载和重写
- 在同一个类中,允许存在一个或多个同名方法,只要它们的参数个数或参数类型不同即可
可变个数的形参
- JDK5.0采用可变个数形参来定义方法,传入零个或多个同一类型的变量
public class Person {
// 可变形参声明方式,参数为数组
public void test(String...val){
for (String item:val) {
System.out.println(item);
}
};
public static void main(String[] args) {
new Person().test("我","要","吃",”饭“);
}
}
其他关键字(this、super、static、final、abstract、interface、package、import等)
对象的内存解析
![](https://img.haomeiwen.com/i22859980/9fb412f501853f41.png)
image.png
- 本地方法栈:通常调用本地方法c或者c++的方法
- 堆(heap),此内存区域的唯一目的就是存放对象实例,几乎所有的实例都在这里分配内存。
- 方法区:用于存储已被虚拟机家在的类信息、敞亮、静态变量、即时编译器遍以后的代码等。
- 虚拟机栈(stack):存储局部变量、对象实例的变量(包含了对象引用的地址)等,局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、short、long、int、double、float、char)、对象应用(reference类型),它不等同于对象本身,是对象在堆内存的首地址。方法执行完,自动释放
- 如下,对于对象引用的使用代码如下
public static void main(String[] args) {
// 对象(实例)的创建
Person p1 = new Person();
// 方法的使用
p1.eat();
p1.sleep();
p1.name = "tom";
// 属性的使用
System.out.println("我今年"+ p1.age + "岁了");
Person p3 = p1; // 只是改变了p3的地址=p1的地址
System.out.println(p3.equals(p1)); // 如果是对象比较的地址
p3.name = "fpf";
System.out.println("我用的是p1的堆地址:我的姓名"+ p1.name);
// fpf
System.out.println("我用的也是p1的堆地址:我的姓名"+ p3.name);
// fpf
}
匿名对象
public class Person {
// 属性
String name;
int age = 1;
// 方法
public void eat(String some){
System.out.println("吃东西了"+some);
}
public void sleep(){
System.out.println("睡觉了");
}
public static void main(String[] args) {
// 匿名对象的使用
new Person().eat("饭");
new Person().eat("面");
// 常见的匿名对象的使用
PersonMall mall = new PersonMall();
mall.show(new Person());
}
}
class PersonMall{
public void show(Person person){
person.sleep();
}
}
网友评论