二、面向对象基础
2.1 封装
1.变量私有化,private
2.生成get 、set方法 快捷键alt +insert
class Animal {
public int legs;
public void eat(){
System.out.println("Eating");
}
public void move(){
System.out.println("Moving.");
}
}
public class Zoo {
public static void main(String args[]) {
Animal xb = new Animal();
xb.legs = 4; //问题:xb.legs = -1000,解决方式将legs属性封装起来,防止乱用
System.out.println(xb.legs);
xb.eat();
xb.move();
}
}
// 未封装 ,输入什么什么都可以打印,这个例子的意思是动物的腿,所以说不可以输入负数,所以此处就不合理!
封装后:
class Animal {
private int legs;// 将属性legs定义为private,只能被Animal类内部访问
public void setLegs(int i) { // 在这里定义方法 eat() 和 move()
if (i != 0 && i != 2 && i != 4) {
System.out.println("Wrong number of legs!");
return;
}
legs = i;
}
public int getLegs() {
return legs;
}
}
public class Zoo {
public static void main(String args[]) {
Animal xb = new Animal();
xb.setLegs(4); // xb.setLegs(-1000);
//xb.legs = -1000; // 非法
System.out.println(xb.getLegs());
}
}
//get set方法封装后对输入的腿数做了一个限制,输入不合理的腿数便会输出错误的腿数。
2.2构造函数(相等于方法)
1.它具有与类相同的名称
2.不声明返回值类型
3.不能被static final synchronized abstract native修饰,不能有return返回值
作用:创建对象,给对象进行初始化!
如同我们规定每个人一出生就必须先洗澡,我们就可以在人的构造器中加入完成洗澡的代码,于是人一出生就会自动完成洗澡,程序就不用在人刚出生时告诉他们要洗澡了
public class Animal {
private int legs;
// 构造器
public Animal() {
legs = 4;
}
public void setLegs(int i) {
legs = i;
}
public int getLegs() {
return legs;
}
}
根据参数不同分为两类:
隐式无参构造器(系统默认提供)
显式定义一个或者多个构造器(无参、有参)
java语言中每个类都至少有一个构造器
一旦显示定义了构造器,系统就不在提供默认构造器了
一个类可以创建多个重载的构造器
父类的构造器不可以被子类继承
案例:
public class Constructor { // 构造函数
private int age;
private String name;
public Constructor(int a, String n){
name = n;
age = a;
}
public Constructor(){
age = 18;
}
public Constructir(String name){
name = "Klay·Thompson"
}
//上边三个构造函数也组成了方法的重载
public int getAge() {
return age;
}
public void setAge(int a) {
// this.age = age;
if (a<0 || a>130){
System.out.println("输入的数据无效!请重新输入");
return;
}
age = a;
}
public String getName() {
return name;
}
public void setName(String n, int i) {
// this.name = name;
name = n;
age = i;
}
}
TestConstructor:
public class TestConstructor {
public static void main(String[] args) {
Constructor p1 = new Constructor();
p1.setAge(12);
System.out.println("今年"+p1.getAge()+"了");
Constructor p2 = new Constructor();
p2.setName("斯蒂芬·库里" ,21);
//在set方法里,定义了 String和int类型
System.out.println("年龄为:"+p2.getAge());
System.out.println("姓名:"+p2.getName());
}
}
案例解析:
创建程序
,
在其中定义两个类:
Person
和
PersonTest
类。定义如下:用
setAge()
设置人的合法年龄
(0~130)
,用
getAge()
返回人的年龄。
前面定义的
Person
类中添加构造器,利用构造器设置所有人的
age
属性初始值都为
18
。
修改上题中类和构造器,增加
name
属性
,
使得每次创建
Person
对象的同时初始化对象的
age
属性值
和
name
属性值。
2.3 JavaBean
JavaBean是符合以下标准的Java类:
1.类是公共的
2.有一个无参的公共构造器
3.有属性并且有对应的get、set方法
public class JavaBean {
private String name; // 属性一般定义为private
private int age;
public JavaBean() {
}
public int getAge() {
return age;
}
public void setAge(int a) {
age = a;
}
public String getName() {
return name;
}
public void setName(String n){
return name;
}
//类是公共的 有一个无参的公共构造器 有属性和对应的get set方法 统称javabean
2.4 this关键词
在java中,this关键字比较难理解,它的作用和词义很接近。
1.在方法内部使用,及这个方法所属对象的引用
2.在构造器内部使用,表示该构造器正在初始化的对象。
this可以调用类的属性、方法和构造器
1.在方法内需要调用该方法的对象是就用this
2.可以用this来区分属性和局部变量。
小案例:
class
Person
{
//
定义
Person
类
private
String
name
;
private
int
age
;
public
Person
(
String
name
,
int
age
){
this
.
name
=
name
; //第一个name访问 属性name,等号后name访问构造函数name
this
.
age
=
age
;//第一个age访问 属性age,等号后age访问构造函数age
}
public
void
getInfo
(){
System
.
out
.
println
(
"
姓名:
"
+
name
) ;
this
.
speak
();
}
public
void
speak
(){
System
.
out
.
println
(
“
年龄:
”
+
this
.
age
);
}
}
案例2:
public class This {
String name;
This(String name){
this.name = name;
}
public void getInfo(){
System.out.println("This类————》》》》"+this.name);
}
public boolean compare(This p){
return (this.name = p.name).isEmpty();
}
}
TestThis
public class TestThis {
public static void main(String[] args) {
This t1 = new This("张三");
This t2 = new This("李四");
t1.getInfo();
t2.getInfo();
boolean b = t1.compare(t2);
}
}