类和对象
类和对象的概念
类:客观存在的,抽象的,概念的东西。一个类可以被定义为描述行为的模板;
对象:对象是具体的,实际的,代表一个事物。对象具有状态和行为。
类是对象的模板,对象是类的一个具体实体。
一个类可以包含以下任意变量类型。
a)局部变量: 方法里面,构造函数或块中定义的变量称为局部变量。该变量将被声明和初始化的方法中,当该方法完成该变量将被销毁。
b)实例变量: 实例变量都在一个类,但任何方法之外的变量。这些变量在类被加载的实例化。实例变量可以从内部的任何方法,构造函数或特定类别的块访问。
c)类变量: 类变量是在一个类中声明,任何方法之外的变量,用static关键字。
类可以有任意数量的方法来访问各种方法的值。
Java中,关键字 new 用于创建新的对象。
从类创建对象时有三个步骤:
声明: 变量声明,一个变量名的对象类型。
实例: "new"关键字是用来创建对象。
初始化: 关键字 new 后跟调用一个构造函数。这个调用初始化新的对象。
只能有一个有public类在每一个源文件。
源文件可以有多个非公共类。
公共类名应该是源文件,以及应当由 .java 在末尾附加的名称。例如:类名是 public class Employee{} 将源文件应为 Employee.java。
如果类在包中定义,那么 package 语句应该是在源文件中的第一条语句。
如果 import 语句都存在,那么它们必须写 package 语句和类声明之间。如果没有包(package)语句,那么import语句应该是源文件中的第一行。
导入和包语句将意味着对所有现有的源文件中的类。不可能的声明不同的 import和/或包语句不同类的源文件中。
类有几个访问级别,有不同类型的类,抽象类,final类等将在访问修饰符章解释这些。
除了上述类型的类,Java也有一些特殊的类称为内部类和匿名类。
Java包:
简单地,它是分类的类和接口的方式。在开发Java应用程序中,数以百计的类和接口将会被写入,因此,分类这些类是必须的。
import语句:
在Java中,如果一个完全合格的名称,其中包括包和类名,变量的话,编译器可以很容易地找到源代码或类。 import语句是给予适当的位置,是编译器发现,特定的类的方法。
成员变量:再类中定义,用来描述对象将要有什么。
局部变量:在类的方法中定义,在方法中临时保存数据。
区别:作用域不同;初始值不同;优先级
局部变量的作用域仅限于定义它的方法;成员变量的作用域在整个类内部可见。
Java会给成员变量一个初始值,不会给局部变量赋予初始值
两类变量同名时,局部变量具有更高的优先级。
使用new+构造方法创建一个新的对象
构造方法是定义在Java类中的一个用来初始化对象的方法,构造方法与类名相同且没有返回值。
public 构造方法名(){
//代码块;
}
没指定构造方法时,系统自动生成无参构造方法(默认构造方法)。
当有指定构造方法,无论是有参,无参构造方法,都不会自动添加午餐的构造方法。
构造方法重载:方法名相同,参数不同的多个方法。
构造方法不但可以给对象的属性赋值,还可以保证给对象的属性赋一个合理的值。
Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问。鉴于他作用的特殊性更推荐用类名访问。
使用 static 可以修饰变量、方法和代码块。
注意:静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收!
与静态变量一样,也可以使用 static 修饰方法,称为静态方法或类方法。其实之前我们一直写的 main 方法就是静态方法。
静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。;
如果希望在静态方法中调用费静态变量,可通过创建类的对象,然后通过对象来访问非静态变量。
在普通方法成员中,则可以直接访问同类的非静态变量和静态变量。
Java中可以通过初始化块进行数据赋值。
Public class HelloWorld{
String name;//定义一个成员变量
//通过初始化块为成员变量赋值
{
name = "周星驰";
}
}
在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。
注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。
执行顺序:静态初始化块—普通初始化块—构造方法。静态初始化块只在类加载时执行一次。
封装
封装、继承、多态和抽象。
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
只能通过规定的方法访问数据;
隐藏类的实力细节,方便修改和实现。
修改属性的可见性(设为private);
创建getter/setter方法(用于属性的读写);
在getter/setter方法中加入属性控制语句(对属性值得合法性进行判断)。
也可以使用普通方法为属性赋值(非标准)。
包的作用:管理Java文件;解决同名文件冲突。
定义包:package包名。
注:必须放在Java源程序的第一行;包名间可以使用"."隔开。
系统中的包:
Java.(功能).(类)
Java.lang.(类)包含Java语言基础的类
Java.util.(类)包含各种工具类
Java.io.(类)I/o相关功能
包的使用:
通过import关键字,在某个文件中好似用其他文件中的类;
包的命名规则是全小写;
使用时不仅可以加载某个包下的全部文件,也可以加载某个具体子包下的所有文件。
Java语言中有4种访问修饰符——可以修饰属性和方法的访问范围。
package(默认)、private、public和protected。
package是默认的保护模式,又叫做包访问,没有任何修饰符时就采用这种保护模式。包访问允许域和方法被同一个包内任何类的任何方法访问.(包内访问)。
private标识得访问模式,表示私有的域和方法只能被同一个类中的其他方法访问,实现了数据隐藏;必要时,可以通过方法访问私有变量.(类内访问)。
public修饰符用于暴露域和方法,以便在类定义的包外部能访问它们。对包和类中必要的接口元素,也需要使用这个级别;main()方法必须是public的,toString()方法也必须是public的。一般不会用public暴露一个域,除非这个域已经被声明为final。(跨包访问)。
protected修饰符提供一个从包外部访问包(有限制)的方法。在域和方法前增加protected修饰符不会影响同一个包内其他类的方法对它们的访问。要从包外部访问包(其中含有protected成员的类),必须保证被访问的类是带有protected成员类的子类。也就是说,希望包中的一个类被包之外的类继承重用时,就可以使用这个级别。一般应该慎用。(包中类被包外类继承慎用)。
this关键字代表当前对象
封装对象的属性的时候经常使用this关键字
定义:定义在另外一个类里面的类。包含内部类的类被称为外部类。
作用:a)内部类提供了更好的封装,可以吧内部类隐藏在外部类之内,不允许同一包中的其他类访问该类;b)内部类的方法可以直接访问外部类的所有数据,包括私有数据;c)内部类所实现的功能使用外部类同样可以实线,只是使用内部类更方便。
包括:
成员内部类;
静态内部类;
方法内部类;
匿名内部类。
1、Inner 类定义在 Outer 类的内部,相当于 Outer 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,如 public 、 protected 、 private 等
2、 Inner 类中定义的方法可以直接访问 Outer 类中的数据,而不受访问控制符的影响,如直接访问 Outer 类中的私有属性a
3、 定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即:内部类 对象名 = 外部类对象.new 内部类( );
4、 编译的程序后,会发现产生了两个 .class 文件
Outer$Inner.class
Outer.class
其中,第二个是外部类的 .class 文件,第一个是内部类的 .class 文件,即成员内部类的 .class 文件总是这样:外部类名$内部类名.class
1、 外部类是不能直接使用内部类的成员和方法
可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法。
2、 如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字。
静态内部类是 static 修饰的内部类,这种内部类的特点是:
1、 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问
2、 如果外部类的静态成员与内部类的成员名称相同,可通过"类名.静态成员"访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过"成员名"直接调用外部类的静态成员
3、 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();
方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。
注意:由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。
继承
类与类的一种关系,"is a"的关系。
子类具有父类的所有属性和方法(代码复用)
语法:class 子类 extends 父类{
//代码块
}
定义:如果子类对继承父类的方法不满意,重写父类的方法,调用时会优先调用子类的放方法。
语法:返回值类型、方法名、参数类型及个数都要与父类继承的方法相同。
1、先初始化父类对象
2、先执行初始化对象中属性,在执行构造方法中的初始化。
final关键字的使用
可以修饰类、方法、属性和变量
修饰类:该类不允许被继承;
修饰方法:该方法不允许被覆盖(重写)
修饰属性:该类的属性不会进行隐式的初始化(类的初始化属性必须有值),或在构造方法中赋值(只能选其一)
修饰变量:该变量只能赋一次值,即变为常量。
在对象内部使用,可以代表父类对象,类似于this关键字。
子类的构造过程中必须调用其父类的构造方法(隐式的使用super关键字)。
如果子类构造方法中既没有显式调用父类的构造方法,而父类没有无参的构造方法,则编译出错。
Object类
1、toString()方法
在Object类里定义toString()方法的时候返回对象的哈希code码(对象地址字符串)(
可通过重写toString()方法表示出对象的属性
2、equals()方法
比较的是对象的引用是否指向同一块内存地址。
3、getClass()方法得到类对象
类对象描述的是类代码信息(类有那些属性,成员等等),判断两个对象类型是否相同。
多态
引用多态
父类的引用可以指向本类的对象;
父类的引用可以指向子类的对象。
方法的多态
创建本类对象时,调用的方法为本类的方法;
创建子类的对象时,调用的方法为子类重写的方法或者继承的方法。
注:父类引用不能引用子类的独有的方法。
向上类型转换(隐式/自动),小类型到大类型——无风险
向下类型转换(强制),大类型到小类型——有风险
通过instanceof运算符,解决饮用对象的类型,避免类型转换的安全性问题。
使用abstract关键字修饰。
限制规定子类必须实现某些方法,但不关注实现细节。
使用规则:a)abstract定义抽象类;b)abstract定义抽象方法,只有声明,不需要实现;c)包含抽象方法的类是抽象类;d)抽象类中可以包含普通的方法;e)抽象类不能直接创建,可以定义引用变量。
1、概念:特殊的类,由全局常量和公共的抽象方法所组成。
类是一种具体实现体,接口定义了某一批所需要遵循的规范,借口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它之规定这些类里必须提供某些方法。
2、定义:interface关键字。
3、基本语法:[修饰符] interface 接口名 [extends 父接口1,父接口2…]
{
零到多个常量定义…
零到多个抽象方法的定义…
}
4、常量/方法:接口中的属性是常量,即使定义时不添加public static final 修饰符,系统也会自动加上。
5、使用接口:一个类可以实现一个或多个接口(implements)关键字。Java中一个类只能继承一个父类,不够灵活,通过实现多个接口可以做补充。
[修饰符] class 类名 extends 父类 implements 接口1, 接口2…
{
类体//如果继承了抽象类,需要实现继承的抽象方法;要实现接口中的抽象方法。
}
如果要继承父类,继承父类必须在实现接口之前。
6、接口在使用过程中,还经常与匿名内部类配合使用。
匿名内部类就是没有名字的内部类,多用于关注实现而不关注实现类的名称。
Interface I = new Interface(){
Public void method(){
System.out.println("niming");
}
}
转载于:https://www.cnblogs.com/willhunting/p/5052602.html