Java基础04
Java面向对象
面向对象的三个基本特征
- 可重用性:它是面向对象软件开发的核心思路,提高了开发效率。面向对象程序设计的抽象、继承、封装和多态四大特点都围绕这个核心。
- 可扩展性:它使面向对象设计脱离了基于模块的设计,便于软件的修改。
- 可管理性:能够将功能与数据结合,方便管理。
继承性
- 这种层次形的分类方式,是为了将多个类的通用属性和方法提取出来,放在它们的父类中,然后只需要在子类中各自定义自己独有的属性和方法,并以继承的形式在父类中获取它们的通用属性和方法即可。
- 子类继承父类,可以获取父类的所有方法,私有的东西无法被继承,
- 继承的本质是对某一批类的抽象, 从而实现对现实世界更好的建模。
- extends的意思是“扩展”。子类是父类的扩展。
- JAVA中类只有单继承,没有多继承!
- object类是Java中所有类的祖宗类
- super调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的方法或者构造方法中!
- super和this不能同时调用构造方法!
封装性
- 封装的意义:提高系统安全性,保护数据,隐藏代码细节,统一接口,系统可维护性得到提升
- Java 提供了私有和公有的访问模式,类的公有接口代表外部的用户应该知道或可以知道的每件东西,私有的方法数据只能通过该类的成员代码来访问,这就可以确保不会发生不希望的事情。
多态性
-
一个对象实际类型是确定的,但是可以指向的引用类型就不确定了:父类的引用类型可以指向子类的对象
public class A extends B { public void test() { B b = new A(); System.out.println("A=>Atest"); } }
-
用一个方法可以根据发送对象的不同而采取多种不同的行为方式。(多态是方法的多态,属性没有多态)
-
多态存在的条件
- 有继承关系
- 子类重写父类的方法
- 父类引用指向子类对象
-
把子类转为父类,向上转型;
-
把父类转为子类,向下转型,强制类型转换,可能会丢失一些方法
类的本质用来组织代码(方法归类),封装数据的(理解提高成员变量的安全性)。
关键字
public
:表示“共有”的意思。如果使用 public 修饰,则可以被其他类和程序访问。每个 Java 程序的主类都必须是 public 类,作为公共工具供其他类和程序使用的类应定义为 public 类。abstract
:如果类被 abstract 修饰,则该类为抽象类,抽象类不能被实例化,但抽象类中可以有抽象方法(使用 abstract 修饰的方法)和具体方法(没有使用 abstract 修饰的方法)。继承该抽象类的所有子类都必须实现该抽象 类中的所有抽象方法(除非子类也是 抽象类)。final
:如果类被 final 修饰,则不允许被继承。class
:声明类的关键字。class_name
:类的名称。extends
:表示继承其他类。implements
:表示实现某些接口。property_type
:表示成员变量的类型。property
:表示成员变量名称。function()
:表示成员方法名称。
调用成员方法 4 点核心:
- 对无参成员方法来说,是没有实际参数列表的(即没有 paramList),但方法名后的括号不能省略。
public static void main(String[] args) {
int[] Gao; //数组的定义
Gao = new int[20]; //创建一个数组
//给数组赋值
Gao[1] = 10;
System.out.println(Gao.length);
String a = new String("ABCD");
System.out.println(a.length());
}
- 对带参数的成员方法来说,实参的个数、顺序以及它们的数据类型必须与形式参数的个数、顺序以及它们的数据类型保持一致,各个实参间用逗号分隔。实参名与形参名可以相同,也可以不同。
- 实参也可以是表达式,此时一定要注意使表达式的数据类型与形参的数据类型相同,或者使表达式的类型按 Java 类型转换规则达到形参指明的数据类型。
- 实参变量对形参变量的数据传递是“值传递”,即只能由实参传递给形参,而不能由形参传递给实参。程序中执行到调用成员方法时,Java 把实参值复制到一个临时的存储区(栈)中,形参的任何修改都在栈中进行,当退出该成员方法时,Java 自动清除栈中的内容。
成员变量和局部变量的区别
-
定义的位置不同
成员变量: 类体以内,方法体以外
局部变量: 方法的声明上,或者方法体内 -
在内存的位置不一样
成员变量: 在堆区分配内存
局部变量: 在栈区分配内存 -
初始化值不一样
成员变量: 系统赋予初始值
byte short int long 0
float double 0.0
boolean false
char \u0000
引用类型 null
局部变量: 方法的声明上,或者方法体内
没有默认值,必须先声明再赋值再使用 -
变量的生命周期不一样
生命周期: 变量从开始创建到销毁的全过程
成员变量: 随着对象的创建而创建,随着垃圾回收器回收对象的时候销毁
局部变量: 随着方法的调用而创建,随着方法调用结束而销毁 -
当成员变量和局部变量重名的时候,**局部变量优先,就近原则
如果希望访问成员变量,需要使用this关键字 **
Static关键字
- 类中的静态变量和方法,是在Java方法区的静态方法区的,而且在加载类之前static已经被申请了。
- 静态代码块只执行一次
- 执行顺序 静态代码块>匿名代码块>构造方法
抽象类
- 抽象类方法是一种约束,只有方法,没有方法的实现
- 不能new抽象类,只能靠子类去实现它:约束
- 抽象类中可以写普通方法
- 抽象方法必须在抽象类中
- 抽象类有构造器,抽象类存在的意义:将一些共有的方法抽象出来,提高代码开发率,防止代码重复。
起到规范性的作用,一个项目组中往往是有多个人一起开发的,如果写到子类里面,不同的人写到方法名不同,这样看起来就没有规范性了
this和super关键字的作用
-
this是对象内部指代自身的引用,同时也是解决成员变量和局部变量同名问题;
-
this可以调用成员变量,不能调用局部变量;
-
this也可以调用成员方法,但是在普通方法中可以省略this,在构造方法中不允许省略,必须是构造方法的第 一条语句。而且在静态方法当中不允许出现this关键字。
-
super代表对当前对象的直接父类对象的引用,super可以调用直接父类的成员变量(注意权限修饰符的影响,比如不能访问private成员)
-
super可以调用直接父类的成员方法(注意权限修饰符的影响,比如不能访问private成员);super可以调用直接父类的构造方法,只限构造方法中使用,且必须是第一条语句。
final和abstract关键字的作用
final和abstract是功能相反的两个关键字
-
abstract可以用来修饰类和方法,不能用来修饰属性和构造方法;使用abstract修饰的类是抽象类,需要被继承,使
-
用abstract修饰的方法是抽象方法,需要子类被重写。
-
final可以用来修饰类、方法和属性,不能修饰构造方法。使用final修饰的类不能被继承,使用final修饰的方法不能被 重写,使用final修饰的变量的值不能被修改,所以就成了常量。
-
final修饰基本类型变量,其值不能改变,由原来的变量变为常量;但是fifinal修饰引用类型变量,栈内存中
的引用不能改变,但是所指向的堆内存中的对象的属性值仍旧可以改变。
举个栗子
class Test { public static void main(String[] args) { final People people = new People("狂神"); people.name = "秦疆";//正确 people = new People("秦疆");//错误 } }