Java面向对象核心思想
一、对象创建的内存模型
(一)、栈、堆、方法区存储的内容
-
堆区:
- 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
- 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 。
-
栈区:
- 1.每个线程包含一个栈区,栈中只保存基础数据类型的值和对象以及基础数据的引用
- 2.每个栈中的数据(基础数据类型和对象引用)都是私有的,其他栈不能访问。
- 3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
-
方法区:
- 1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
- 2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
————————————————
-
例子:
更详细请看转载 https://blog.csdn.net/qq_26805137/article/details/52996910
这位小博主写得不错 -
5.1 引用类型变量画等号 =:
指向同一个对象。
5.2 基本类型变量画等号 =:
表示赋值。
二、子类与继承
1.作用
- 代码的复用。
- 如果我们想复用这个类中的成员变量和方法,即在所编写的类中不用重新声明成员变量就相当于有了这个成员变量,不用定义方法就相当于有了这个方法,那么我们可以将编写的类定义为这个类的子类,子类可以让我们不必一切“从头做起”。
2.通过 extends 关键字来实现继承。
3.子类和父类的结构
- 超类(父类):派生类共有的属性和行为(成员变量和方法)。
- 派生类(子类):派生类所特有的属性和行为(成员变量和方法)。
-
People 类——超类 , Students01 类——派生类
-
在同一个包(package)中,子类自然地继承了其父类不是 private 的成员变量(私有成员变量)作为自己的成员变量,且还继承父类中不是 private 的私有方法作为自己的方法,继承过来的成员变量和方法的访问权限保持不变。
-
子类和父类不在同一个包中,父类的 private 和 友好的访问权限 的成员变量不会被子类继承。 子类只能继承父类修饰的 protected 和 public 访问权限的成员变量和方法。
-
如下图就是个好例子(父类和子类在同一个包 package):
- ①父类的变量,访问权限修饰的是私有的,子类不能被访问;
- ②实例化子类后,对象引用不能访问父类的私有方法;
-
同样:父类和子类不在同一个包时,子类只能继承父类的 protected (受保护的) 和 public (公开的) 的访问权限的成员变量和方法。
-
访问修饰符权限该知识,后续补上,感谢网友对我的文章认可!!
4.继承的注意事项
- 1.派生类继承超类后,派生类具有:超类的 + 派生类的。
- 2.一个超类可有多个派生类,但只能单一的继承。(Java不支持多重继承,即子类只能有一个父类,或者说派生类只能有一个超类)
- 3.具有传递性。
5.方法的重写
- 1.重写的目的:当子类需要父类的功能,而功能的主体子类还有自己特有的内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类自己特有的内容。
- 2.注意,方法的重写和方法的重载的区别:
- 方法重写:子类中出现了和父类中方法声明一模一样的方法(方法名、参数列表和返回值类型都一样),也被称为方法覆盖、方法复写。
- 方法重载:本类中出现的方法名一样,参数列表不同,与返回值无关的方法。
- 例子如下代码:注意是同包类中
package test;
//人类
public class Peoples {
protected String name;
protected int age;
public void run(String name, int age){
System.out.println(name + "跑的很快,但他今年才"+ age +"岁");
}
}
package test;
//学生类
public class Students extends Peoples {
protected String name;
protected int age;
protected String str1;
public void run1(String name, int age, String str1){
System.out.println(name + "跑的很快,他今年才"+ age +"岁"+str1);
}
}
package test;
public class Test01 {
public static void main(String[] args){
Students stu = new Students();
stu.run("小明", 10);
stu.run1("小东", 20,"但他还是学生");
stu.run1("博尔特", 28,"但他是一名运动员");//重写run1方法
}
}
结果显示:
6.super() 关键字
6.1 Java规定:构造派生类之前必须先构造超类。
如果超类(父类)不先构造,则派生类(子类)会报错
package test;
public class Peoples {
protected String name;
protected int age;
public void run(String name, int age){
System.out.println(name + "跑的很快,但他今年才"+ age +"岁");
}
public Peoples(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
package test;
public class Students extends Peoples {
protected String name;
protected int age;
public void run1(String name, int age){
System.out.println(name + "跑的很快,但他今年才"+ age +"岁");
}
public Students(String name, int age) {
super(name, age);
}
}
- 6.2 super(); 调用超类构造方法必须于派生类构造的第一行。
- 6.3 super 指代当前对象的超类对象
- 访问超类成员,调用超类方法,调用超类构造方法方式:
- 7.3.1 super.成员变量 ,通过 super 点成员变量来访问超类成员
- 7.3.2 super.方法名 ,通过 super 点方法名来访问超类方法
- 7.3.3 super() ,通过 super(方法名) 来访问超类构造方法
- 栗子如图:
代码案例:
package test02;
public class SuperDemo {
public static void main(String[] args) {
Boo b = new Boo(0, 0, 0);
Doo c = new Doo();
}
}
class Aoo {
int a;
Aoo(int a){ //构造方法
this.a = a;
System.out.println("超类的有参构造方法");
}
Aoo(int a,int c){ //方法的重载,方法名相同,参数列表和方法体不同
System.out.println("超类的有参构造方法111222");
}
Aoo(int a,int b,int c){ //方法的重载,方法名相同,参数列表和方法体不同
System.out.println("超类的有参构造方法111222333444");
}
void Coo() {
System.out.println("我是:"+a);
}
}
class Boo extends Aoo{
int c;
Boo(int a,int b, int c){
super(a,b,c);
this.c = c;
System.out.println("派生类的有参构造方法");
}
void Coo(){ //构造派生类之前必须先构造超类
System.out.println("我是:"+ a +"xxx");//方法的重写
}
}
class Coo{
Coo(int a){
System.out.println(a);
}
}
class Doo extends Coo{
Doo(){
super(5);
System.out.println("哈哈");
}
}
注意:重载看参数列表类型,重写看new(创建)对象
后续的内容请耐心等等,马上就来!写作不易请点个赞3Q
章节目录在此处:https://blog.csdn.net/qq_41254299/article/details/106638651
转载请注明出处:https://blog.csdn.net/qq_41254299
本文出自【Superclover_的博客】