1 引言
Java是一门面向对象编程语言,谈到类与对象,我们就不得不先回顾面向对象的一些特征。
2 面向对象的三大特征
封装性:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类
或者对象操作,对不可信的进行信息隐藏。也就是说,内部操作对外部而言不可见。
继承性:可以使用现有类的所有功能,并在无需重新编写原来
的类的情况下对这些功能进行扩展。//关键字extends
多态性:一个类实例的相同⽅法在不同情形有不同的表现形式。
多态机制使具有不同内部结构的对象可以共享相同的外部接口。
3 基本概念
类是对具体事物的抽象,它告诉了我们需要的特征,它是一个模板。
对象就是根据模板我们真正实现的具体的事物。
属性,描述每个对象的具体特点。
方法(函数),描述操作的行为。
4 类的定义
class 类名{
属性1;//例如 public int i=0;
属性2;// private static int j=10;
属性n;
方法1(){
代码块
}
方法2(){
代码块
}
}
被public所修饰的类为主类,文件名必须与主类名一致
这里引出一个阿里命名规约(按照规约命名可提高代码可读性)
类名 采用大驼峰形式命名
class PlaycomputerGame //所有单词首字母大写
方法名 采用小驼峰形式命名
public void playGame //第一个单词首字母小写,其余单词首字母均大写
包名 所有字母小写
常量名 全部大写,多个单词间下划线隔开 // String MY_NAME="一起养狗呀";
上面给出了定义类的模板,下面写段具体的代码演示
public class Person {
private String name; //实例变量:类的属性由变量来表示,这些变量称为实例变量
private int age; //实例变量
public Person(String name,int age ){ //定义了有参数的构造方法
this.name=name;
this.age=age;
}
public void getPerson(){
System.out.println("姓名:"+this.name+" 年龄:"+this.age);
}
public static void main(String[] args) {
Person person=new Person("一起养狗呀", 22); //生成对象时,会自动调用构造方法,
因为定义的是有参的构造方法,所以()内得传对应的参数
person.getPerson();
}
}
以上代码又引出以下几点
4.1实例变量
实例变量初始值为默认值。
boolean -> false
byte -> 0
short -> 0
char -> ‘\u0000’
int -> 0
float -> 0.0F或0.0f
double -> 0.0或0.0D(d)
long -> 0L或0l
数组 -> null
4.2 构造方法
✦构造方法名必须与类名相同
✦构造方法没有返回值类型声明
✦每个类中至少有一个构造方法,若没定义编译器将自动生成一个无参的构造方法
✦构造方法重载可采用换参、修改方法代码块实现,满足更丰富的实际需求
4.3 this关键字(表示当前对象的引用)
✦调用本类属性
✦调用本类方法
5 对象
5.1 对象的创建
类名 对象名 = new 类名()// 再次注意,如果是有参的构造函数,()内应传对应的参数
5.2 匿名对象
new 类名();
new Person().getPerson();
由于匿名对象不会有任何的栈空间所指向,所以使用一次后就称为垃圾空间
5.3对象的产生
✦为对象开辟内存
✦调用合适的构造参数
6 static 关键字
6.1 static 变量
为了便于区别理解。static又称为类属性,是一种共享属性。
我们描述类的属性时,一般采用实例变量(顾名思义,只有在进行实例化后才能使用)
未经实例化的实例变量报错,提示可令age变为static属性。因为static修饰的变量在实例化之前,不受对象实例化控制。
6.2 static方法
✦类似的,被static修饰的方法可以直接通过类名访问,不受实例化控制
✦所有的static方法不允许调用非static定义的属性和方法
✦所有的非static方法允许访问static属性或方法
(你可以来找我帮忙,但我只会找我的同类帮忙)
6.3 静态代码块
static{
代码块
}
补一发小测试
public class Test {
public Test(){
System.out.println("我是构造函数");
}
static {
System.out.println("我是静态代码块");
}
{
System.out.println("我是实例代码块"); //实例代码块无需关键字将代码写入{ }即可
}
public static void main(String[] args) {
Test test = new Test();
}
}
运行结果如下!
在实例化的时候,静态代码块被优先执行,其次是实例代码块,最后才是构造函数
7 内部类
7.1 实例内部类
✦实例内部类中一般不能存在static修饰的变量和方法(除非又被final修饰,被final所修饰的变量在编译过程中就已经被确定)
✦只有先创建了外部类,才能创建内部类
✦实例内部类有外层内部类的this引用
以下的代码用于初步了解实例内部类
class Outter{
public void show(){
Inner in = new Inner(); //在外部类的内部创建内部类的对象,正常创建
in.display();
}
class Inner{
public void display(){
System.out.println("找到我了");
}
}
}
public class Test {
public static void main(String[] args) {
Outter out = new Outter();
out.show();
Outter.Inner inner = new Outter().new Inner (); //在使用内部类时创建内部类对象的格式
inner.display();
}
}
7.2 静态内部类
被static所修饰的类叫做静态内部类。类比被static修饰的静态变量。
✦静态内部类的创建不需要依赖外部类
✦静态内部类不可以使用外部的非static修饰的变量名或方法
如图,str因为被static所修饰,所以静态内部类可以使用
而 show方法没有被static所修饰,所以不能被静态内部类对象所调用
7.3 方法内部类
✦顾名思义是定义在外部类方法里面的类,出了该方法就会失效
✦除了创建这个类的方法可以访问,其他地方不允许访问。
✦方法内部类不允许被访问权限修饰符修饰(public\private等都不行)
✦可以引用方法形参。此形参需声明为final
7.4匿名内部类
✦就是没有名字的方法内部类
✦匿名内部类必须实现一个接口或继承一个抽象类
✦匿名内部类中不能存在任何静态成员或者方法
✦可以引用方法形参。此形参需声明为final