目录
3.初始化定义box的长宽高属性值,然后用有参构造做颜色,输出这个盒子
4.面向对象的三大特性
1.static
存在的主要意义
- static的主要意义是在于创建独立于具体对象的域变量或者方法。以致于即使没有创建对象,也能 使用属性和调用方法!
- static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置 于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执 行每个static块,并且只会执行一次。
- 为什么说static块可以用来优化程序性能?是因为它的特性:只会在类加载的时候执行一次。因此, 很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行
static的独特之处
- static是静态的意思,可以用来修饰成员变量、成员方法。static修饰成员变量之后称为静态成员变量(类变量),修饰方法之后称为静态方法(类方法)。
- static修饰后的成员变量,可以被类的所有对象共享(访问、修改)。
- 在该类被第一次加载的时候,就会去加载被static修饰的部分,而且只在类第一次使用时加载 并进行初始化,注意这是第一次用就要初始化,后面根据需要是可以再次赋值的。
- static变量值在类加载的时候分配空间,以后创建类对象的时候不会重新分配。赋值的话,是 可以任意赋值的,取最后值!
- 被static修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没 有创建对象,也可以去访问
static注意事项
- 静态成员变量,(内存中只有一份、只加载一次、属于类)输出时,默认访问类中静态成员最后一次出现的值,建议用类名访问,也可以用对象访问.
- 静态方法中是不可以出现this关键字的。
静态方法和实例方法与成员的区别
- 静态方法只能访问静态的成员,不能访问实例成员和实例方法。
- 实例方法可以访问静态的成员,也可以访问实例成员。
- 实例成员变量只能用对象触发(new)访问及使用更改。
- 在外部调用静态方法时,可以通过类名.方法名的方式也可以使用对象.方法名的方式,而 实例方法只有后面这种方式
- 成员方法表示对象自己的行为的,且方法中需要直接访问实例成员,则该方法必须申明成实例方法。
- 成员方法如果该方法是以执行一个通用功能为目的,或者需要方便访问,则可以申明成静态方法.
1.static
例:
package java_jichu.mianxiangduixiang.demo09;
//static
public class Student {
private static int age;//静态变量 多线程会经常使用
private double score;//非静态变量
public void run(){
//非静态方法可以直接调用静态方法
go();
}
public static void go(){
//静态方法可以调用静态方法
System.out.println("我是1");
}
public static void main(String[] args) {
go();
// run();静态方法不能直接调用非静态方法,
new Student().run();//需要new一个Student.run()得到run()
}
}
package java_se.java_jichu.zuoye8_10;
public class Test {
public static void main(String[] args) {
System.out.println(User.name);//静态变量可以直接调用
// System.out.println(User.age);//报错
User u =new User();
System.out.println(u.age);
System.out.println(u.name);
User u1=new User();
u1.age=23;
u1.name="黑马程序员";
User u2=new User();
u2.age=35;
u2.name="传递教育";
System.out.println(u1.age);//23 new的对象的age所以不变
System.out.println(u1.name);//传递教育 这里的name始终是调用的static的静态成员,而不是用new调用的,所以u1或者u2或者un个数都是看最后一次改的值
}
}
/*
package java_se.java_jichu.zuoye8_10;
public class User {
static String name;
int age;
}
*/
2.代码块运行顺序机制
代码块是类的5大成分之一(成员变量、方法,构造器,代码块,内部类),定义在类中方法外。
在Java类下,使用 { } 括起来的代码被称为代码块 。代码块分为
静态代码块:
格式:static{}
特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次
使用场景:在类加载的时候做一些静态数据初始化的操作,以便后续使用。构造代码块(了解,见的少):
格式:构造器{}
特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在构造器执行前执行
使用场景:初始化实例资源。局部代码块:用于限定变量生命周期,及早释放,提高内存利用率
例:
package java_jichu.mianxiangduixiang.demo09;
public class Person {
//第三个执行
public Person() {
System.out.println("构造方法");
}
//第二个执行,赋初始值
{
System.out.println("匿名代码块");
}
//第一个执行,只能执行一次
static {
System.out.println("静态代码块");
}
public static void main(String[] args) {
Person person1 = new Person();//静态、匿名、构造
System.out.println("==========");
Person person2 = new Person();//匿名、构造
}
}
2.封装
- 我们程序设计要追求“高内聚,低耦合" 高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。
- 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界 访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个 类也没有什么意义了
记住这句话就够了:属性私有,/get/set
例:
package java_jichu.mianxiangduixiang.demo02;
//封装
//类private:私有 public 公有
public class Student {
//属性私有
private String name;//名字
private int id;//学号
private char sex;//性别
private int age;
// 提供一些可以操作这个属性的方法!
// 提供一些public的get、set方法
//get(获得这个属性)
public String getName() {
return this.name;
}
public int getId() {
return this.id;
}
public char getSex() {
return this.sex;
}
public int getAge() {
return this.age;
}
//set(给这个属性赋值)
public void setName(String name) {
this.name = name;
}
public void setId(int id) {
this.id = id;
}
public void setSex(char sex) {
this.sex = sex;
}
public void setAge(int age) {
if (age>120||age<0){//不合法
this.age=3;
}else {
this.age = age;
}
}
}
/*
Student s1 = new Student();
s1.setName("雙馬");
//方法名,参数列表
System.out.println(s1.getName());
s1.setAge(999);
System.out.println(s1.getAge());
1.提高程序的安全性,保护数据
2.隐藏代码的实现细节
3.统一接口
4.系统可维护增加了
*/
1.用无参和有参输出两个人信息
package java_se.java_jichu.zuoye8_5;
import java.util.Random;
public class TestStudent {
/*
(1)编写一个Java程序,创建一个Student类,其中有属性name、gengder、age三个字段,
定义一个无参的构造方法和带三个参数的构造方法,分别对属性进行赋值,定义一个成员方法show,
将三个属性的内容输出。创建主类TestStudent,分别用无参构造方法和有参构造方法创建两个Student类型对象,
并输出成员属性的值。
*/
public static void main(String[] args) {
Student s1 = new Student("雙馬","你猜",20);
s1.show();
Student a1=new Student();
a1.setName("双马");
a1.setGengder("