对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路去处理。
面向对象的本质:以类的方式组织代码,以对象的组织(封装)数据。
三大特性
一个类由n个属性和n个方法组成
作用:
注意点:
实例代码
public class Person{
//无参构造
private String name;
private int age;
public Person() {
System.out.println("这是无参构造!");
}
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("这是有参构造:"+name+"今年"+age+"岁了。");
}
}
class TestAre{
public static void main(String[] args) {
new Person();
new Person("阿凡",20);
}
}
1.类与对象
类是一个模板:抽象 对象是一个具体的实例
2.方法
定义与调用
3.对象的引用
引用类型:对象通过引用来操作
4.属性:也叫成员变量
默认初始值:
数字:0 0.0
char:u0000
boolean:false
引用:null
修饰符 属性类型 属性名 = 属性值!
5.对象的创建和使用
必须使用new关键字创造对象,构造器
对象的属性 person.name
对象的方法 person。sleep()
6.类:
静态的属性 属性
动态的行为 方法
- 封装 继承 多态 -
该露的露,该藏的藏
封装
总言:属性私有,get/set
实例代码
public class Person{
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) {
if(age <=120 && age >= 0){
this.age = age;
}else{
System.out.println("年龄不合实际");
}
}
}
class TestAre{
public static void main(String[] args) {
Person person = new Person();
person.setAge(30);
System.out.println(person.getAge());
}
}
实例代码
public class Person {
private String name;
private char sex;
public void say(String name,char sex){
System.out.println("我叫"+name+",性别"+sex);
}
}
class Man extends Person{
public static void main(String[] args) {
Man man = new Man();
man.say("阿凡",'男');
}
}
this用法:
形式参数可以被认为是局部变量
super用法:
super.成员变量
super.成员方法
super([参数1,参数2,…])
super VS this:
注意:
在构造方法中,this与super不能同时出现
static静态方法中不能使用this和super
super可以调用父类的静态方法
实例代码
//person类
public class Person {
private String name = "person";
public void print(){
System.out.println("阿凡person");
}
}
//student类 继承 person类
class Student extends Person{
private String name = "阿凡student";
public void test1(){
print(); //阿凡student
test(); //阿凡person
super.print(); //阿凡person
}
public void test(){
System.out.println(name); //阿凡student
super.print(); //阿凡person
}
public void print(){
System.out.println(this.name);
}
}
//测试类
class TestAre{
public static void main(String[] args) {
new Student().test();
new Student().test1();
}
}
重写:需要有继承关系,子类重写父类的方法!
修饰符访问权限大小:public>protected>default>private
classNotFoundException(小) -->Exception(大)
为什么需要重写:
//person类
public class Person {
private String name = "阿凡公民";
public void print(){
System.out.println(name+"去上班!!");
}
}
//student类 继承与 person类
class Student extends Person{
private String name = "阿凡同学";
@Override
public void print(){ //重写print方法
System.out.println(name+"去上学!!");
}
}
class TestAre{
public static void main(String[] args) {
new Student().print(); //阿凡同学去上学!!
}
}
定义:不同类的对象在调用同一方法时所呈现出的多种不同行为。
优点:提高了程序的可拓展性和可维护性。
多态一般在接口被实现或类被继承时使用
对象的类型转换:
对象 instanceof 类(或接口)
instanceof 用来测试一个对象是否为一个类的实例
boolean result = obj instanceof class
注意点:
1. obj必须为引用类型,不能为基本类型
2. obj可以为null
3. obj可以为class类的直接或间接子类
4. obj可以为class接口的实现类
实例代码
//Person类
public abstract class Person {
public abstract void work();
}
//老师类继承Person类
class Teacher extends Person{
@Override
public void work() {
System.out.println("老师上课");
}
//老师特有方法
public void write(){
System.out.println("老师写教案");
}
}
//医生类继承Person类
class Doctor extends Person{
@Override
public void work() {
System.out.println("医生看病");
}
//医生特有方法
public void operation(){
System.out.println("医生做手术");
}
}
//测试类
class Test{
public static void main(String[] args) {
Person p1 = new Teacher();
Person p2 = new Doctor();
p1.work(); //老师上课
p2.work(); //医生看病
if( p1 instanceof Teacher){ //判断p1是否是Teacher类的对象
Teacher teacher = (Teacher)p1;
teacher.write(); //老师写教案
}
else{
Doctor doctor = (Doctor)p2;
doctor.operation();
}
}
}
final关键字可以修饰类、变量、方法:
final修饰的类不能被继承
final修饰的方法不能被子类重写
final修饰的变量(成员变量和局部变量)是常量,只能被赋值一次
注意:
成员变量被final修饰时,声明变量的同时必须初始化赋值
局部变量被final修饰时,可以先声明,再赋值一次
static用于修饰类的属性,方法,代码块等,称为静态Xxx。
static只能修饰成员变量,不能修饰局部变量
注意点:
类名.变量名
类名.静态方法();
或者
实例对象名.静态方法();
static{
…
}
**static和final同时使用 **
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!
对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
对于方法,表示不可覆盖,并且可以通过类名直接访问。
实例代码
class Student{
private static int age;
private double score;
public static void main(String[] args) {
Student s1 = new Student();
System.out.println(Student.age);
System.out.println(s1.age);
System.out.println(s1.score);
}
}
静态代码块
实例代码
public class Person {
//赋初始值
{
System.out.println("匿名代码块");
}
//只执行一次
static{
System.out.println("静态代码块");
}
public Person(){
System.out.println("构造方法");
}
public static void main(String[] args) {
new Person();
}
}
接口:只有规范,比抽象类更严格,是抽象类的特殊形式
public interface 接口名{
}
作用
实例代码
public interface Animal {
void shout(String name);
}
class Cat implements Animal{
@Override
public void shout(String name) {
System.out.println(name + "在喵喵叫!");
}
}
class Dog implements Animal{
@Override
public void shout(String name) {
System.out.println(name+"在汪汪叫!");
}
}
class AnimalTest{
public static void main(String[] args) {
Animal a1 = new Cat();
Animal a2 = new Dog();
a1.shout("猫");
a2.shout("狗");
}
}
非常重要:内部类不能有静态方法或属性。
外部类名 对象名 = new 外部类名();
外部类名.内部类名 变量名 = new 外部类名().内部类名();
注意:
实例代码
//person类 外部类
public class Person {
String name = "Afan";
int age = 20;
public void doSomething(){
System.out.println("AFan在吃饭!");
}
public void say(){
Heart heart = new Heart();
heart.fleed();
System.out.println("AFan说你好!");
}
//心脏 成员内部类
class Heart{
public void jump(){
System.out.println("心脏跳动!!");
doSomething();//直接调用外部类方法
say();
}
public void fleed(){
System.out.println("血在流");
}
}
}
class Test{
public static void main(String[] args) {
Person person = new Person();
Person.Heart heart = person.new Heart();
heart.jump();
heart.fleed();
}
}
也叫方法内部类,在方法中定义,有效范围只限于方法内部,等同于局部变量。
注意:
实例代码
/person类
public class Person {
String name = "Afan";
int age = 20;
public void doSomething(){
System.out.println("AFan在吃饭!");
}
public void say(){
System.out.println("AFan说你好!");
}
public void produce(){
String product_name = "电脑";
//产品类 局部内部类
class Production{
// String product_name = "电脑";
public void use(){
Person person = new Person(); //外部类对象
person.doSomething();
System.out.println(product_name+"的使用");
}
}
Production production = new Production();
production.use();
}
}
class Test{
public static void main(String[] args) {
Person person = new Person();
person.produce();
}
}
本质:使用static关键字修饰的成员内部类
外部类名.静态内部类名 对象名 = new 外部类名.静态内部类名();
实例代码
//person类
public class Person {
static String name = "Afan";
public static void doSomething(){
System.out.println("AFan在吃饭!");
}
public void say(){
System.out.println("AFan说你好!");
}
//心脏类 就在成员内部类前面加个static
static class Heart{
public void jump(){
doSomething();
// Person person = new Person(); 访问非静态成员必须创建对象。
//person.say();
System.out.println(name+"的心脏在跳动!!");
}
}
}
class Test{
public static void main(String[] args) {
Person.Heart heart = new Person.Heart();
heart.jump();
}
}
java类调用某个方法时,如果该方法的参数类型是接口类型,那么除了传递一个接口的实现类,也可以使用匿名内部类实现该接口来作为该方法的参数。(开发中常用)
[修饰符] 方法名(new 父类名或者接口名(){
// 方法重写
@Override
public void method() {
// 执行语句
}
};)
实例代码
//接口类
public interface Animal {
void shout(String name);
}
class AnimalTest{
String name;
public void animalShout(Animal animal){
animal.shout(name);
}
public static void main(String[] args) {
AnimalTest a1 = new AnimalTest();
a1.name = "猫";
//匿名内部类
a1.animalShout(new Animal() {
@Override
public void shout(String name) {
System.out.println(name+"在叫!!!");
}
});
}
}
JDK8的Lamabda表达式
使用条件:只适用于在匿名内部类中只有一个抽象方法的接口实现,简化代码。
([数据类型1 变量名1,数据类型2 变量名2,…]) ->{表达式主体}
注意点:
实例代码
//接口类
public interface Animal {
void shout(String name);
}
class AnimalTest{
String name;
public void animalShout(Animal animal){
animal.shout(name);
}
public static void main(String[] args) {
AnimalTest a1 = new AnimalTest();
a1.name = "小猫";
//Lamabda表达式
a1.animalShout(name ->
System.out.println(name+"在叫!!!")
);
}
}
进一步简化Lamabda表达式(了解)
使用条件:Lamabda表达式主体只有一条语句
用法:程序省略主体的大括号,用英文双冒号“::”来引用方法和构造器
Lamabda表达式对普通方法和构造方法的引用形式
种类 | 对应的引用示例 |
---|---|
类名引用普通方法 | 类名::类普通方法名 |
类名引用静态方法 | 类名::类静态方法名 |
对象名引用方法 | 对象名::实例方法名 |
构造器引用 | 类名::new |
定义:程序在编译、运行过程中出现的非正常状况
java的异常类都继承于java.lang.Throwable类
Throwable的继承体系
Throwable类常用方法
方法说明 | 功能描述 |
---|---|
String getMessage() | 返回此throwable的详细消息字符串 |
void printStackTrace() | 打印完整的异常信息 |
处理异常的两种方式:
使用try…catch语句对异常进行捕获处理
try{
//可能发生异常的语句
}catch(Exception类或其子类 e){
e.printStackTrace(); //打印输出异常原因
//对捕获的异常做相应处理
}finally{
//无论程序是否异常都必须执行的语句
}
实例代码
public class Example {
public static void main(String[] args) {
int result = divide(4,0);
if(result == -1){
System.out.println("程序出现异常");}
else{
System.out.println(result);
}
}
//运行结果:出现的异常:/ by zero
// 无论程序是否异常都必须执行的finally语句
// 程序出现异常
//除法运算
public static int divide(int a,int b){
try{
int result = a/b;
return result;
}catch(Exception e){
System.out.println("出现的异常:"+e.getMessage());
}finally{
System.out.println("无论程序是否异常都必须执行的finally语句");
}
return -1; //如果程序异常,返回-1
}
}
使用throws抛出异常,等以后再处理有可能的异常,
[修饰符] 返回值类型 方法名([参数列表]) throws Exception{
//方法体
}
有可能出现异常的方法加上throws关键字后,其他类调用它时首先要处理完异常之后才能使用该方法。
实例代码
public class Example {
public static void main(String[] args) {
try {
int result = divide(4, 0);
System.out.println(result);
}catch(Exception e){
System.out.println("出现异常:"+e.getMessage());
}
}
//运行结果:出现异常:/ by zero
//除法运算
public static int divide(int a,int b) throws Exception{
int result = a/b;
return result;
}
}