1. 面向对象
java是门面向对象的语言,在java里面万物是皆对象。其实对象就是类的一个实列,有状态有行为。列如一条狗就是一个对象,他的状态是它的颜色,名字品种;行为有吃饭,跑和叫等。那么类就很简单了就是一类对象的总和。你可以把狗看做一个类,这个类包括哈巴狗,贵宾犬等对象;
下面通过代码了解一下类和对象
package com.ge;
public class Animal { //定义了一个动物类
String name; //属性
int age;
public void eat(){ //行为
System.out.println("一只活了"+age+"年的"+name+"正在吃饭");
}
}
package com.ge;
public class Test {
public static void main(String[] args) { //写个测试类
Animal dog = new Animal(); //实列化对象 dog就是Animal这个类中的一个对象
dog.name = "狗";
dog.age = -100; //通过对象名 . 属性 为属性赋值
dog.eat(); //对象.方法 操作方法
}
}
通过上面的代码我们发现了一个弊端,我们无法控制类中的属性,年龄怎么能为负数呢,因此就引出了封装。在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
修改属性的可见性来限制对属性的访问(一般限制为private),例如:
public class Animal { //定义了一个动物类
private String name; //私有化属性
private int age;
}
类中的属性一旦私有化,就只能有本类才能访问,只有提供一个取值的方法,外部通过调用这个方法才能对私有属性进行访问
package com.ge;
public class Animal { //定义了一个动物类
private String name; //私有化属性
private int age;
//提供对属性进行操作的方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) throws Exception{
if(age <= 0){
throw new Exception("年龄不能小于0");
}
this.age = age;
}
public void eat(){ //行为
System.out.println("一只活了"+age+"年的"+name+"正在吃饭");
}
}
开发中我们通过异常抛出来处理问题,这样写虽然能解决年龄值得问题,但是调用者并不知道是什么类型的异常,因此就需要我们自定义一下异常了
package com.ge;
public class AgeOutofException extends Exception{
public AgeOutofException(){}
public AgeOutofException(String message){
super(message);
}
}
这样调用着就知道是什么异常了。
继承,多态
java中为什么会出现继承呢?
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。 通过继承在开发中就大量减少了我们的代码量,就好比动物这个父类就会衍生很多狗,猫这些子类;这样我们就可以把他们共有的部分抽取一个父类,然后子类继承父类就能拥有父类非私有的属性和方法了,(就好比父亲积累的财富我们直接就能用一样)
package com.ge;
public class Animal { //定义了一个动物类
private String name; //属性
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) throws Exception{
if(age <= 0){
throw new AgeOutofException("年龄需要大于0");
}
this.age = age;
}
public void eat(){ //行为
System.out.println("一只活了"+age+"年的"+name+"正在吃饭");
}
}
package com.ge;
public class AgeOutofException extends Exception{
public AgeOutofException(){}
public AgeOutofException(String message){
super(message);
}
}
package com.ge;
public class Dog extends Animal{
public void lookHome(){
System.out.println(getName()+"能看家");
}
}
package com.ge;
public class Cat extends Animal{
public void catchMouse(){
System.out.println("我能捕捉老鼠");
}
}
package com.ge;
public class Test {
public static void main(String[] args) { //写个测试类
//创建个狗得对象
Dog dog = new Dog();
dog.setName("二哈");
try {
dog.setAge(1);
} catch (Exception e) {
e.printStackTrace();
}
dog.eat();
dog.lookHome();
//创键个猫的对象
Cat cat = new Cat();
cat.setName("狸猫");
try {
cat.setAge(2);
} catch (Exception e) {
e.printStackTrace();
}
cat.eat();
cat.catchMouse();
}
}
这里很明显动物都有吃这个行为因此我们可以定义抽象类,只对其行为进行什么,至于怎么实现,就是子类的事情了
很明显我们能看出狗和猫里面直接使用了父类中的方法和属性这样就不会反复写共有的内容了;但是类只能实现单继承,这样就出现了接口,接口就是动作的抽象
package com.ge;
interface Animal { //定义了一个动物类接口
public static final int num = 1;//这里必须是常量
void eat();
}
package com.ge;
public class Cat implements Animal{
@Override
public void eat() {
System.out.println("猫正在吃");
}
}
package com.ge;
public class Dog implements Animal{
@Override
public void eat() {
System.out.println("狗正在吃");
}
}
package com.ge;
public class Test {
public static void main(String[] args) { //写个测试类
//创建个狗得对象
//父类引用指向子类对象,子类重写父类方法,父类引用调用子类重写后的方法,执行的结 果是子类重写后的方法
Animal animal = new Dog(); //父类引用指向子类对象
animal.eat();
}
}
在开发中有时我们的项目会很大,不可能每次修改都重新编译,这种硬编码很明显不适合,因此我们通过反射机制进行创建对象
E盘下创建个文件, 这样就可以通过更换类的权限定名通过读取文件创建对象,就不需要每次更换接口而去重新编译了
package com.ge;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
public class Test {
public static void main(String[] args) { //写个测试类
//创建个狗得对象
// Animal animal = new Dog();
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("E:\\animal.txt")));
String str = bufferedReader.readLine();
Animal animal = (Animal) Class.forName(str).newInstance();
animal.eat();
} catch (Exception e) {
e.printStackTrace();
}
}
}