注:要一直站在内存角度看问题。
面向对象与面向过程的区别:
面向对象封装细节,面向过程关注细节,例如开车去新疆。对比自己,以前是面向过程。
一、类概述
类,是抽象。对象是类的实例。
类的成员变量有默认值。
引用:一小块内存指向一大块内存。本质是指针。
String s = new String("HelloWorld");
new创建一块内存。s指向它。有两块内存。new的都在堆中。
s是对象的引用。引用存在于堆中。s是局部变量,本身存在于栈里。
class C{
int i;
int j;
..main..{
C c1 = new C();
C c2 = new C();
}
}
c1,c2是对象的引用,简称对象。本质是局部变量,在栈中。引用堆中的对应对象。
构造方法
构造方法没有返回值。作用:new就是调用构造方法。
Person{
int id;
int age;
Person(int _id, int _age){
id = _id;
age = _age;
}
}
Person tom = new Person(1, 20);
栈内存:tom在栈内存,_id和_age也是局部变量,也在栈中。
(1)调用构造方法时传入1和20,此时栈内存里_id和_age的值分别变为1和20.
(2)new时,在堆中创建一个对象,并将1和20赋给id和age。
(3)方法调用结束后,栈空间消失,对象(堆中)留了下来。
不写时,使用默认构造方法:空构造方法。
局部变量:
1,基本类型;一块内存,在栈内存。
2,引用类型。两块内存,一块在栈内存,一块在堆内存。
方法调用
1,值传递。
例:
int date = 9;
void change(int i){
i = 1234;
}
date是局部变量,在栈空间中占一块内存。
函数调用执行时,形参也占一块内存。(copy局部变量的)执行完释放。由于是值传递,并不修改局部变量的值。
2,引用传递。
Test test = new Test();
BirthDate d1 = new BirthDate(7, 7, 1970);
BirthDate d2 = new BirthDate(1, 1, 2000);
test.change2(d1);
test.change3(d2);
public void change2(BirthDate d){
b = new BirthDate(2, 22, 2004);
}
public void change3(BirthDate d){
b = setDay(22);
}
在栈内存中:d1,d2
堆内存中:两个对象。d1和d2分别指向他们。
方法调用change2时,在堆内存中生成临时引用变量 d,也指向堆内存中d1指向的对象。
执行b = new BirthDate(2, 22, 2004);后,b又指向堆内存中新开辟的一个对象。
执行完毕,b消失,指向的新对象被垃圾收集器回收。
原来d1指向的内容没有改变。
方法调用change3时,在堆内存中生成临时引用变量 d,也指向堆内存中d2指向的对象。
执行b = setDay(22);后,b修改了指向堆内存中原d2指向对象的值。
执行完毕,b消失,d2指向的内容已经改变。
通过对象调用方法。此时专属一个对象。
静态变量是全局。共享。
形参:
1,传值:复制一份,调完消失。
2,引用:复制一份,也指向对象。调完消失后,也修改了对象的值。
this
指向对象自身。
static
静态:即不属于任何对象,是全局变量。所有对象都可以使用。
二、继承和派生
继承
super() 调用父类构造方法
重载
1,方法重载
2,类 构造方法重载
重写
【类型转换】casting 父类引用指向子类对象
该引用,不能访问子类对象新增的成员(属性和方法)。
例子:
父类——动物Animal
子类——猫Cat,狗Dog
Animal a = new Animal();
a = new Dog();只能看到动物成员。不能看到狗新增加的成员。
想访问,得转型。 Dog d1 = (Dog) a; 此时可以看到狗特有的属性。
a instanceof Animal
if( a instanceof Cat){ Cat cat = (Cat) a; cat.new }
if( a instanceof Dog){ Dog dog = (Dog) a; dog.new }
向上转型(upcasting)子类对象当做基类的对象
向下转型(downcasting)基类的对象当做子类的对象
多态 也叫动态绑定,也叫迟绑定。面向对象 —— 精华,最核心的东西。
与区别是
class Lady{
private String name;
private Pet pet;
Lady(String name, Pet pet){
this.name = name;
this.pet = pet;
}
}
Pet { public void enjoy("叫声。。。")}
Cat { public void enjoy("猫叫声。。。")} 继承Pet
Dog { public void enjoy("狗叫声。。。")} 继承Pet
Cat c = new Cat("catName", "blue");
Dog d = new Dog("dogName", "black");
Lady l1 = new Lady("", c);
Lady l2 = new Lady("", d);
l1.enjoy();
l2.enjoy();
此例即为:动态绑定。
好处:可扩展性。
比类型转型中的instanceof更好用。
三个必要条件
1,有继承
2,有重写方法
3,父类引用指向子类对象
当调父类中被重写的方法时,动态绑定。
总结:说明动态时可以通过举例子的方式。四个对象。一个lady,三个动物。
抽象类
实现多态
其实基类不用实现。直接写成接口。
不能new,只能重写。
final
相当于c++中的Const
变量(普通变量,形参变量)、方法、类
如:String类。
接口
特殊的抽象类
变量:public static final int id = 0;//必须赋初值。
克服C++多继承。static不属于任何一个对象。final不能修改。
方法:只能是public。
可以用来多继承
[接口:重要]
分享到:
相关推荐
面向对象编程是Java的核心特性,它使得代码更加结构化、可维护性更强。在这个主题中,我们将探讨类与对象的概念,以及与它们相关的其他关键概念。 1. **类与对象**: 类是面向对象编程的基础,它是描述一组具有...
JavaSE 进阶 面向对象多态 在 JavaSE 中,面向对象多态是指同一个对象可以具有多种形态,例如一个人可以是老师、丈夫、父亲等。这种多态性是通过方法的重写和重载来实现的。 多态的形式有很多,例如: 1. 方法...
JavaSE进阶面向对象继承 继承是Java语言中的一种机制,允许一个类继承另一个类的特征和行为。继承的优点是可以提高代码的可重用性,减少代码冗余,提高开发效率。 1. 继承的定义:继承是指一个类继承另一个类的...
封装是面向对象编程的特征之一,它将数据(属性)和操作数据的方法(行为)包裹在一起,形成一个独立的单元,外部只能通过接口与之交互,这称为信息隐藏,可以增强模块的独立性和安全性,便于维护。继承是面向对象...
javase之面向对象编程 思维导图
面向对象编程是现代软件开发的核心理念之一,它将现实世界的问题转化为类和对象,通过封装、继承和多态等特性来组织代码。在这个ATM项目中,我们可以期待看到如“用户”、“账户”、“交易”等类的设计,它们各自...
什么是面向对象、如何定义类、如何定义对象、成员变量、局部变量、静态变量、匿名对象、Math.randon()/this/static 代码块(局部代码块、构造代码块、静态代码块、同步代码块) 、java内存结构
面向对象中代码(JAVASE)
面向对象下代码(JAVASE)
在Java编程语言中,面向对象特性是其核心概念之一,本资料主要讲解了JavaSE进阶中的面向对象相关知识,包括final关键字、抽象类、接口、抽象类与接口的区别、Object类、package和import以及访问权限控制。...
javaee入门
关键字super/this的用法和区别;在继承中子类和父类构造方法的关系;方法重写;final关键字
1 了解什么是面向过程 2 了解什么是面向对象 3 掌握类的定义和对象的创建 4 了解对象的内存图 5 掌握局部变量和成员变量的区别 6 掌握private 和this的使用 7 掌握构造方法的使用
继承的基本概念,集成的基本限制,子类实例化,方法的覆写,修改之前的继承操作,super关键字,final关键字,抽象类,接口,多态性,instanceof关键字,抽象类的实际应用,接口的实际应用,Object类
本资源建议用Xmind打开,汇集了我学习JavaSE部分面向对象的总结,用了思维导图的方式。细节突出,重点突出,很适合新手参考学习,也适合新手总结自己的思维导图的参考。
《基于JavaSE的EQQ代码简易版:多线程与面向对象实践》 在Java编程领域,Java Standard Edition(JavaSE)是学习的基础,它提供了丰富的API和强大的工具,为开发桌面应用程序、服务器端应用以及分布式系统提供了...
Java具有类似于C++语言的“形式和感觉”,但它要比C++语言更易于使用,而且在编程时彻底采用了一种“以对象为导向”的方式。 使用Java编写的应用程序,既可以在一台单独的电脑上运行,也可以被分布在一个网络的...
javaSE中面向对象是一个非常不好理解的章节,很多大学老师都没法讲清楚这章,这是我花了不少时间进行整理梳理出来的思维导图,对于Java的学习者来说,这个思维导图还是很有用的