Java - 面向对象从基础到高级之进阶
面向对象进阶
一、封装private
在开发中,为了避免出现逻辑错误(例如:年龄为负值),我们建议对所有属性进行封装,并为其提供setter及getter方法进行设置和取得操作(eclipse中使用shift + Alt +s快捷创建set和get),这样一来除了当前类,其它地方就无法直接访问并修改当前类的属性。
private int age;
void setAge(int age2) {
if(age2<0 || age2>150) {
System.out.println("年龄不合理,自动设置为1");
age = 1;
} else {
age = age2;
}
}
二、this
this指的是当前对象
在Java基础中,this关键字是一个最重要的概念。使用this关键字可以完成以下的操作:
1.调用类中的属性
2.调用类中的方法或构造方法
3.表示当前对象
注意:在一个构造方法中,使用this来调用另一个构造方法时,调用的代码必须编写在构造方法的第一行。
Clothes(String brand,String color) {
this.brand = brand;
this.color = color;
}
三、static
1.概述:
static表示静态的意思,可以用来修饰成员变量、成员方法(静态代码块、静态内部类)。
static的主要作用在于创建独立于具体对象的域变量或者方法。
2.简单理解:
被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
并且不会因为对象的多次创建,而在内存中建立多份数据。
3.举例:
比如说描述X公司的所有Java学员的信息,属性包括: 姓名、年龄、性别、爱好、公司、学科,由于这些学员的公司都为X公司,学科都为Java学科,如果不用static修饰属性,那么每增加一名学员就需要多给定一次公司及学科,很不方便。但是如果用static对公司和学科这两个属性进行修饰,那么只需要设置一次公司及学科的属性,后续所有学员的公司和学科就全都不用再次给定了。
public class Demo1 {
public static void main(String[] args) {
XCompany.setCompany("X公司");
XCompany.setCourse("Java学科");
new XCompany("张三",18,'男',"编程");
new XCompany("李四",23,'男',"篮球");
new XCompany("王五",28,'女',"体操");
new XCompany("赵六",33,'无',"乒乓球");
new XCompany("千岁",1000,'男',"我是神");
}
}
public class XCompany {
//构造方法
XCompany() {}
XCompany(String name,int age,char sex,String love) {
this.name = name;
//年龄不能小于0或大于150,否则输出错误信息,并赋予默认值1
if (age<0 || age>150) {
System.out.println("年龄有误,默认认定为1!");
this.age = 1;
} else {
this.age = age;
}
//性别必须为男或女,否则输出错误信息,并赋予默认值男
if (sex != '男' && sex != '女') {
System.out.println("性别有误,默认认定为男!");
this.sex = '男';
} else {
this.sex = sex;
}
this.love = love;
say();
}
//属性
private String name;
private int age;
private char sex;
private String love;
private static String company;//静态
private static String course;//静态
//方法
public void say() {
System.out.println("姓名:"+name+",年龄:"+age+",性别:"+sex+",爱好:"+love+",公司:"+company+",学科:"+course);
}
public static void setCompany(String company) {
XCompany.company = company;
}
public static void setCourse(String course) {
XCompany.course = course;
}
}
4.重点:
1.静态成员在类加载时加载并初始化,当其被调用时,有可能对象还未创建(可以通过类直接调用)。
2.无论一个类存在多少个对象,静态的属性,永远在内存中只有一份(所有对象公用)
3.在访问时:静态不能访问非静态,非静态可以访问静态!
四、代码块
1.普通代码块:
在执行的流程中出现的代码块。
{
int a = 1;
int b = 2;
int c = a + b;
//在这里可以访问a、b、c的数据
}
//在这里将无法访问a、b、c的数据
2.构造代码块:
在类中的成员代码块,我们称其为构造代码块,在每次对象创建时执行一次,执行在构造方法之前。
3.静态代码块:
在类中使用static修饰的成员代码块,我们称其为静态代码块,在类加载时(第一次使用)执行。每次程序启动到关闭,因为类只加载一次,所以静态代码块只执行一次。
4.构造代码块和构造方法的区别:
无论用户调用哪一个构造方法来创建对象,构造代码块都必然执行。而构造方法存在无参构造方法和有参构造方法,如果调用无参构造方法,则有参构造方法的代码不会执行,如果存在都需要执行的代码,可以选择写在构造代码块中。
5.执行顺序:
静态代码块→构造代码块→构造方法
6.举个例子:
题目:通过类描述衣服,每个衣服对象创建时需要自动生成一个序号值。
要求:每个衣服的序号是不同的,且是依次递增 1 的。
public class Demo2 {
public static void main(String[] args) {
new Clothes("AAA","红色");
new Clothes("BBB","橙色");
new Clothes("CCC","黄色");
new Clothes("DDD","绿色");
new Clothes("EEE","蓝色");
new Clothes("FFF","紫色");
new Clothes();
}
}
class Clothes {
//静态代码块,在类加载时执行一次
static {
System.out.println("欢迎使用!");//只会执行一次
}
//构造代码块,每次创建对象时执行一次
{
count++;//序号递增1
}
//无参构造方法
Clothes() {
this.brand = "默认品牌";
this.color = "默认颜色";
say();
}
//全参构造方法
Clothes(String brand,String color) {
this.brand = brand;
this.color = color;
say();
}
//属性
private String brand;
private String color;
private static int count;//序号计数,也是static的重要应用之一
//方法
public void say() {
System.out.println("序号:"+count+".品牌:"+brand+",颜色:"+color);
};
}
五、包
1.包介绍:
把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
包如同文件夹一样,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
2.使用规则:
包中java文件的定义:在.java文件的首部,必须编写类所属哪个包,格式:package 包名;
包的定义:通常由多个单词组成,所有单词的字母小写,单词与单词之间使用.隔开,一般命名为:com.公司名.项目名.模块名……
规范由来:由于Java面向对象的特性,每名Java开发人员都可以编写属于自己的Java Package,为了保障每个Java Package命名的唯一性,在最新的Java编程规范中,要求开发人员在自己定义的包名前加上唯一的前缀。由于互联网上的域名称是不会重复的,所以多数开发人员采用自己公司在互联网上的域名称作为自己程序包的唯一前缀。例如:com.java.xxx
3.import 关键字(导包):
import 包名.类名;
六、权限修饰符
常用的:public、private。
七、main方法
public static void main(String args[])
以上的各个参数的含义如下:
public:表示公共的内容,可以被所有操作所调用
static:表示方法是静态的,可以由类名称直接调用。java StaticDemo3
void:表示没有任何的返回值操作
main:系统规定好的方法名称。如果main写错了或没有,会报错:NoSuchMethodError: main
String[] args:字符串数组,接收参数的
public class StaticDemo3 {
public static void main(String args[]) {
for (int i=0;i<args.length;i++) {
System.out.println(args[i]);
}
}
}
所有的参数在执行类的时候以空格进行分割:
java StaticDemo3 1 2 3 4 5 6 7
java StaticDemo3 “hello world” “hello vince” “hello mjw”
下一篇: Java8 Stream 使用