类、对象、封装

1、类模板:创建一类数据的模板,同一个.java文件多个类,可生成多个.class文件;
2、对象:由模板具体出的实例;new的过程中会向内存申请空间,与malloc类似;
3、封装:狭义上是对一个类型的所有行为的封装,即为类模板添加行为;

三大特性

1.封装:将类里的属性或实现细节隐藏起来,对外界提供公共方法
2.继承:子类继承父类所有非私有的属性和方法,父类不可以访问子类特有的属性和方法,并且是多态的前提
3.多态:一种事务运行的多种形态,多态的向上转型(父类引用指向子类对象),多态的向下转型。

构造函数、this、static函数

1、构造函数是在创建对象是使用;主要目的是给类成员变量赋值;无返回,默认无参,不被普通所调用;(比较独立的函数,不接受外界统治,只听命于对象创建)
2、this作用是类引用,是给编译器看的,不是本身具有的语法;当创建动态函数时,默认传入this,一般用于动态函数;

class Animal{
public Animal(){
    this("Tom");//调用含参构造器,前面不能有其他函数,必须放在第一位
}
}

3、static修饰的成员,当类模板被加载到内存中,就在方法区内创建;
非static修饰的成员,当创建对象时候才会在堆内存中创建;

static一般与this对比记忆

Static函数:类模板加载时候传入方法区、无this传入、类名调用;

动态函数:类对象创建时传入堆内存、隐含传入this、对象调用;


static语句块、动态语句块、局部代码块

1、静态代码块:static修饰的非局部代码块,在类加载过程中执行;
static{
    //类加载中执行
}

2、动态语句块:创建对象的时候执行,并且在构造函数之前执行;
{
//创建对象时执行,构造函数之前执行;
}(应用的较少)

3、局部代码块:定义在方法中的代码块,主要为了限制局部变量的声明周期;
public static void main(String[] args) {
{
//定义在方法中代码
}

}

内部类

成员内部类:

1、非static内部类

class OutClass{
    //this指针就是对象的引用
    int x,y;
    class Inter{
        void show(){//在非static中,隐含传入外部类的this和内部类的this 
        }
    }
}

2static内部类

class OutClass{
    int x,y;//类模板下的变量公共变量,需要被对象this指针引用从而使用;
    static int z;//可以理解为类模板自己的变量,独一份存在方法区;
    static class Inter{
        //静态方法中只能调用类模板自己的变量,因为他不能传入外部this指针
    }
}

四个代码块比较

//执行顺序如下
1.静态代码块:只执行一次、

static{
//静态代码块
}

2.普通代码块(构造代码块代码块):每新建一个对象都会执行一次

class A{

{
//
}

}

3.构造函数

4.普通函数;

public void show(){
}

匿名内部类:没有名字的内部类。
☆匿名内部类是不存在构造器的
☆ 匿名内部类可以是匿名成员内部类,也可以是匿名 局部内部类
1、通过接口和抽象类,普通类来创建匿名实例

2、父类有抽象方法,匿名内部类必须继承;

public abstract class Out {
    public abstract int getN();

    static Out Inner = new Out(){//1、Inner是外部类Out的定义
        @Overreide
        public int getN(){ }

        int nn;//2、外部类是得不得匿名内部类的变量,只能通过继承父类的方法
    };//3、特殊符号

}

权限修饰符

可修饰的内容:类、成员属性、成员方法、枚举、接口、注释

一般需要继承的东西用 protected;
一个.java文件中用public修饰的只能是一个;

单例模式

目的是保证内存中只有一个实例;
方法:private对构造函数限制,static调用;

方法1
public class SingleDemo{
    private SingleDemo(){
    }//私有的构造函数,只能在本类中被调用;
    private static SingleDemo single = new SingleDemo();

    public static SingleDemo getsingleDemo(){
    return single;
}

}

方法二
private static SingleDemo single;
private SingleDemo(){
    if(single==null){
        single = new SingleDemo();
}
}
public static SingleDemo getsingleDemo(){
    return single;
}

继承

主要目的:减少代码量

1、继承的子类在创建是会先调用自己构造函数中super();(父类的构造函数)进而先调用父类构造函数里面的内容;

2、继承关系可以无限延伸;
3、
4、父类型指向子类型的对象

大类型   小类型
父类     子类
当用父类型指向子类型实例的时候,编译器无法识别对象本身的类型,只能处理父类模板中所包含的成员变量;
//父类
public class Car {
    String type;
    String name;
    public Car() {

    }
}
//子类
public class Bin extends Car{
    public static void main(String[] args) {

        Bin b = new Bin();//用Bin接受 Bin()中的数据(父类型指向子类型的对象)
        Car bi = new Bin();//用Car接受 Bin()中的数据,小类型向上造型,,只能提取Car中的数据;
}
}

//若想调用子类模板中成员,需要强制转换后调用;如果类型转换出错,抛出ClassCaException;

 Car c = new Bin();//new Bin的对象c,由于无法识别c的类型,只能是Car类型中的变量;
 Bin ca = (Bin)c;//大类型c强转为小类型Bin;

//子类的子类
Class BinOne extends Bin{

    public BinOne(){
            super();//super包含两个父类的super内容,如果内容重名,就近原则调用Bin下的变量;
    }
}