Java之面向对象
2018-03-18 09:41
246 查看
1.引用
C c1 = new C();
c1 是一个局部变量 存储在stack
new C();存储在heap c1指向该对象 java中的对象是通过引用对其操作的
C是一个类,是静态的概念,存储在代码区
例如:
Class C{
int i;
int j;
main(){
C c1 = new C();
C c2 = new C();
}
}
stack heap code segment
c1 ---> c1.i,c1.j class C
c2 ---> c2.i,c2.j
2.构造方法内存
Class B{
int i;
int j;
B(int _i,int _j){
i = _i;
j = _j;
}
main(){
B b = new B(1,2);
}
}
内存中:
stack heap
b i=1 j=2
_i:1
_j:2
方法中参数也是局部变量(方法执行完后,局部变量就没了) _i _j 赋值后就销毁了 b指向对象
3.方法重载 overload
方法名相同,参数类型、参数个数不同
4.
Person p = new Person(21);
int age = 25;
p.setAge(age++); 会先把值取出来赋给p.age,然后自身+1
stack heap
age:25->26
p 25
5.static 静态变量存在date seg中
不能在静态方法里调用非静态变量
6.package必须放在代码的第一行
7.继承
子类创建对象时,堆内存中包含父类的对象
重写 override 方法名,参数类型参数个数,返回值类型必须和父类一致,并且访问权限不能比父类更加严格。
8.继承中的构造方法(重点)
(1).子类调用构造方法过程中必须调用其父类的构造方法(在内存中子类new时也包含父类对象,所以必须也调用父类构造方法)
(2).子类可以在自己的构造方法中使用super();调用父类的构造方法
使用this();调用本类另外的构造方法
如果使用super();必须放在子类构造方法的第一行
(3).如果在子类构造方法里没有显式的调用父类的构造方法,则默认调用父类无参构造方法,
若父类没有无参构造方法,则编译出错
9.Object所有类的基类
(1)toString()方法
例如:Son son = new Son(); syso...(son); 输出:Son@15db9742 Son是类名,@连接符 后面是16进制在内存的hashcode编码
输出对象时,默认调用了Object的toString()方法,所以建议所有的类重写该方法。
(2)finalize()方法 一般是GC时调用该方法
(3)hashcode解释:它独一无二的代表了一个对象,并且可以通过它在内存中找到该对象
(4)equals()方法 一般比较两个对象时 == 比较的是引用(内存地址) Object的equals()方法比较的也是引用
若想比较内容,需要重写equals方法 String就是重写了equals方法,可以比较内容而不是引用。
关键字 instanceof 看是否属于哪个类 c1 instanceof Cat
10.对象转型
(1)父类的引用可以指向子类的对象
(2)父类的引用不可以访问子类新增的成员
(3)可以用 引用型变量 instanceof 类名 来判断该引用类型变量所指向的对象是否属于该类或该类的子类
(4)子类的对象可以当做父类的对象来使用叫做向上转型,反之叫做向下转型
对象上转型:
Animal a = new Dog();
父类的引用指向了Dog对象,但是a在内存中只能看到Dog对象中父类的对象,看不到子类的数据
Dog b = (Dog)a; 强制转换可以让b都看到
11.多态
多态的三个必要条件
(1)要有继承
(2)要有重写
(3)父类引用指向子类对象
动态绑定:在执行期间(非编译期间)判断其引用的实际类型,根据其实际的类型去调用相应的方法
方法存在代码区
多态有很好的扩展性
12.抽象类
我们知道多态中父类的方法内容其实是没有必要写的,因为子类迟早会重写,所以我们只要定义就可以了,所以
出现了抽象abstact方法,一个类有个残缺的方法,这个必须也得是抽象的,残缺的类不能被实例化
有以下规则:
(1)含有抽象方法的类必须是抽象类,抽象类必须被继承,抽象方法必须被重写
(2)抽象类不能被实例化
(3)抽象方法只需被声明,不需要实现
13.final关键字
(1)修饰的变量值不能被修改
(2)类不能被继承
(3)方法不能被重写
14.接口 interface
(1)接口内只有常量和方法的定义
变量是public static final默认修饰的 因为之前C++的多继承有多个父类具有同样的成员变量,子类调用时会出问题,
java用次解决该问题,static是公共的
(2)可以多实现
(3)具有和继承一样的多态特性
C c1 = new C();
c1 是一个局部变量 存储在stack
new C();存储在heap c1指向该对象 java中的对象是通过引用对其操作的
C是一个类,是静态的概念,存储在代码区
例如:
Class C{
int i;
int j;
main(){
C c1 = new C();
C c2 = new C();
}
}
stack heap code segment
c1 ---> c1.i,c1.j class C
c2 ---> c2.i,c2.j
2.构造方法内存
Class B{
int i;
int j;
B(int _i,int _j){
i = _i;
j = _j;
}
main(){
B b = new B(1,2);
}
}
内存中:
stack heap
b i=1 j=2
_i:1
_j:2
方法中参数也是局部变量(方法执行完后,局部变量就没了) _i _j 赋值后就销毁了 b指向对象
3.方法重载 overload
方法名相同,参数类型、参数个数不同
4.
Person p = new Person(21);
int age = 25;
p.setAge(age++); 会先把值取出来赋给p.age,然后自身+1
stack heap
age:25->26
p 25
5.static 静态变量存在date seg中
不能在静态方法里调用非静态变量
6.package必须放在代码的第一行
7.继承
子类创建对象时,堆内存中包含父类的对象
重写 override 方法名,参数类型参数个数,返回值类型必须和父类一致,并且访问权限不能比父类更加严格。
8.继承中的构造方法(重点)
(1).子类调用构造方法过程中必须调用其父类的构造方法(在内存中子类new时也包含父类对象,所以必须也调用父类构造方法)
(2).子类可以在自己的构造方法中使用super();调用父类的构造方法
使用this();调用本类另外的构造方法
如果使用super();必须放在子类构造方法的第一行
(3).如果在子类构造方法里没有显式的调用父类的构造方法,则默认调用父类无参构造方法,
若父类没有无参构造方法,则编译出错
9.Object所有类的基类
(1)toString()方法
例如:Son son = new Son(); syso...(son); 输出:Son@15db9742 Son是类名,@连接符 后面是16进制在内存的hashcode编码
输出对象时,默认调用了Object的toString()方法,所以建议所有的类重写该方法。
(2)finalize()方法 一般是GC时调用该方法
(3)hashcode解释:它独一无二的代表了一个对象,并且可以通过它在内存中找到该对象
(4)equals()方法 一般比较两个对象时 == 比较的是引用(内存地址) Object的equals()方法比较的也是引用
若想比较内容,需要重写equals方法 String就是重写了equals方法,可以比较内容而不是引用。
关键字 instanceof 看是否属于哪个类 c1 instanceof Cat
10.对象转型
(1)父类的引用可以指向子类的对象
(2)父类的引用不可以访问子类新增的成员
(3)可以用 引用型变量 instanceof 类名 来判断该引用类型变量所指向的对象是否属于该类或该类的子类
(4)子类的对象可以当做父类的对象来使用叫做向上转型,反之叫做向下转型
对象上转型:
Animal a = new Dog();
父类的引用指向了Dog对象,但是a在内存中只能看到Dog对象中父类的对象,看不到子类的数据
Dog b = (Dog)a; 强制转换可以让b都看到
11.多态
多态的三个必要条件
(1)要有继承
(2)要有重写
(3)父类引用指向子类对象
动态绑定:在执行期间(非编译期间)判断其引用的实际类型,根据其实际的类型去调用相应的方法
方法存在代码区
多态有很好的扩展性
12.抽象类
我们知道多态中父类的方法内容其实是没有必要写的,因为子类迟早会重写,所以我们只要定义就可以了,所以
出现了抽象abstact方法,一个类有个残缺的方法,这个必须也得是抽象的,残缺的类不能被实例化
有以下规则:
(1)含有抽象方法的类必须是抽象类,抽象类必须被继承,抽象方法必须被重写
(2)抽象类不能被实例化
(3)抽象方法只需被声明,不需要实现
13.final关键字
(1)修饰的变量值不能被修改
(2)类不能被继承
(3)方法不能被重写
14.接口 interface
(1)接口内只有常量和方法的定义
变量是public static final默认修饰的 因为之前C++的多继承有多个父类具有同样的成员变量,子类调用时会出问题,
java用次解决该问题,static是公共的
(2)可以多实现
(3)具有和继承一样的多态特性
相关文章推荐
- Java面向对象三大特性之封装
- Java面向对象
- java初学者实践教程12-面向对象
- java笔记-面向对象-包
- Java程序员从笨鸟到菜鸟之(二)面向对象之封装,继承,多态(上)
- 用java面向对象的思想实现的汉诺塔问题
- 黑马程序员 Java面向对象——IO流(字节流读取流)
- Java面向对象的理解3
- Java入门到精通——基础篇之面向对象
- 黑马程序员—Java面向对象(类和对象、封装、构造方法、this关键字、static关键字)
- Java学习心得之面向对象(二)
- 黑马程序员-Java语言基础–面向对象 第5天
- Java开发三大方向及面向对象的特性
- java 面向对象
- 【疯狂Java】Java面向对象1
- 跟着刚哥梳理java知识点——面向对象(八)
- java面向对象
- Java 面向对象(转)
- Java - Encapsulation封装(面向对象1-封装)
- Java面向对象-访问控制权限