【java】 构造函数、单例、静态、抽象、继承、接口、多态、Object

1、构造代码块是给所有的对象进行初始化;

     构造函数是给对应的对象初始化;

2、当在类中自定义了构造函数后,默认的构造函数就没有了;

    构造函数是在对象一建立就运行,给对象初始化;

    而一般的方法是在对象调用才执行,给对象添加对象具备的功能;

    一个对象建立,构造函数只运行一次;而一般方法可以被该对象调用多次;

3、public static void main(String[] args)   args 是可以改的
        主函数:特殊的函数、程序入口,可被jvm调用
        public :代表访问权限最大;
        static: 代表主函数随着类的加载就已经存在了;
        void : 主函数没有具体访问值;
        main:不知关键字;可被jvm识别;
        (String[] arr) : 函数的参数,类型为数组,该数组中的元素是字符串,字符串类型的数组;
        主函数是固定格式的:jvm识别。

        jvm在调用主函数时,传入的是new String[0];

4、单例设计模式:解决一个类在内存中只存在一个对象。

    想要保证对象唯一;
    1、为了避免其他程序过多建立该类对象。先禁止其他程序建立对象;
    2、还为了让其他程序访问到该类程序,只好在本类中自定义一个对象;
    3、为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。

    代码体现:
    1、将构造函数私有化;
    2、在类中创建一个本类对象;

    3、提供一个方法可以获取到该对象。

    对于事物该怎么描述,该怎么描述;

    当需要将该事物的对象保证在内存中的唯一时,加上以上三步即可。

5、记住原则:定义单例时,建议使用饿汉式.

    先初始化对象;Single类一进内存就已经创建好了对象。

    懒汉式:对象是方法被调用时,才初始化,也叫做独对象的延时加载,什么时候需要,什么时候创建对象。
Single类进内存时,对象还没有存在,只有调用了getinstance方法时,才建立对象。

class Single
{
	private static Single s = new Single();
	private Single(){};

	public static Single getInstance()
	{
		return s;
	}
}
懒汉式的优化,加快效率:
class Single
{
	private static Single s = null;
	private Single(){}
	public static Single getInstance()  //sy
	{
		if (s==null)
		{
			synchronized(Single.class)  //synchronized 相当于给门上了把锁,三个方法ABC,A在里面,则B进不来,A新建对象,出去后,B再进来,此时已有对象,直接返回s,C不为空,第一次判断null时就进不来 
			{
				if (s==null)
					s = new Single();
			}	
		}
		return s;
	}
}

6、静态

(1)什么时候使用静态

    静态修饰成员变量和函数。静态方法只能访问静态成员;非静态方法静态,非静态都可以访问;
(2)什么时候定义 静态变量(类变量)呢?
当对象中出现共享数据时,该数据被静态所修饰,
        对象中的特有数据要定义成非静态存放在堆内存中。
(3)什么时候定义 静态函数呢?

    当功能内部没有访问到非静态数据(对象的特有数据),该功能可以被定义为非静态。

static特点:
1、随着类的加载而加载;也就说静态会随着类的消失而消失,说明它的生命周期最长。
2、优先于对象存在;明确:静态是先存在,对象是后存在的。
3、被所有对象所共享;
4、可以直接被类名所调用。
实例变量和类变量的区别:
1、存放位置
    类变量随着类的加载而存在于方法区(也就是共享区)中,
    实例变量随着对象的建立而存在堆内存中。
2、生命周期
    类变量生命周期最长,随着类的消失而消失,
    实例变量生命周期随着对象的消失而消失。
/*
静态代码块:
static
{
	执行语句;
}
特点:随着类的加载而加载,只执行一次,无需调用。并优先于主函数。
用于给类进行初始化。
注意:代码块的执行顺序。
*/
class StaticCode
{
    int num =9;
    String name; //非静态变量;成员变量,实例变量
    static String country ="cn; //静态的成员变量、类变量
    StaticCode()
    {
        System.out.println("b");
    }

    static
    {
        System.out.println("a"); //静态代码块,给类初始化的
    }
    {
        System.out.println("c"+this.name); // 构造代码块,给对象初始化的
    }

    StaticCode(int x)
    {
        System.out.println("d");//构造函数,给对应对象初始化的
    }

