构造方法是一种特殊的方法,与一般的方法不同是:
1.构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有。
2.构造方法的调用是在创建一个对象时使用new操作进行的。构造方法的作用是初始化对象。
3.不能被static、final、synchronized、abstract和native修饰。构造方法不能被子类继承。
方法重载简单说就是同一个方法名,不同的传参。
如
public void abc()
public void abc(String str)
这两个方法就是重载
构造方法也可以
如
public abc()
public abc(String str)
程序不能进行编译,因为类里没有构造方法,需要加一个空的构造方法。
空指针异常,原因是没有进行实例化
修改如下:
package new1; public class test { public static void main(String[] args) { MyClass[] arr=new MyClass[3]; arr[1]=new MyClass(); arr[1].value=100; } } class MyClass{ public int value=1; }
结果为fales,以为两者虽然赋值相同,但是开辟的数据存储地址不一样。
封装性是面向对象的第一大性,所谓的封装性起保护作用是对外部不可见的;
只要是被封装的属性必须通过setter和getter方法设置和取得
属性封装;private 属性类型 属性名称; 方法封装;private 方法方法返回值 方法名称(参数列表){}
private String name; private int age; public void tell(){ System.out.printin("姓名:"+getName()"年龄:"+getAge()); } public String getName(){ return name; } public void setName(int n){ name=n; } public int getAge(){ return age; } public void setAge(String a){ age=a; } public class zuoye{ public static void main(String args[]){ Person per=new Person(); per.name="小明"; per.age=21 per.tell(); }
secret是封装性不可直接使用
需要给secfret创建setter和getter.
x是非静态常量,内存内没有存入x的值
加static关键字 使"static int x = 50;"
6.使用类的静态变量和构造方法,可以跟踪某个类创建的对象个数。声明一个图书类,数据成员为编号,书名,书价,并拥有静态数据成员册数记录图书的总数。图书编号从1000开始,每产生一个对象,则编号自动递增(利用静态变量和构造方法实现)。下面给出测试类代码和Book类的部分代码,将代码补充完整。
class Book{ int bookId; String bookName; double price; // 声明静态变量 //定义静态代码块对静态变量初始化 //构造方法 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; } //定义方法求图书总册数 //重写toString方法 } 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()); } } }
补充完整:
public class Book { int bookId; String bookName; double price; static int i=1000; // 声明静态 变量 //定义静态代码块对静态变量初始化 public Book(String bookName,double price) { i++; this.bookName=bookName; this.price=price; bookId=i; } //构造方法 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 static int totalBook() //定义方法求图书总册数 { return i-1000; } public String toString() //重写toString方法 { return " 书名:" + this.getBookName() + " " + " 价格:" + this.getPrice() + " " + " 编号:" + bookId+ " "; } } public class zuoye{ 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()); } } }
单个类在使用过程中只有一个实例;
单例类是有自己创建这个实例;
同时为所有对象提供这一实例。
class Sun{ private static Sun instance = new Sun() ; private Sun(){ } public static Sun getInstance(){ return instance ; } public void printf(){ System.out.println("Hello World!"); } public class zuoye{ public static void main(String arg[]){ Sun s1=Sun getInstance(); Sun s2=Sun getInstance(); s1.print() s2.print() } };
结果为Java中String型变量传参只传了变量中的内容;
传递到change方法中不能改变空间存放内容。
(二)实验总结
1.类的设计程序:
程序设计思路 利用封装性setter和getter 依次写出日期类、职工类和部门类
再利用方法写出测试类 在以上三个类中赋值。
问题 不理解lenght的使用总是出错;
会定义结构 但不会根据结构取出数据。
解决方法 测试类中不用lenght 直接一个个定义 一个个赋值
2.评分系统:
程序设计思路:利用二位数组的方法,利用循环先输出选手号与成绩让后输出求平均分时同时排序。
问题:不会使用动态数组,往数组里输入数据
在排序求平均分的基础上再求出最小值最大值等对我来说有点难度有点乱所以没能写出来。
3.Email验证
程序设计思路:在主函数中定于输出 ,在定义布尔类型进行调用。
问题:不知道如何定义使"@"在"."之前,以为直接写成"@."即可。
解决方案:email.indexOf("@")<email.indexOf(".")