类是对一类事物的描述,是抽象的、概念上的定义。Java 中定义类的关键字是:class。
具有相同特征和行为的对象抽象成类,类描述了这一类对象的属性和方法:
public class Emp{
public String name;
public int age;
public double salary;
public void info(){
System.out.println(name+"=="+age+"=="+salary);
}
}
对象(实例):对象是某个类的实例,是实际存在的某个类的个体。
Java 中通过类创建对象的关键字是:new。
Emp e1=new Emp();//创建对象
属性是用来描述具体某个对象的特征。描述的是对象的状态信息,通常以变量的形式进行定义。
方法描述类的行为,命名一般是动词,由方法三要素(返回值,方法名,参数列表)组成。
属性和方法的调用
Emp e1=new Emp();
e1.name="小王";
e1.info();
局部变量和成员变量
局部变量 | 成员变量 | |
---|---|---|
位置 | 方法内 | 类内方法外 |
作用域 | 方法内 | 类内 |
默认值 | 无 | 有 |
内存位置 | 栈 | 堆 |
生命周期 | 方法 | 对象 |
作用:提高程序的数据安全性。
操作:属性私有化,提供公共的 getter/setter 方法访问私有属性。
数据安全:数据校验、数据访问。
class Person
{
private int age;
private String name;
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return age;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void result()
{
System.out.print(name+"今年"+age+"岁了!");
}
}
构造方法(构造函数):用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种。
作用:完成属性数据初始化操作。
时间:对象实例化的时候被调用。
存在:若用户不定义,系统会自动生成一个无参的空的构造方法。反之,则系统不会自动生成无参构造方法。
特点:
class Person
{
private int age;
private String name;
public Person(){
}
public Person(String name){
this.name=name;
}
public Person(String name,int age){
this.name=name;
this.age=age;
}
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return age;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void result()
{
System.out.print(name+"今年"+age+"岁了!");
}
}
this:用来引用当前类的实例变量。
this. 属性名:大部分时候,普通方法访问其他方法、成员变量时无须使用 this 前缀,但如果方法里有个局部变量和成员变量同名,但程序又需要在该方法里访问这个被覆盖的成员变量,则必须使用 this 前缀。
public class Person{
public Person(String name,int age){
this.name=name;
this.age=age;
}
}
this. 方法名:this 关键字最大的作用就是让类中一个方法,访问该类里的另一个方法。
public class Dog {
public void jump() {
System.out.println("正在执行 jump 方法");
}
public void run() {
System.out.println("正在执行 run 方法");
this.jump();
}
}
this( ) 访问构造方法
public class Person{
public Person(){
this("无名氏");
}
public Person(String name){
this(name,20);
}
public Person(String name,int age){
this.name=name;
this.age=age;
}
}
super: 可以用来访问父类的构造方法、普通方法和属性。
super. 属性名:当子类的成员变量或方法与父类同名时,可以使用 super 关键字来访问。
class Person{
String name="person";
}
class Student extends Person{
String name="student";
public void info(){
System.out.println(this.name+"===="+super.name);
}
}
super. 方法名:如果子类重写了父类的某一个方法,即子类和父类有相同的方法定义,但是有不同的方法体,此时,我们可以通过 super 来调用父类里面的这个方法。
class Person{
public void eat(){
System.out.println("Person 吃饭~~~");
}
}
class Student extends Person{
public void eat(){
System.out.println("学生吃饭吃饭~~~");
}
public void info(){
this.eat();
super.eat();
}
}
super( ) 可以在子类的构造方法中显式地调用父类的构造方法
public class Person {
public Person(String name) {
}
}
public class Student extends Person {
public Student(String name){
super(name);
}
}
同一个类中,方法名相同,参数不同(个数不同|类型不同|顺序不同),与方法返回类型和权限无关的方法。
public void println(int i){…}
public void println(double d){…}
public void println(String s){…}
Java 中一共有四种访问权限控制,其权限控制的大小情况是这样的:public > protected > default(包访问权限) > private , 具体的权限控制看下面表格,列所指定的类是否有权限允许访问行的权限控制下的内容:
访问权限 | 同类 | 同包的类 | 子类 | 非子类的外包类 |
---|---|---|---|---|
public | 是 | 是 | 是 | 是 |
protected | 是 | 是 | 是 | 否 |
default | 是 | 是 | 否 | 否 |
private | 是 | 否 | 否 | 否 |
定义:同一个对象在不同的环境(开发环境、运行环境)下表现出不同的类型(父类、子类)。
使用:在声明数据类型的时候,能用父类用父类,能用接口用接口。(重写父类方法)
意义:提高代码重用性,进而提升维护性和扩展性。
public class Test {
public static void main(String[] args) {
People p=new Stu();
p.eat();
//调用特有的方法
Stu s=(Stu)p;
s.study();
//((Stu) p).study();
}
}
class People{
public void eat(){
System.out.println("吃饭");
}
}
class Stu extends People{
@Override
public void eat(){
System.out.println("吃肉");
}
public void study(){
System.out.println("好好学习");
}
}
Object 是 Java 类库中的一个特殊类,也是所有类的父类。也就是说,Java 允许把任何类型的对象赋给 Object 类型的变量。当一个类被定义后,如果没有指定继承的父类,那么默认父类就是 Object 类。
Object 常用方法:
方法 | 说明 |
---|---|
Object clone() | 创建与该对象的类相同的新对象 |
boolean equals(Object) | 比较两对象是否相等 |
void finalize() | 当垃圾回收器确定不存在对该对象的更多引用时,对象垃圾回收器调用该方法 |
Class getClass() | 返回一个对象运行时的实例类 |
int hashCode() | 返回该对象的散列码值 |
void notify() | 激活等待在该对象的监视器上的一个线程 |
void notifyAll() | 激活等待在该对象的监视器上的全部线程 |
String toString() | 返回该对象的字符串表示 |
void wait() | 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待 |
深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,两个引用对象指向两个对象,但对象内容相同。
浅拷贝:对基本数据类型进行值传递,对引用数据类型复制一个引用指向原始引用的对象,就是复制的引用和原始引用指向同一个对象。
接口:抽象类是从多个类中抽象出来的模板,如果将这种抽象进行的更彻底,则可以提炼出一种更加特殊的“抽象类”——接口(Interface)。
why:为了解决父类单根性。
特点:一个类只能继承(extends)一个父类,但是可以实现(implements)多个接口。
功能:1、体现类的能力。2、接口定义一种规范和标准。
语法:接口中的属性都是静态常量;接口中的方法都是抽象方法。接口可以多继承。
1.8 后接口中的可定义默认方法和静态方法,它们不算抽象方法。1.9 以后还可以有私有方法。
面向接口编程
当 Java 程序编译后成为 .class 文件 ==> 类加载器(ClassLoader)==> 将字节码文件加载进 JVM 中;
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。单例模式可以分为懒汉式和饿汉式等多种形式。
单例模式有以下特点:
饿汉式:不论是否需要都创建对象。
public class Singleton {
//先把对象创建好
private static final Singleton singleton = new Singleton();
private Singleton() {}
//其他人来拿的时候直接返回已创建好的对象
public static Singleton getInstance() {
return singleton;
}
}
我们上面的案例就是使用的饿汉模式。 这种模式是最简单最省心的,不足的地方是容易造成资源上的浪费,常创建好对象但是没人使用。
懒汉式:需要时创建,不需要不创建。
public class Singleton {
private static Singleton singleton = null;
private Singleton() {}
//获取对象的时候再进行实例化
public static Singleton getInstance() {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
return singleton;
}
}
懒汉模式解决了饿汉模式可能引起的资源浪费问题,因为这种模式只有在用户要使用的时候才会实例化对象。但是这种模式在并发情况下会出现创建多个对象的情况。