Java笔记②

14 阅读10分钟

一、类与对象

(一)类

1.类声明

内容:类修饰符、类关键字class、声明父类、实现接口

(1)类修饰符

  • public: 声明该类可以在其他类中使用。缺省时,该类只能被同一个包中的其他类使用
  • abstract: 声明该类为抽象类,即这个类不能被实例化
  • final: 声明该类不能被继承,即不能有子类。也就是说,它不能通过扩展的办法来创建新类

(2)声明父类

  • extends用来声明该类的父类
  • extends只能实现单继承
  • 创建子类格式:class subclass extends 父类名{ }

(3)实现接口

  • 实现多个接口:implements 接口1,接口2,...,...
  • 接口是一种特殊的抽象类,这种抽象类只包含变量和方法的定义,而没有变量和方法的实现

(4)成员变量

定义:[修饰符] 类型 成员变量名 [= 默认值]; 修饰符:public、protected、private、static、final或者省略。public、protected、private三个不能同时出现,可以与static、final组合起来修饰成员变量 类型:引用型或基本数据类型

(4)成员方法

  • 成员方法只能在类的内部声明并加以实现
  • 定义:[修饰符] 方法返回值类型 方法名(形参列表){….方法体….}
  • 修饰符:public 、protected、private、static、final、abstract。其中访问控制符只能出现一个,abstract 和final 只能出现其一
  • 返回值:基本类型和引用类型,如果无返回值,要用void 来声明
  • static 是一个特殊的关键字,其修饰的成员表明它属于这个类本身,而不属于该类的单个实例
public class Person{
    //定义两个成员变量
    public String name;
    public int age;
    //定义一个say成员方法
    public void say(String content){
        System.out.println(content);
    }
}

2.构造器

  • 定义:[修饰符] 构造器名 (形参列表) {……}
  • 作用:创建一个对象时,系统会为这个对象的实例进行默认的初始化
  • Java类必须包含一个或一个以上的构造器。若没有给Java类提供任何构造器,则系统会为这个类提供一个无参的构造器。一旦提供了自定义的构造器,则系统不再提供默认的构造器
  • 修饰符:可以是public、protected、private之一或省略
  • 构造器名:必须和类名相同
  • 构造器不能定义返回值类型,也不能使用void声明构造器没有返回值
  • 重载:在构造器中可通过this来调用另外一个重载的构造器

(二)对象

1.对象创建

格式:类名 对象名 = new 类名( [参数列表] );

//使用Person类定义一个Person类型的变量
Person p;
//通过new关键字调用Person类构造器,返回Person实例赋给p
p=new Person();

//简写
//定义p变量的同时并为p变量赋初值
Person p=new Person();

2.对象使用

类内定义的方法和成员变量都可以通过类或实例来调用

//访问p的name实例变量,直接为变量赋值p.name ="张三
//调用p的say()方法,并定义形参p.say("Java是最好的语言");//输出p的name实例变量System.out.println(p.name);

3.this引用对象

  • 当this出现在方法中时,this代表的只能是当前类的实例
  • this 不能用在有static 修饰的方法中
public class Test {
    public static void main(String[]args){
        //定义p对象同时初始化
        Person p=new Person();
        //利用类调用run方法
        Person.run();
        //利用实例来调用run方法
        p.run();
        }
}
class Person{
    public String name;
    public int age;
    public void sing(){
        System.out.println(”正在执行sing()方法”);
        public void run(){
            //使用this引用run()方法的对象
            this.sing();
            System.out.println("正在执行run()方法");
            }
    }
}

二、成员变量和局部变量

1.成员变量

  • 成员变量指的是在类范围里定义的变量,包括类变量(static)和实例变量(无static)
  • 类变量作为类本身的一个成员,作用域与这个类的生存范围相同,与类本身共存亡
  • 实例变量作为实例的成员变量,作用域与对应实例的生存范围相同,与实例共存亡
  • 类变量也可以通过该类的实例来访问:实例.类变量
  • 成员变量无需显式初始化,在定义时,如果未赋初值,系统将进行默认初始化
  • 类变量的作用域比实例变量作用域大
  • 实例也可以访问类变量,同一个类的所有实例访问类变量时,实际上访问的是该类本身的同一个变量
  • 当类被加载时,类成员就在内存中分配了一块空间,并自动为成员变量指定初始值
  • 当对象被创建时,实例成员就在内存中分配了内存空间

