类及成员修饰符
- public:表示被修饰的成员不仅可以被内部成员访问,而且可以被其他类直接访问。
- protected:表示被修饰的成员可以被类自身、该类的子类、与该类在同一个包中的其他类访问。
- private:表示被修饰的成员只能被类自身访问。
- default:缺省值。表示被修饰的成员可以被自身以及与该类在同一个包中的其他类直接访问。
- final:不能派生子类,方法不能被重写,成员变量初始化后不能被重新赋值或修改。
类的定义格式
- 定义静态变量和静态方法即在变量和方法名前加一个
static
关键字。 - java应用程序可以有多各类,但是只能有一个主类,
主类的类名与java文件名相同
。
[类修饰符] class 类名[extends 父类名] [implements 接口名]{
//类体,包括定义类的成员变量和成员方法
[修饰符] 数据类型 成员变量;
[修饰符] 返回值数据类型 方法名([参数列表]){
//方法体
}
}
类的实例化
- 在面向对象的程序设计中,类是程序的基本单元。
- 类是一种抽象的复合数据类型,用户定义好类后,必须将类实例化(即生成对象),然后才能通过实例访问其成员变量和方法。
类名 对象名 = new 类名([参数列表])
//new关键字为生成的对象分配一片内存区域,并返回该对象的一个引用
- 实例成员为实例特有,只能通过对象名访问;
- 类成员(静态成员)为类所有,可通过类名或对象名访问;
- 静态成员变量在生成该类的第一个对象时分配内存空间,该空间被类的所有实例所共享。
构造方法
- 方法名必须与类名相同,且不能有任何的返回值;
- 构造方法只能由new运算符调用;
- 构造方法可以被重载;
- 构造方法不能被继承。
利用构造函数初始化对象
class Student{
int no;
String name;
Student(int id,String sname){
this.no=id;
this.name=sname;
}
public static void main(String args[]){
//可以通过args[]接收多个命令行参数
Student s1=new Student(20168892,"shuxiaozhai");//实例化对象过程中进行初始化
System.out.println("姓名:"+s1.name+"学号:"+s1.no);
}
}
父类对象和子类对象之间的转换
- 子类对象可以显示或隐式转换为父类对象。
- 父类对象转换为子类对象,如若转换可行,则必须进行显示转换。
super、this关键字
super:
- 在子类成员方法中,访问父类的成员变量;
- 在子类成员方法中,访问父类的成员方法;
- 在子类成员方法中,访问父类的构造方法;
this:
- 引用当前对象,可以访问在局部变量作用区域内被隐藏起来的成员变量。
- 在本类成员方法中,访问父类的成员变量;
- 在本类成员方法中,访问父类的另一个成员方法;
- 在本类成员方法中,访问父类的另一个构造方法;
this调用必须是构造方法的唯一的第一个语句。
封装
将操作和操作所设计的数据捆绑在一起,使其免受外界干扰和误用。
面向对象的三大特性:封装、继承和多态;
继承是多态的前提,如果没有继承就没有多态;
师父会的武功,大徒弟和小徒弟都会;
继承主要解决的问题是:共性抽取,解决共性问题。
在继承关系中,子类可以被当作父类来对待,例如父类是员工,子类是讲师,则讲师就是一个员工。
继承
- 子类继承父类除访问权限为private的成员变量和方法,可为其增加新的特性,提高复用性。
- java.lang.Objectl类是所有类的公共最高父类(祖宗类),如java.lang.String就是Objectd的子类。
- java只支持单继承——只有一个直接父类。继承可传递。
- java语言可以多级继承。
- 一个类的直接父类是唯一的,但是一个父类可以拥有很多个子类。
重写Override(覆盖、覆写)
:在继承关系当中,方法名称一样,参数列表也一样。- 名称和参数列表都相同,实现的功能不同。
- @ Override:写在方法前面,用来检测是不是正确的覆盖重写,这个注释就算不写,只要满足要求,也是正确的方法覆盖重写;
- 子类方法的返回值范围必须【小于等于】父类方法的返回值范围;
- 子类方法的权限必须【大于等于】父类方法的权限修饰符。
public>protected>(default)>private
default不是关键字,而是留空,什么都不写。 - java中不可以重写private的方法。
继承关系中,父子类构造方法的访问特点:
1、子类构造方法当中有一i个默认隐含的“suoer()”调用,所以一定先执行的父类构造,然后执行子类构造;
2、子类构造可以通过调用super关键字来调用父类重载构造;
3、super()
的父类构造调用,必须是子类构造方法的第一个语句,一个子类构造不能多次调用super构造。
继承关系当中的特点:
- 子类可以继承父类中可继承的内容;
- 子类还可以拥有自己专有的新内容。
在父子类的继承关系当中,创建子类对象,访问成员方法规则:
创建的对象是谁,就优先用谁,如果没有则向上找;
注意事项:
无论是成员方法还是成员变量,如果没有都是向上找,绝对不会向下找子类。
多态
相同名称的方法有不同的功能,相同接口有多种实现方法。
重载Overload
- 相同的方法名,不同的参数列表(数量和数据类型不同),方法调用时根据参数列表自动匹配;
- 返回的数据类型不能区分重载方法。
抽象类和抽象方法abstract
- 抽象类不能被实例化,必须被继承;
- 使用关键字extends实现继承
- 一个类包含抽象方法则该类必须定义成抽象类,但是抽象类不一定要包含抽象方法;
- 抽象方法的方法体可以实现,也可以不是先({}中为空);
- 访问权限可以是public,protected,private(无法继承),也可以没有(同一个包下才能继承);
- 继承时如果没有覆盖抽象父类中的方法,则会默认调用抽象父类中的方法;否则调用子类中覆盖的方法;
- 可以有main方法和构造器。
接口interface
- 接口不能实例化成对象;
- 使用关键字implements来实现接口
- 接口中所有的方法都是抽象的,没有方法体【省略abstract】;
- 实现某接口的子类必须重写该接口中的**
所有方法
**; - 接口中所有的成员都是静态常量(默认为static final),不可变;
- 接口不允许调用没有初始化的属性变量;
- 不可以有main方法和构造器
- 所有成员变量都必须是public或无修饰符,不允许出现private变量和private方法;
- 接口都没有方法体,即无{}
public interface Teacher {
public static final int i=5;
public int number =0;
public void teach();
void study();
}
Class类
- java运行时系统为所有对象维护一个被称为运行时的类型标识,这个类称为Class,其重要方法包括:
注解类型
注解类型 | 说明 |
---|---|
内建注解 | 标准注解类型:@Override限定重写父类方法、@Deprecated标示已过时、@SuppressWarnings抑制编译器警告 |
元注解 | 修饰其他的注解定义:@Target表示注解用于什么地方、@Retention在什么级别保存该注解信息、@Documented指定被其修饰的注解将被JavaDoc工具提取成文档、@Inherited允许子类继承父类中的注解 |
自定义注解 | 注解类型是一种接口,使用关键字@interface定义,自动继承java.lang.annotation.Annotation接口。 |
匿名对象
匿名对象只能使用一次,下一次使用需要创建一个新的对象。确定只用一次就可以用匿名对象。
//匿名对象
new Person().name = "赵又廷";
new Person().showName();//输出为null
API概述
API(application Programming interface):应用程序编程接口java API是JDK提供的类的使用说明文档。
需要关注包路径、构造方法和成员方法。
scanner
功能:Scanner类的功能:实现键盘输入数据到程序中
/*
*引用类型的一般使用步骤
* 1、导包:包路径。类名称;
* 如果需要使用的目标类和当前类在同一包下,则可以省略导包语句;
* 只有java.lang包下的语句需要导包,其他的包都需要import语句;
* 2、创建:
* 类名称 对象名 = new 类名称();
* System.in代表从键盘输入
* 3、使用:
* 对象名.成员方法名()
*/
import java.lang.String;
import java.util.Scanner;
Scanner sc = new Scanner(System.in);
int num = ac.nextInt(); //获取键盘输入的int数字
String str = sc.next(); //获取键盘输入的字符串
Random
功能:Random类负责随机数字的生成
导包:
import java.lang.Random;
创建:
Random r = new Random();//小括号当中留空即可
使用:
int num=r.nextInt();//获取一个随机的int数字(包括int的正负所有范围)
int num=r.nextInt(3);//获取一个随机的int数字(参数代表范围,左闭右开区间)
//实际代表[0,3),也就是0,1,2