类的封装
1.类的三要素:类名,属性和方法
public class Person {
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
//getter和setter方法...
}
复制代码
2.构造函数
概念:构造函数就是在创建对象时由JVM自动调用的函数,作用是在创建对象时给对象的成员变量赋值的;
写法:
修饰符:构造函数只能使用访问权限修饰符修饰;如public、private等;不允许使用static关键字修饰构造函数;
返回值类型:构造函数没有返回值类型,连void都没有;这个是区分一个函数是否是构造函数的标准;
函数名:构造函数的函数名必须和类名一致;
参数列表:构造函数可以重载,参数列表可以根据需要定义;
return语句:所有Java的函数都需要通过return语句出栈,所以构造函数中也有return语句,只是因为不返回数据,所以一般不写;
构造函数的特点:
1.如果没用重载构造函数,默认使用空参构造;
2.如果重载了构造函数,则原来默认的空参构造将会失效;
3.有参构造的作用,在创建对象时,为成员属性进行赋值;
4.构造方法可以重载.
复制代码
3.this 关键字
1.不放在带有static关键字的函数中;
2.this代表调用方法时的对象的引用,即this代表本类对象;
3.this可用来区分成员变量和局部变量;
4.this(参数列表) 一般放在构造函数中有效代码的第一行,目的是给成员属性赋值;
5.this不能与super关键字同时存在.
public Person(String name, int age) {
//this() 必须放在构造函数有效代码的第一行
this();
this.name = name;
this.age = age;
}
复制代码
4.匿名对象
对象的变量名记录了该对象的引用地址.
匿名对象指的是创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量.
new Person("张三", 22).speak();//该对象的地址值没有对应的变量记录,只能用一次.
匿名对象的特点:
1.在使用的使用直接创建,使用完毕后,该对象被回收;
2.匿名对象只能够使用一次;
3.匿名对象可以作为方法的返回值或者给方法传参(传参方便).
/**
* 函数的参数列表,里面其实都是变量;如果参数列表的数据类型是一个类名,表示接受的参数是这个类的对象;
* @param person
*/
public static void introduce(Person person){
System.out.println(person);
}
/**
* 函数的返回值类型,表示这个函数要返回的数据的类型;
* 如果一个函数的返回值类型是一个类名,表示这个函数运行结束后要返回这个类的对象;
* @return
*/
private static Person getPerson() {
return new Person("赵七",23);
}
a)匿名对象作为方法的返回值
private static Person getPerson() {
return new Person("赵七",23);
}
b)匿名对象作为方法参数
introduce(new Person("孙久",21));
复制代码
继承
1. 基本概念
在 Java 中,类的继承是指在一个现有类的基础上去构建一个新的类.构建出来的新类被称作子类,现有类被称作父类.
子类 '无条件' 拥有父类全部可继承的属性和方法.继承通过 "extends 关键字" 实现.
在 Java 中.类只支持单继承,不允许多重继承.也就是说一个类只能有一个直接父类.
基本术语:
子类, 也称为派生类。 Derived class
父类, 也称为基类、超类。 Super class
继承的效果: 子类继承父类,代表子类'无条件'拥有了父类一切'可继承'的成员属性和方法.
总结:子类'无条件'拥有了父类全部可继承的属性和方法.继承是类在继承,而不是对象在继承.
2.继承代码实例展示
/**
* 基类
*/
public class Animal {
String name;
int age;
private String gender;
public void eat(){
System.out.println(age + "岁的" + name + "正在狂吃...");
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
/**
* 子类Dog,拥有Animal全部可继承的属性和方法
*/
class Dog extends Animal{
public void protectHome(){
System.out.println(age + "岁的,名叫" + name + "的正在保护家..");
}
}
/**
* 子类ArmyDog继承了父类Dog,拥有Dog的所有可继承的成员属性和方法
*/
class ArmyDog extends Dog{
public void bombBlockhouse(){
System.out.println(age + "岁的,名叫" + name + "的正在练习炸碉堡...");
}
}
/**
* 继承的测试代码
*/
class ExtendzDemo{
public static void main(String[] args) {
ArmyDog armyDog = new ArmyDog();
armyDog.name="哮天犬";
armyDog.age=12;
armyDog.setGender("male");
armyDog.eat();
System.out.println("===================");
armyDog.protectHome();
System.out.println("===================");
armyDog.bombBlockhouse();
}
}
3.继承内存图解
复制代码
继承的注意点总结
1> 继承是类在继承,而不是对象在继承;
2> 什么时候需要使用继承 ? (is a 关系);
3> 不要为了仅仅只是得到某个类的成员而去继承.不要为了继承而继承;
即继承强调的是: 同一个 "物种";
4> 只要有一个成员或方法不是所有子类都拥有的,那么这个成员属性和方法就不应该定义在父类之中;
5> 子类不能直接访问父类中私有的成员变量(不能继承,但是子类对象的内存中有该属性);
6> 子类一定不要拥有和父类同名的成员变量. 因为子类可以继承父类的成员变量.复制代码