    public static void show()
    {
        System.out.println("show run");
    }
}

class StaticCodeDemo
{
    static
    {
        //System.out.println("b");
    }

    public static void main(String[] args)
    {
        //new StaticCode();
        //new StaticCode(); //StaticCode类已经存在,static已经被执行一次了,不再执行。
        new StaticCode(4); //e a c9 d
    }
    static
    {
        System.out.println("e");
    }
}
//output: e a cnull d

7、抽象

    典型的抽象类是模板模式(11条),只定义确定的部分,将不确定的部分暴露出去(如员工和经理都有工资,但经理还有分红,见第8条继承中的eg)。

1.抽象类不能被实例化。
2.抽象类可以有构造函数,被继承时子类必须继承父类一个构造方法,抽象方法不能被声明为静态。
3.抽象方法只需申明,而无需实现,抽象类中可以允许普通方法有主体
4.含有抽象方法的类必须申明为抽象类
5.抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类。
/*
当多个类中出现相同功能,但是功能主体不同,
这时可以进行向上抽取。这时,只抽取功能定义,而不抽取功能主体。

抽象:看不懂。
抽象类特点:
1、抽象方法一定定义放在抽象类中;
2、抽象方法和抽象类都必须被abstract关键字修饰;
3、抽象类不可以被new创建对象,因为调用抽象方法没意义。
4、抽象类中的抽象方法要被使用,需要由子类复写所有的抽象方法后,建立子类对象调用。
	如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。
	父类只定义功能(需求),由子类去完成。

抽象类和一般类没有太大的不同。
该如何描述事物就如何描述。只不过该事物中出现了一些看不懂的东西。
这些不确定的部分,也是该事物的功能,需要明确出现,但是无法定义主体,
通过抽象方法来表示。

抽象类比一般类多了抽象函数,在类中可以定义抽象方法
只定义类和方法;抽象类不可以实例化。

特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。

8、继承 

    通俗地讲,继承就是从很多对象中抽取出共有属性。把共同的操作写成一个父类,然后让子类去继承它,那么我们就不用在写相同的代码了。

将学生和工人的共性描述提取出来,单独进行描述,
只要将两者与单独描述的这个类有关系,就可以了。

继承:extends
1、提高代码的复用性;
2、让类与类之间产生关系,有了这个关系,才有了多态的特性。

子类继承父类中的功能。子类应具备父类中的所有功能,才能去继承
eg:开发系统时需对员工建模,员工包含三个属性:姓名、工号、工资,
经理也是员工,除了含员工的属性外,还有奖金属性,
请使用继承的思想设计出员工类和经理类,要求类中提供必要的方法进行属性访问。

员工类: name,id,pay
经理,除了上面三个,还有自己的bonus
*/

abstract class Employee
{
	private String name;
	private String id;
	private double pay;

	Employee(String name,String id,double pay)  //确定的部分
	{
		this.name=name;
		this.id=id;
		this.pay=pay;
	}
	public abstract void work();//抽取功能定义  不确定的部分
} 

class Manager extends Employee
{
	private int bonus;
	Manager(String name,String id,double pay)
	{
		super(name,id,pay);  //继承父类
		this.bonus=bonus;
	}
	public void work()
	{
		System.out.println("manager work");
	}
}

9、final

/*
final:最终,作为一个修饰符;
1、可以修饰类、函数、变量。
2、被final修饰的类不可以被继承。为了避免被继承,被子类复写功能
3、被final修饰的方法不会被复写。
4、被final修饰的变量是一个常量只能复制一次,既可以修饰成员变量,也可以修饰局部变量。
	当描述事物时,一些数据的出现值是固定的,那么为增加阅读星,都给这些变量起个名字以便阅读;
	当这个值不需要改变时,再加上final修饰。作为常量,常量的书写规范是所有字母都大写,多个单词间则通过下划线连接。
5、内部类定义在类中的局部位置上,只能访问该局部被final修饰的局部变量。
*/

class Demo
{
	final int x =3;
	public static final double PAI =3.14;//将PAI的值固定,加static则可共享,public赋权限,但值不会变
	final void show1()
	{}
		void show2()
	{
		final int y=4;
		System.out.println(3.14);
	}
}

