注:要一直站在内存角度看问题。
面向对象与面向过程的区别:
面向对象封装细节,面向过程关注细节,例如开车去新疆。对比自己,以前是面向过程。
一、类概述
类,是抽象。对象是类的实例。
类的成员变量有默认值。
引用:一小块内存指向一大块内存。本质是指针。
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。
可以用来多继承
[接口:重要]
分享到:
相关推荐
5-JavaSE之面向对象编程-类与对象(上)1
JavaSE进阶 面向对象继承
JavaSE进阶 面向对象多态
javase之面向对象编程 思维导图
看B站视频项目总结的系列文档
JAVASE做的ATM提款机项目 使用面向对象 分层等思想开发 使用了JDOM解析XML模仿Spring,其中的xml文件用来模仿数据源
2020动力节点老杜javaSE进阶班面向对象教材,希望各位想学习和巩固javaSE的下载学习。楼主最近也在学习这个,配合视频感觉蛮好的。。。。。。
什么是面向对象、如何定义类、如何定义对象、成员变量、局部变量、静态变量、匿名对象、Math.randon()/this/static 代码块(局部代码块、构造代码块、静态代码块、同步代码块) 、java内存结构
面对对象,封装性,构造方法,匿名对象,类设计题目,String类,String类相关操作方法,引用传递深入,this关键字,接受本类引用,信息的隐藏封装,java源文件的基本结构,常用的包,面向对象编程术语
javaee入门
关键字super/this的用法和区别;在继承中子类和父类构造方法的关系;方法重写;final关键字
1 了解什么是面向过程 2 了解什么是面向对象 3 掌握类的定义和对象的创建 4 了解对象的内存图 5 掌握局部变量和成员变量的区别 6 掌握private 和this的使用 7 掌握构造方法的使用
面向对象程序设计:JavaSE-任务21
面向对象程序设计:JavaSE-任务81
面向对象程序设计:JavaSE-任务11
面向对象程序设计:JavaSE-任务101
继承的基本概念,集成的基本限制,子类实例化,方法的覆写,修改之前的继承操作,super关键字,final关键字,抽象类,接口,多态性,instanceof关键字,抽象类的实际应用,接口的实际应用,Object类
本资源建议用Xmind打开,汇集了我学习JavaSE部分面向对象的总结,用了思维导图的方式。细节突出,重点突出,很适合新手参考学习,也适合新手总结自己的思维导图的参考。
面向对象基础内容1面向对象的概念1.1类的定义格式1.2如何通过类创建对象1.3封装1.3.1封装的步骤1.4构造器1.4.1构造器的作用1.5this关键字1.6匿名对象2继承2.1继承的概念2.2继承的含义2.3继承的好处2.4类的继承格式...
这是比较系统的讲解JAVAse,虽然是PPT但是很有价值