1 构造方法重载
在一个类内部,编写多个构造方法,创建对象的时候,根据需求的不同,调用不同的构造方法创建对象,实现不同的初始化。
案例:Demo1
public class Demo1 { public static void main(String[] args) { // 长方体 Box box1 = new Box(100,60,90); box1.show(); box1.showTiji(); // 正方体 Box box2 = new Box(100); box2.show(); box2.showTiji(); } } class Box{ //属性 int length; int width; int height; //构造方法 //长方体 Box(int length,int width,int height){ this.length = length; this.width = width; this.height = height; } //正方体 Box(int length){ this.length = length; this.width = length; this.height = length; } //方法: void show(){ System.out.println(length+","+width +","+height); } void showTiji(){ int result = length * width * height; System.out.println("体积是"+result); } } public class Demo2 { public static void main(String[] args) { Customer cus1 = new Customer("韩信",33,"将军"); cus1.show(); Customer cus2 = new Customer("李白",21,"诗人", "123","洛阳","bai@126.com"); cus2.show(); cus2.showAll(); } } class Customer{ //属性 String name; int age; String job; String password; String address; String email; //构造方法 Customer(String name,int age, String job){ this.name = name; this.age = age; this.job = job; } Customer(String name,int age, String job,String password, String address,String email){ this.name = name; this.age = age; this.job = job; this.password = password; this.address = address; this.email = email; } //方法 void show(){ System.out.println(name+","+age+"," +job); } void showAll(){ System.out.println(name+","+age+"," +job+","+password+","+address +","+email); } }
2 static
静态的,可以用来修饰属性,方法以及代码块。
1)静态变量(静态属性):使用static修饰的属性,称为静态变量,静态变量在内存中单独开辟存储空间,不依赖于对象而存在,可以通过类名.静态变量名直接进行访问。
访问方式:
类名.静态变量名
或者
对象名.静态变量名
案例:Demo3
public class Demo3 { public static void main(String[] args) { //类名.静态变量名 System.out.println(Foo.name); // System.out.println(Foo.age); //age是一个普通属性,只有在创建对象以后,才会为age //属性开辟存储空间。必须先有对象,然后才可以访问age //属性 //对象名.静态变量名 Foo foo = new Foo(); System.out.println(foo.name); System.out.println(foo.age); } } class Foo{ //静态变量不依赖于对象而存在,内存中单独开辟存储空间, //可以通过类名.静态变量名直接访问。 static String name = "张三";//静态变量 int age = 21;//普通属性 }
2)静态方法:使用static修饰的方法,称为静态方法,不依赖于对象而存在,可以通过类名.静态方法名(参数)直接访问。
案例:Demo4
public class Demo4 { public static void main(String[] args) { //类名.静态方法名(参数) Koo.f1(); //对象名.静态方法名(参数) Koo koo = new Koo(); koo.f1(); } } class Koo{ static void f1(){ System.out.println("今天天气很好!"); } }
访问方式:
类名.静态方法名(参数)
或者
对象名.静态方法名(参数)
3)如果main方法跟静态方法在同一个类中,在main方法中,可以直接使用静态方法名(参数)来访问静态方法。
案例:Demo5
public class Demo5 { static void f1(){ System.out.println("今天风真大!"); System.out.println("静态方法"); } public static void main(String[] args) { f1(); } } public class Demo6 { public static void main(String[] args) { for(int i=1;i<=100;i++){ double num = Math.random(); System.out.println(num); } } }
4)sun设计的工具类中经常使用到静态方法,用户可以不用创建该工具类的对象,就可以访问这些静态方法,使用方便。
Math(数学)是sun公司设计的一个工具类,Math内部所有的方法都是静态方法。
random():是一个静态方法,用来返回一个随机的小数,取值范围在[0.0,1.0)
案例:Demo7
public class Demo7 { //创建一个double类型数组ary,包含200个元素,通过 //Math.random()生成的随机给数组元素赋值。最后 //使用两种for循环,输出每一个元素的值。 public static void main(String[] args) { double[] ary = new double[200]; for(int i=0;i<=ary.length-1;i++){ ary[i] = Math.random(); } for(int i=0;i<=ary.length-1;i++){ System.out.println(ary[i]); } System.out.println(); System.out.println(); System.out.println(); for(double num : ary){ System.out.println(num); } } } public class Demo8 { //在main方法中,创建一个包含了100个元素的double //类型的数组,使用Math.random()生成的随机数给 //数组元素赋值。 //1 使用两种for循环输出每一个元素的值 //2 求出所有元素的累加之和 //3 求出元素的平均值 public static void main(String[] args) { double[] ary = new double[100]; for(int i=0;i<=ary.length-1;i++){ ary[i] = Math.random(); System.out.println(ary[i]); } System.out.println(); for(double num:ary){ System.out.println(num); } double sum = 0; for(double num:ary){ sum = sum + num; } System.out.println("累加之和:"+sum); double avg = sum/100; System.out.println("平均值是:"+avg); } }
5)代码块:使用{}括起来的一段代码,每次创建对象的时候都会默认的调用代码块一次。
案例:Demo9
public class Demo9 { public static void main(String[] args) { Eoo eoo1 = new Eoo(); Eoo eoo2 = new Eoo(); Eoo eoo3 = new Eoo(); } } class Eoo{ { System.out.println("海阔天空"); System.out.println("我变了 我没变"); System.out.println("喜欢你"); } }
6)静态代码块:使用static修饰的代码块称为静态代码块,不管创建该类多少个对象,静态代码块只执行一次。
案例:Demo10
public class Demo10 { public static void main(String[] args) { Moo moo1 = new Moo(); Moo moo2 = new Moo(); Moo moo3 = new Moo(); } } class Moo{ static{ System.out.println("围城"); System.out.println("幻城"); System.out.println("三重门"); } }
经常使用静态代码块来保存连接数据库的信息,比如密码...
3 this
当前的,现在的
1)this.属性:指代当前的属性。
2)this(参数):在当前的构造方法中,调用本类中其他的构造方法。跟构造方法重载结合使用。
必须在当前构造方法的第1行使用。
案例:Demo11
public class Demo11 { public static void main(String[] args) { Person p1 = new Person("乔峰",33,"帮主", "襄阳","feng@126.com"); p1.show(); } } class Person{ //属性 String name; int age; String job; String address; String email; //构造方法 Person(String name,int age,String job, String address){ this.name = name; this.age = age; this.job = job; this.address = address; } //给每一个属性赋值 Person(String name,int age,String job, String address,String email){ //this(参数):在当前的构造方法中调用本类中其他的 //构造方法。必须在当前构造方法的第1行使用。 this(name,age,job,address); this.email = email; } //方法: void show(){ System.out.println(name+","+age+"," +job+","+address+","+email); } } public class Demo12 { public static void main(String[] args) { User user = new User("张三",29,"经理", "abc",30000.99,"北京"); user.show(); user.showAll(); } } class User{ //属性 String name; int age; String job; String password; double salary; String address; //构造方法 User(String name,int age,String job){ this.name = name; this.age = age; this.job = job; } User(String name,int age,String job, String password,double salary, String address){ this(name,age,job); this.password = password; this.salary = salary; this.address = address; } //方法 void show(){ System.out.println(name+","+age+"," +job); } void showAll(){ //this.方法名(参数):在当前的方法中,调用本类中 //其他的方法 this.show(); System.out.println("密码:"+password); System.out.println("工资:"+salary); System.out.println("地址:"+address); } }
3)this.方法名(参数):在当前方法中调用本类的其他方法
4 继承
继承的本质就是代码的“复制”。
案例:Demo13
public class Demo13 { public static void main(String[] args) { Person2 p1 = new Person2(); p1.name = "李世民"; p1.age = 32; p1.address = "长安"; p1.show(); Teacher t1 = new Teacher(); t1.name = "李治"; t1.age = 21; t1.address = "洛阳"; t1.salary = 20000.1; t1.email = "zhi@126.com"; t1.show(); t1.showAll(); } } class Person2{//父类 //属性 String name; int age; String address; //方法 void show(){ System.out.println(name+","+age+"," +address); } } //class 子类 extends 父类 class Teacher extends Person2{//子类 //属性:姓名,年龄,地址,工资,邮箱 //继承父类Person2中的姓名,年龄,地址 double salary; String email; //方法: //继承父类中show()方法 void showAll(){ this.show();//调用父类中继承过来show()方法 System.out.println("工资:"+salary); System.out.println("邮箱:"+email); } }
1)子类会继承父类中所有的属性和方法
2)格式:
class 子类 extends 父类{
继承父类的属性和方法
在子类中编写其他的属性和方法。
}
案例:Demo14
public class Demo14 { public static void main(String[] args) { Worker worker = new Worker(); worker.name = "张翠山"; worker.job = "大侠"; worker.age = 31; worker.address = "冰火岛"; worker.phone = "13333333333"; worker.salary = 200000.1; worker.show(); worker.showYearSal(); worker.showAll(); } } class Emp{ //属性 String name; int age; String job; double salary; //方法 void show(){ System.out.println(name+","+age+","+ job+","+salary); } void showYearSal(){ double result = salary * 12; System.out.println(name+"的年薪是"+ result); } } //设计一个父类Emp //属性:姓名,年龄,职位,工资 //方法:void show():输出姓名,年龄,职位,工资 //void showYearSal():输出姓名和年薪(工资*12) class Worker extends Emp{ //属性 String address; String phone; //方法 void showAll(){ this.show(); System.out.println("地址:"+address); System.out.println("电话:"+phone); } }
3)Java中永远是单继承,一个子类只能有一个直接的父类,但是可以层层继承。
案例:Demo15
public class Demo15 { public static void main(String[] args) { Foo4 foo = new Foo4(); System.out.println(foo.num1); System.out.println(foo.num2); System.out.println(foo.num3); System.out.println(foo.num4); } } class Foo1{ int num1=100; } class Foo2 extends Foo1{ //num1 int num2=200; } class Foo3 extends Foo2{ //num1,num2 int num3=300; } class Foo4 extends Foo3{ //num1,num2,num3 int num4=400; }