构造方法是用于对对象初始化的方法,当新对象被建立的时候,构造函数会被调用。
每个类都有构造函数。在程序员没有给类提供构造函数的状况下,Java编译器会为这个类建立一个默认的构造函数。
构造函数的重载是函数名与类名相同,参数类型不一样,参数不一样。
1.构造方法的名称必须与类名一致
2.构造方法的声明处不能有任何返回值类型的声明
3.不能在构造方法中使用return
4.当本身声明构造方法后,系统再也不建立默认的无参构造方法
下面的程序是否能够经过编译?为何?java
public class Test { public static void main(String args[]) { Foo obj = new Foo(); } } class Foo{ int value; public Foo(int intValue){ value = intValue; } }
不能经过编译,由于没有无参构造方法,类中只定义了有参构造方法,此时编译器再也不创建默认的无参构造方法。git
public class Test { public static void main(String[] args) { MyClass[] arr=new MyClass[3]; arr[1].value=100; } } class MyClass{ public int value=1; }
编译报错,只声明的对象数组,没有实现对象实例化,应该对数组里的每一个对象元素,经过new构造方法进行实例化程序员
public class Test { public static void main(String[] args) { Foo obj1 = new Foo(); Foo obj2 = new Foo(); System.out.println(obj1 == obj2); } } class Foo{ int value = 100; }
false,由于比较的是两个对象的引用地址,两个对象都是经过new开辟的不一样的新的空间。数据库
public class Time { private int year,month,day; //字段用private隐藏起来 public Time(){ } public Time(int year,int month,int day){ this.year=year; this.month=month; this.day=day; } public int getYear() { //经过get,set方法读取隐藏数据 return year; } public void setYear(int year) { this.year = year; } public int getMonth() { return month; } public void setMonth(int month) { this.month = month; } public int getDay() { return day; } public void setDay(int day) { this.day = day; } public String toString( ){ return year+"-"+month+"-"+day; } }
class A{ private int secret = 5; } public class Test{ public static void main(String args[]){ A a = new A(); System.out.println(a.secret++); } }
不能,由于secret字段是private私有的,不能直接访问操做。设计模式
public class Test{ int x = 50; static int y = 200; public static void method(){ System.out.println(x+y); } public static void main(String args[]){ Test.method(); } }
mothod方法是static修饰的,只能访问static修饰的字段,x不是。数组
书名,书价,并拥有静态数据成员册数记录图书的总数。图书编号从1000开始,每产生一个对象,
则编号自动递增(利用静态变量和构造方法实现)。下面给出测试类代码和Book类的部分代码,将代码补充完整。函数
class Book{ int bookId; String bookName; double price; // 声明静态变量 public static n; //定义静态代码块对静态变量初始化 static { n=0; } //构造方法 public Book(String bookName,double price ){ this.bookName=bookName; this.price =price ; n++; this.bookId=1000+n; } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } //定义方法求图书总册数 public int totalBook(){ return n; } //重写toString方法 public string toString(){ return "编号"+bookld+“书名”+bookName+"价格"+"price "+"图书总数目为"+n; } } public class Test{ public static void main(String args[]){ Book[] books = {new Book("c语言程序设计",29.3), new Book("数据库原理",30), new Book("Java学习笔记",68)}; System.out.println("图书总数为:"+ Book.totalBook()); for(Book book:books){ System.out.println(book.toString()); } } }
static的两个经常使用操做,统计该类的对象总数,实现自动编码。学习
单例模式:保证一个类在使用过程当中,只有一个实例。
特色:这个类永远只有一个实例。测试
class Sun{ private Sun instance = new Sun(); private Sun(){ } public static Sun getInstance(){ return instance; } }
public class Test { String str = new String("你好 "); char[] ch = { 'w','o','l','l','d' }; public static void main(String args[]) { Test test = new Test(); test.change(test.str, test.ch); System.out.print(test.str); System.out.print(test.ch); } public void change(String str, char ch[]) { str = "hello"; ch[0] = 'W'; } }
结果:你好 Wolld
str一开始将本身的引用复制给了局部str,可是局部str又引用了hello,当函数结束调用后,局部str释放,没有涉及远str的改动;
字符数组和c原理相同,经过传入地址,直接在地址上进行修改;this
在裁判类中声明一个选手类,在测试类中经过构造方法引用到选手对象,在裁判对象里实现对选手对象的操做。
没什么要注意的,定义一个方法,当条件都合法的时候,返回true,不然返回false,若是还想知道哪一个条件不合法,能够在判断结构里直接输出提示,也能够返回
特定数值,而后在主方法里,经过返回值判断哪一个条件不合法。
个人思路没有改变原字符串,而是在原字符串里一段一段枚举去找合法的子串,枚举的长度是要找子串的长度,从第一个字母开始找,若是这段是,则从这段后的字符开始再找(i+length),若是不是,从下一个字符判断(i++)。
用split方法,将主串拆分;
首字母变大写的实现方法有不少,我是先将字符串变成了字符数组,而后改变首字母,再经过构造方法变回字符串。
统计数量: 用lastIndexOf方法找到最后出现点的位置,而后截取后面的子串,两层循环遍历,内层:先到第一个不为空的字符串,记录,变为空,而后找到下面
全部相同的字符串,记录,变空,最后输出数目;外层:当数组全为空时退出。
time类没有什么好说的,tostring方法输出规定格式;
职员类:字段中有时间对象和部门对象;
部门类: 字段中有时间对象,项目经理(职员对象),和职员数组(包括了项目经理);
测试类:以部门对象为主要对象,外层循环实现部门对象,内层循环实现职员对象,第一个职员对象做为部门经理,最后职员对象数组传给部门对象;
为了验证明现是否正确,遍历了全部部门以及部门中的职员;相关查询操做:总的来讲,先遍历部门,在部门中职员,由于部门中有职员对象的引用,职员对象中
也有部门对象引用,能够经过部门对象找到要找的职员,也能够经过职员找到部门,或者他的经理等等,查询很方便,在程序中我是查询的职员编号,而后输出了该职员的全部信息,包括他的部门和经理。