10、 interface 接口
       通俗地讲,就是我要连接数据库,执行增删检查操作,还要关闭数据库,那么我就可以写一个接口,然后再写一个类去实现这些方法。接口是一种特殊的类,只需定义它要完成的任务,而不需要实现任何方法和属性
public interface DBUtil {
    public void openConnection();
    public List findData(String hql );
    public void closeConnection;
}
     单继承、多实现。类与类之间是继承,接口之间也是继承,类与接口之间是实现。
    抽象类是为继承而精心设计的,接口则更多以组合的方式使用。
/*
接口:初期理解:可以认为是一个特殊的抽象类
	当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。
class用于定义类
interface 用于定义接口

接口定义时,格式特点:
1、接口中常见定义:常量、抽象方法
	常量:public、static、final
	方法: public、abstract
记住:接口中的成员都是public的。

接口: 是不可以创建对象的,因为有抽象方法。
需要被子类实现,子类对接口中的抽象方法全部覆盖后,子类才可以实例化。否则子类是一个抽象类。

*/

interface Inter
{
    public static final int NUM = 3;
    public abstract void show();
}
interface InterA
{
    public abstract  void method();
}
interface InterC extends Inter,InterA
{
    void methodC();
}
class Demo
{
    public void function(){};
}
class Test extends Demo implements Inter,InterA  //Test继承Demo,又实现两个接口
{
    public void show(){};
    public void method(){};
}

public class InterfaceDemo
{
    public static void main(String[] args)
    {
        Test t = new Test();
        System.out.println(t.NUM);   // 3
        System.out.println(Test.NUM);  // 3
        System.out.println(Inter.NUM);  // 3
    }
}

11、模板设计方法

    典型的抽象类,将不确定的部分暴露出去

/*
需求:获取一段程序运行的时间。
原理:获取程序开始和结束的时间并相减即可。 

获取时间:System.currentTimeMillis();

当代码完成优化后,就可以解决这类问题。

这种方式,模板方法设计模式。

什么是模板设计方法?
在定义功能时,功能的一部分是确定的,但是有一部分是不确定的,而确定的部分在使用不确定的部分,
那么这时就将不确定的部分暴露出去,由该类的子类去完成。

提高扩展性、复用性。
*/

abstract class GetTime
{
	public final void getTime()  //写final,强制性避免覆盖
	{
		long start = System.currentTimeMillis();
		
		runcode();

		long end  = System.currentTimeMillis();
		System.out.println("毫秒:"+(end-start));
	}
	public abstract void runcode();

}

class SubTime extends GetTime
{		
	public void runcode()
	{
		for (int x=0;x<4000 ;x++ )
		{
			System.out.print(x);
		}
	}
}

class  TemplateDemo
{
	public static void main(String[] args) 
	{
		//GetTime gt = new GetTime();
		GetTime gt = new SubTime();
		gt.getTime();
	}
}

12、多态

     cat,是猫科,也是动物,这就是多态。多态,可以理解为事物的多种体现形态。用多态,可以只调用共有属性eat(),也可强制转换后调用独有属性catchMouse()。

abstract class Animal
{
    public abstract void eat();
}

class Cat extends Animal
{
    public void eat()
    {
        System.out.println("eat fish");
    }
    public void catchMouse()
    {
        System.out.println("catch mouse");
    }
}

public class DuotaiDemo {
    public static void main(String[] args)
    {
//        Cat c = new Cat();
//        c.eat();
//        c.catchMouse();
        Animal a = new Cat(); //类型提升,向上转型,不能向下
        a.eat();  //此时只有eat()方法,没有catchMouse()方法
//        function(new Cat());
    }
    //先调用父类功能,子类去实现,并把子类参数传进去
    public static void function(Animal a)
    {
        a.eat();
        if (a instanceof Cat)  // instanceof 用来判断所属类型
        {
            //调用Cat的特有属性,强制将父类的引用转换为子类型
            Cat c = (Cat)a;
            c.catchMouse();
        }
    }
}

13、Object

    Object类是Java中唯一没有父类的类。其他所有的类,包括标准容器类,比如数组,都继承了Object类中的方法。





猜你喜欢

转载自blog.csdn.net/sisteryaya/article/details/80155153