(一).类和对象
java是面向对象的程序设计语言,java语言提供了定义类,成员变量,方法等最基本的功能
类可以被认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类定义的变量都是引用变量,他们将会引用到类的对象.
类用于描述客观世界里某一类对象的共同特征,而对象则是类的具体存在,java使用类的构造器来创建类的对象
java也支持面向对象的三大特征:封装,继承,多态
1.定义类
修饰符 class 类名{
构造器
成员变量
方法
}
类名每个单词首字母大写,其他小写,单词之间不要有任何分隔符
类里各成员定义顺序没有任何影响,各个成员之间可以互相调用,但静态成员不能访问非静态成员
(1)成员变量 filed
用于定义该类或该类的实例所包含的状态数据,
成员变量的修饰符: public protected private static final ,其中private public protected只能出现一个,可以与static final组合起来使用
类型:类型可以是java语言允许的任何数据类型,包括基本类型和引用类型
成员变量名:第一个单词首字母小写后面每个单词首字母大写,其余小写
(2)方法
用于定义该类或该类实例的行为特征或功能实现
修饰符: public protected private static final abstract 其中public protected private只能出现一个 abstract final 只能出现一个,他们可以和static组合使用
方法名: 与成员变量命名一致
返回值:任意类型
static可用于修饰方法,成员变量,static修饰的成员表示表示它属于这个类本身,而不属于该类的单个实例
类/静态 成员变量/方法
static真正的作用是区分成员变量.方法.内部类.初始化块成员
(3)构造器
用于构造该类的实例,通过new来调用构造器,构造器是创建一个类实例的根本途径,如果一个类没有构造器就根本无法创造实例,因此如果没有写构造器,系统会默认给出无参构造
2.对象的产生和使用
创造对象的根本途径是构造器,通过new关键字来调用某个类的构造器即可创建该类实例
person p;//通过person类定义一个变量
p=new person()//调用person类的构造器,返回person类实例,赋值给P变量
person类型的变量p 实际是一个引用,被放在栈内存中,指向person对象,而真正的person对象放在堆内存中
当一个变量被创建成功后,这个对象将保存在堆内存中,java不允许直接访问堆内存中的对象,只能通过操作该对象的引用而间接操作该对象,p中存储了地址值,并未包含任何实际数据
当堆内存中的对象没有任何引用指向时,会被垃圾回收机制自动回收
如果希望垃圾回收机制回收某个对象,只需要将他的引用变量赋值为null
3.对象的this引用
this关键字总是指向调用该方法的对象
构造器中引用该构造器正在初始化的对象
在方法中引用调用该方法的对象
this关键字最大的作用是让类中的一个方法,访问类里的另一个方法或变量
this代表的对象时当前类
(二)成员变量和局部变量
1.成员变量和局部变量
(1)成员变量:
实例变量(非静态) 只要实例存在,程序就可以访问该类的实例变量
类变量(静态) 只要类存在,程序就可以访问类变量,同一个类的实例访问类变量时,实际上访问的是该类本身的同 一个变量,也就是访问了同一片内存区
成员变量无需显式初始化,只要为一个类定义了类变量或是实例变量,系统就会在这个类的准备阶段或是创建该类实例的时候进行默认初始化
(2)局部变量:
形参 形参作用域在整个方法内有效
方法局部变量(在方法内定义) 作用域从定义处生效,方法结束出失效
代码块局部变量(在代码块内定义) 作用域从定义处生效,方法结束出失效
局部变量除了形参,都需要显式初始化,也就是必须指定初始值,否则不能使用
局部变量定义后,系统并未给这个变量分配空间,知道的程序为这个变量赋值后,系统才会为局部变量分配内存
局部变量不属于任何类或实例,保存在栈内存中
(三)隐藏和封装
封装是面向对象三大特征之一,指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类提供的方法来访问
类里面的绝大多数成员变量都应该用private修饰,只有一些static修饰的,才考虑用public修饰
(四)继承
1.继承的特点
java的继承通过extends关键字实现,实现继承的类称为子类/基类,被继承的为父类/超类
父类和超类的关系是一般和特殊的关系,例如水果和苹果
子类是一种特殊的父类,因此父类包含的范围总比子类广,可以认为父类是大类,子类是小类
格式:
修饰符 class subclass extends subclass {
//类定义部分
}
(1)子类继承父类,可以继承父类的成员变量和方法,私有的不行,不能继承父类的构造器
(2)java中只能单继承,可以多层继承,但不能多继承
(3)创建子类实例时,会先默认创建父类构造器
2.重写父类方法
方法重写的规则:
两同两小一大: 方法名相同,形参列表相同,
子类返回的类型应比父类返回的类型小或相等,子类抛出的异常应比父类小或相等
子类的访问权限应比父类大或相等
否则会有编译错误
3.super
(五)多态
多态:同一个符号在不同语义环境下具有不同的解释
1、接口和实现接口并覆盖接口中同一个方法的几种不同的类体现的。
2、父类和继承父类并覆盖父类中同一方法的几个不同子类实现的。
基本概念
多态性:在同一个时刻,体现出来的不同状态;
通过将子类对象引用赋值给父类对象引用变量来实现动态方法调用
1、如果a是类A的一个引用,那么a可以指向类A的一个实例,或者说指向类A的一个子类。
2、如果a是接口A的一个引用,那么a必须指向实现了接口A的一个类的实例。
class Fu{
int num = 20 ;
public void show() {
System.out.println("show Fu....");
}
public Fu(){
}
public static void function() {
System.out.println("function Fu...");
}
}
//子类
class Zi extends Fu{
int num = 30 ;
public void show() {
System.out.println("show Zi....");
}
public static void function() {
System.out.println("function Zi...");
}
public void method() {
System.out.println("----4");
}
}
//测试类
public class DuoTaiDemo {
public static void main(String[] args) {
//创建对象,通过子类创建对象
Fu f = new Zi() ;
System.out.println(f.num);
f.show();
f.function();
}
}
向上转型
子类自有的方法不可见
1)、代码检查不允许。
2)、从实际意义上
[java] view plain copy
- A a = new B();
- a.f(); //调用子类的f()方法
- a.f(new Two()); //编译错误(定义一个A类引用,JVM解释a.f(new Two())方法时,A类没有这个方法)
向下转型
存在于继承中,父类引用指向的对象实际是要转型的子类引用的类型。
[java] view plain copy
- 1) Animal a = new Dog();
- Dog d = (Dog) a; //正确
- 2) Animal a = new Cat();
- Dog d = (Dog) a; //抛异常