一、构造方法
·当一个对象被创建时,构造方法用来初始化该对象,给对象的成员变量赋初始值。
构造方法执行的时机:创建对象的时候,作用:给对象的成员变量赋初始值
构造方法有自己独有的方法格式
·根据是否有参数分类
-空参构造
-有参构造
·定义格式
修饰符 构造方法名(参数列表){
方法体(给对象的成员变量赋初始值)
}
·特点
1、方法名必须和类名一致Person类构造方法名: Person(){} Student类 构造方法名:Student
2、没有返回值,不需要返回值类型.连void都不要写
3、默认被jvm调用使用。不能手动调用new构造方法();构造方法必须跟在new关键字的后面.
注意事项
1、如果一个类你不提供构造方法,系统会给出空参构造方法。
2、如果你提供了构造方法,系统将不再提供无参数构造方法。以后写的只要写构造方法,就把空参构造加上. (空參构造中-一般什么都不写)修饰符 类名() {}
3、构造方法是可以重载的,既可以定义参数,也可以不定义参数。
示例:
public class Person {
private String name;
private int age;
private String sex;
public Person(){
name = "张三";
age = 19;
sex = "男";
}
public Person(String name){
this.name = name;
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
public Person(String name,int age,String sex){
this.name = name;
this.age = age;
this.sex = sex;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getSex() {
return sex;
}
}
public class UsePerson {
public static void main(String[] args) {
Person p = new Person();
System.out.println(p.getName()+p.getSex()+p.getAge());
Person p1 = new Person("李四");
System.out.println(p1.getName()+p1.getSex()+p1.getAge());
Person p2 = new Person("王五",20);
System.out.println(p2.getName()+p2.getSex()+p2.getAge());
Person p3 = new Person("赵六",30,"男");
System.out.println(p3.getName()+p3.getSex()+p3.getAge());
}
}
构造方法和setter都可给私有成员变量赋值.
1.构造方法-般是new对象的时候使用,创建对象的同时就知道要为每个成员变量赋什么值,就用构造方法.代码更加简洁
2.创建完对象还要给成员赋值,修改成员变量的值,只能时候用setter方法。set ter比构造方法更加灵活.
二、静态-static关键字
(一)概述
1.概述
静态就是static,主要用来修饰java的变量(静态变量)和方法(静态方法)的关键字。一个变量或方法一旦被static修饰,那么它就是静态的内容了
2.,没有静态
如果某个类型的所有对象,都具有一个相同的属性值,那么这个属性值就没有必要在所有对象中,都存储一份。还有坏处:浪费堆内存空间:维护难度大,一旦需要修改,就得修改所有的对象。
3.有静态
如果某个类型的所有对象,都具有一一个相同的属性值,那么就在这个属性的定义上,加一个static静态关键字。让该变量存储在方法区字节码的静态区中,避免了所有对象都存储相同数据的题,节省了内存空间,将来维护容易(只需要修改一次)
(二)静态变量的特点
1、静态变量属于类(直接可以通过类名访问静态变量),不会随着对象的变化而变化(内存位置)
2、加载时机:
随着类(字节码文件加载方法区)的加载而加载。
静态变量随着类的加载进方法区,就直接在静态区给开辟了存储静态变量的内存空间,并赋初始值.
3、静态变量优先于对象而存在
4、静态变量被所有该类对象所共享
5、调用方式:
最合适的调用方式:类 名调用
格式:类名.静态变量
也可以通过对象名调用,但是会有警告 格式:对象名.静态变量
示例:
public class Person {
public String name;
public static String color;
public Person(){}
public Person(String name){
this.name = name;
}
public static void show(){
System.out.println("静态变量"+color);
//test();
test2();
}
public void test(){
System.out.println(name);
System.out.println(color);
}
public static void test2(){
System.out.println(color);
}
}
public class UsePerson {
public static void main(String[] args) {
Person.color="黄色";
Person p = new Person("张三");
System.out.println(p.color);
}
}
(三)静态方法的注意事项
1、静态方法:在方法声明上,加上了static关键字的方法,就是静态方法
public static 返回值类型方法名(参数列表) {方法体}
2、静态方法不能访问非静态的变量(成员变量)
原因:静态方法可以在没有创建对象的时候调用,而非静态的变量只有在对象创建之后才存在。如果静态方法可以访问非静态的变量,那么就相当于在对象创建之前,就访问了对象创建之后的数据。明显不合理。
3、静态方法不能访问非静态的方法(成员方法)
原因:静态方法可以在没有创建对象的时候调用:非静态的方法可以访问非静态的变量。如果静态方法可以访问非静态的方法,就相当于静态方法间接的访问了非静态的变量,和第2点矛盾。
静态方法早于对象存在,而非静态方法属于对象,如果静态方法能访 问非静态方法,就相当于使用了一个不存在对象方法,明显不合理;
4、静态方法中不能存在this关键字
原因:
this关键字表示本类当前对象。静态方法可以在对象创建之前调用。如果静态方法可以访问this关键字,相当于在创建对象之前,就使用了对象本身----矛盾。
总之就一句话:静态方法不能使用所有对象内容,静态方法只能用静态的内容反之非静态方法,就可以使用所有静态的内容,因为对象出现的比静态的内容晚.
5.静态方法的调用方式:
最合适的调用方式:类名调用 格式:类名.静态方法名(实参);
也可以通过对象名调用,但是会有警告 格式:对象名.静态变量方法名(实参):
(四)静态变量和非静态变量的区别
1.概念上,所属不同:
非静态变量属于对象
静态变量属于类,类变量
2.内存空间不同,存储位置不同
非静态变量属于对象属于对象,所以存储在堆内存中
静态变量属于类,存储在方法区的静态区中
3.内存存活时间不同,生命周期不同
非静态变量属于对象,所以生命周期和对象相同,随着对象的创建二存在,随着对象的消失而消失
静态变量属于类,所以生命周期和类相同,随着类的加载二存在,随着类的消失而消失
4.访问方式不同
非静态变量只能使用对象访问
静态变量既可以使用对象访问,也可以通过类名访问
三、继承
(一)继承的概念
1.概述
继承是面向对象三大特征之一,继承会产生父子类,可以使得子类具有父类的属性和方法,而且还可以在子类中重新定义,以及追加属性和方法一-种体现方式
比如: A继承B A就是子类,B就是父类,A可 以不定义B类出现的内容,也可以定义,还可以添加自己类中独有的内容.而且即使A不定义B类中内容,A也可以使用B类内容.
总结:继承就是让两个类之间产生关系,这种关系就是继承关系.现实生活中继承
2.继承的实现
继承通过关键字extends 实现的,具有自己固有的格式
格式:
修饰符class 子类extends父类{ }
继承关系建立一定要合理.不能为了继承而继承,
举例:
class Dog extends Animal { }
好处:
继承可以让类与类之间产生子承父业的关系,形成生子父类后,子类则可以直接使用父类中非私有的成员。
示例:
public class Animal {
public String name;
public int age;
private String sex;
public void setSex(String sex) {
this.sex = sex;
}
public String getSex() {
return sex;
}
public void eat(){
System.out.println("吃");
}
public void sleep(){
System.out.println("睡");
drink();
}
private void drink(){
System.out.println("喝水");
}
}
public class Dog extends Animal{
}
public class UseDog {
public static void main(String[] args) {
Dog d = new Dog();
d.name = "二哈";
d.age = 3;
d.setSex("公的");
System.out.println(d.getSex());
d.eat();
d.sleep();
//d.drink();
}
}
(二)继承的好处
1.好处
提高了代码的复用性
2.弊端
继承让类与类之间产生了关系,类与类之间的耦合性增强(两个类之间的关系性增强)了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性.