2.局部变量

  • 局部变量指的是在一个方法内定义的变量
  • 分类:形参——定义方法签名时定义的变量,整个方法内有效;方法局部变量——方法体内定义,到方法结束时失效;代码块局部变量——代码块中定义,到代码结束时失效
  • 与成员变量不同:是除了形参外,其他局部变量都必须显式初始化
  • 一个方法中不同代码块内的代码局部变量可以同名
  • 如果先定义方法局部变量,后定义代码块局部变量,前面定义的局部变量和后面定义的局部变量不可以同名
  • 如果先定义代码块局部变量,后定义方法局部变量,前面定义的局部变量和后面定义的局部变量可以同名
  • 允许局部变量和成员变量重名。这样局部变量会覆盖成员变量,这时要通过this或类名来调用实例的实例变量或者类变量
  • 定义局部变量以后,系统并未为其分配内存空间,直到经过初始化以后,系统才会为局部变量分配内存,故局部变量必须经显式初始化以后才能使用
  • 局部变量不属于任何类或实例,仅在方法内有效
  • 局部变量只保存基本类型的值或对象的引用,所占内存空间通常较小
  • 能用代码块局部变量的地方,就不用方法局部变量

三、方法

(1)定义

一个方法只能定义在某个类的类体内。如果这个方法使用了 static 修饰,则该方法属于这个类,可以用类或对象调用;否则该方法属于这个类的对象,只能用对象调用

(2)参数传递

只有值传递

(3)方法重载

定义:在一个类里定义多个同名方法,形参列表不同

6.访问权限

(1)修饰符
  • public:被访问时不受任何限制
  • protected:只能由派生类或统一程序包中的类进行访问。对其他程序包的派生类而言,效果相当于共有的。对于其他程序的非派生类来说,效果相当于私有的
  • default:没有使用任何访问控制修饰符进行修饰的成员只能同一程序包中的类进行访问
  • private:不允许被自身所在的类之外的其他类访问
(2)局部变量作用域受限于方法内,不能使用访问控制符来修饰
(3)外部类只有两种访问控制符
  • public被其他类使用,且类名与文件名相同
  • default只能被同一个包中的其他类使用

四、封装

1.访问控制符规则

  • 类里的绝大多数成员变量都应使用private修饰,只有一些static修饰的、类似全局变量的成员变量,才可以考虑使用public
  • 如果某个类主要做其他类的父类,该类里包含的大部分方法仅希望被其子类重写,而不想被外界调用,则应使用protected修饰方法
  • 需要暴露出来给其他类自由调用的方法应使用public修饰
  • 类的构造器通过public修饰,来允许在其他地方创建该类实例
  • 外部类用public修饰希望供其他类自由使用

五、继承

1.形式:

class 父类 {
//父类定义部分
}
class 子类 extends 父类 {
//子类定义部分
}

2.特点

  • Java 不能多继承,只能单继承
  • 子类扩展了父类,子类拥有父类非private的属性、方法

3.方法重写

(1)规则

  • 方法名相同,形参列表相同
  • 子类返回值类型更小或相同,抛出的异常更小或相同
  • 子类访问控制权限更大
  • 覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法
  • 如果子类中定义了一个与父类private方法具有相同格式的方法,这不属于重写,因为子类无权直接访问父类的private成员

(2)super关键字

  • 当子类覆盖了父类的方法后,可以通过关键字super来调用父类的方法或属性 super.fly();
  • super不能出现在static修饰的方法中
  • 子类构造器总会调用父类构造器
  • 如果父类构造器带有参数,则必须在子类构造器中显式地通过super关键字调用父类构造器并配以适当的参数列表 super("a", 6);
  • 如果父类构造器没有参数,则在子类构造器中不需要使用super关键字调用父类构造器,系统会自动调用父类的无参构造器
  • 如果子类构造器没有显式使用super调用父类构造器;子类构造器默认会调用父类的无参构造器
  • 创建一个子类实例时,总会先调用最顶层父类的构造器

六、多态

1.定义

  • Java引用变量有两个类型:一个是编译时的类型,一个是运行时的类型,编译时的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给该变量的对象决定
  • 如果Java编译时类型和运行时的类型不一致,就会出现多态

2.多态发生的必要条件

  • 继承,从而出现多个不同子类;
  • 重写,在子类中覆盖父类的方法;
  • 向上转型,引用变量只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,是不能使用的;

3.过程

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果有,则直接调用子类的同名方法;如果没有,则编译错误

七、类型转换

  • 引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法
  • 如果要让引用变量调用它运行时类型的方法,则必须把它强制类型转换成运行时的类型

1.自动类型转换

将一个子类对象赋给父类 a=b,即向上转型

2.强制类型转换

语法:(type)变量
作用:可以将一个基本类型变量转换成另一个类型,还可以将一个引用类型变量转换成其子类类型

  • 基本类型之间的转换只能在数值类型之间进行
  • 引用类型之间的转换只能在具有继承关系的两个类型之间进行,如果是两个没有任何关系的类型,则无法进行类型转换

八、组合

1.定义

把旧类的对象作为新类的成员变量保存起来,用以实现新类的功能。用户看到的是新类的方法,而不能看到被组合对象的方法

P86代码没看懂???