作为一款"工业级"编程语言,Java的重要性不言而喻
面向对象(Object-Oriented Programming, OOP)
面向对象编程的本质:以类的方式组织代码,以对象的组织(封装)数据
方法的定义和调用
方法的定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class Demo01 { public static void main (String[] args) { } } public int max (int a, int b) { return a > b ? a : b; }
方法的调用:
调用其他类的方法,除非是static 静态方法,不然必须实例化这个类(new)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class Demo02 { public static void main (String[] args) { int add = Demo02.add(1 , 2 ); Student student = new Student (); student.say(); } public static int add (int a, int b) { return a + b; } }
1 2 3 4 5 6 7 8 public class Student { public void say () { System.out.println("xxxx" ); } }
构造器详解
使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化,以及对类中构造器的调用
类中的构造器也被称为构造方法,创建对象时必须要调用。有以下特点:
必须和类的名字相同
没有返回类型,也不能写void
构造器的作用:
使用new关键字,本质是在调用构造器
用来初始化值
封装详解
程序设计要追求:高内聚,低耦合 。高内聚:类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用
封装(数据的隐藏):通常应禁止直接访问一个对象中的数据的实际表示,而应通过操作接口来访问 ,这称为信息隐藏
属性私有,get/set
1 2 3 4 5 6 7 8 9 public class Demo03 { public static void main (String[] args) { Student s1 = new Student (); s1.setName("java" ); System.out.println(s1.getName()); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class Student { private String name; private int id; private char sex; public String getName () { return this .name; } public void setName (String name) { this .name = name; } }
有时set中会做一些不合法数据的处理。由此看出,封装可以
提高程序的安全性,保护数据
隐藏代码的实现细节
统一接口
系统可维护增加
继承
1 2 3 4 5 6 7 8 9 10 11 public class Animal { private String name; private int id; public Animal (String myName, String myid) { } public void eat () { public void sleep () { }
1 2 3 public class Penguin extends Animal { }
继承的特性
子类拥有父类非private 的属性,方法
子类可以用有自己的属性和方法,即子类可以对父类进行扩展
子类可以用自己的方式实现父类的方法
提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)
super与this关键字
super:可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类
this:指向自己的引用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 class Animal { void eat () { System.out.println("animal : eat" ); } } class Dog extends Animal { void eat () { System.out.println("dog : eat" ); } void eatTest () { this .eat(); super .eat(); } } public class Test { public static void main (String[] args) { Animal a = new Animal (); a.eat(); Dog d = new Dog (); d.eatTest(); } }
super注意点:
super调用父类的构造方法,必须在构造方法的第一个
super必须只能出现在子类的方法或者构造方法中
super和this不能同时调用构造方法
对比this:
代表的对象不同
this:本身调用者这个对象
super:代表父类对象的应用
前提
this:没有继承也可以使用
super:只能在继承条件才可以使用
构造方法
this():本类的构造
super():父类的构造
final关键字
final 关键字声明类可以把类定义为不能继承的 ,即最终类;或者用于修饰方法,该方法不能被子类重写 :
声明类:
声明方法:
1 修饰符(public /private /default /protected ) final 返回值类型 方法名(){
重写(Override)与重载(Overload)
重写(Override)
@Override 重写 ,是指两个方法具有相同的方法名称和参数 (即方法签名),分别位于父类和子类中,重写允许子类提供已经提供其父类的方法的特定实现
重载(Overload)
@Overload 重载 :是指一个类中允许存在多个同名方法,而这些方法的参数表不同(参数个数或者参数类型不同)
@Override 重写 :需要有继承关系,子类重写父类方法
方法名必须相同
参数列表必须相同
修饰符:范围可以扩大但不能缩小(public > protected > default > private )
抛出的异常:范围,可以被缩小,但不能扩大:ClassNotFoundException -> Exception(大)
多态
多态,即同一个方法可以根据发送对象的不同而采用多种不同的行为方式
还是以Student类继承Person类为例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public class Demo04 { public static void main (String[] args) { Student s1 = new Student (); Person s2 = new Student (); s2.run(); s1.eat(); ((Student) s2).eat(); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 public class Student extends Person { @Override public void run () { System.out.println("son" ); } public void eat () { System.out.println("eat" ); } }
1 2 3 4 5 6 7 public class Person { public void run () { System.out.println("run" ); } }
父类引用指向子类的对象:Person s2 = new Student();
把子类转换为父类,向上转型
把父类转换为子类,向下转型:强制转换
多态存在的三个必要条件:
继承
@Override 重写
父类引用指向子类对象:Parent p = new Child();
这里需要注意:有些方法不能被 @Override 重写 :
static方法,属于类,它不属于实例
final方法:final是常量的
private方法
instanceof关键字
instanceof运算符的前一个操作符是一个引用变量 ,后一个操作数通常是一个类(可以是接口) ,用于判断前面的对象是否是后面的类,或者其子类、实现类的实例。如果是返回true,否则返回false。也就是说:使用instanceof关键字做判断时, instanceof 操作符的左右操作数必须有继承或实现关系
static关键字详解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public 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(Student.score); System.out.println(s1.age); System.out.println(s1.score); } }
静态变量 对于类,所有对象(实例)所共享,当直接使用类去调用得到说明这个变量是静态的
static代码块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class Person { { System.out.println("匿名代码块" ); } static { System.out.println("静态代码块" ); } public Person () { System.out.println("构造方法" ); } public static void main (String[] args) { Person person1 = new Person (); System.out.println("===============" ); Person person2 = new Person (); } }
1 2 3 4 5 6 静态代码块 匿名代码块 构造方法 =============== 匿名代码块 构造方法
静态导入包
1 2 import static java.lang.Math.random;import static java.lang.PI;
静态导入后,可以直接random()调用
抽象类
1 2 3 4 5 6 7 8 9 10 11 12 public abstract class Action { public abstract void doSomething () ; }
1 2 3 4 5 6 7 public class A extends Action { @Override public void doSomething () { } }
子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法 ,否则该子类也要声明为抽象类
接口的定义与实现
普通类:只有具体实现
抽象类:具体实现和规范(抽象方法)都有
接口:只有规范,自己无法写方法
接口无法被实例化,但是可以被实现 。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类
1 2 3 4 5 6 7 8 9 10 11 12 public interface UserService { int AGE = 99 ; void add (String name) ; void delete (String name) ; void update (String name) ; void query (String name) ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public class UserServiceImpl implements UserService { @Override public void add (String name) { } @Override public void delete (String name) { } @Override public void update (String name) { } @Override public void query (String name) { } }
虽然java只能单继承,但是可以通过接口实现多继承
1 2 3 4 5 6 7 8 9 10 11 12 public interface UserService { void add (String name) ; void delete (String name) ; void update (String name) ; void query (String name) ; } public interface TimeService { void timer () ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 public class UserServiceImpl implements UserService , TimeService { @Override public void add (String name) { } @Override public void delete (String name) { } @Override public void update (String name) { } @Override public void query (String name) { } @Override public void timer () { } }
抽象类和接口的区别
抽象类和接口的区别:
抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行
抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的
接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法
一个类只能继承一个抽象类,而一个类却可以实现多个接口
内部类
内部类就是在一个类的内部定义一个类,比如,A类中定义一个B类,那么B类相对于A类来说就称为内部类,而A类相当B类来说就是外部类
成员内部类
静态内部类
局部内部类
匿名内部类
Java 核心概念综合示例
下面是一个包含 Java 所有核心概念的完整示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 interface Movable { double MAX_SPEED = 300.0 ; void move () ; double getSpeed () ; } interface Soundable { void makeSound () ; } interface Vehicle extends Movable { void start () ; void stop () ; } abstract class Animal implements Soundable { private String name; private int age; private static int animalCount = 0 ; static { System.out.println("Animal类被加载" ); } public Animal (String name, int age) { this .name = name; this .age = age; animalCount++; } public String getName () { return name; } public void setName (String name) { this .name = name; } public int getAge () { return age; } public final void breathe () { System.out.println(name + " 正在呼吸" ); } public static int getAnimalCount () { return animalCount; } public abstract void eat () ; public void sleep () { System.out.println(name + " 正在睡觉" ); } } class Dog extends Animal implements Vehicle { private String breed; private double speed; public Dog (String name, int age, String breed) { super (name, age); this .breed = breed; this .speed = 0.0 ; } @Override public void eat () { System.out.println(getName() + " 正在吃骨头" ); } @Override public void sleep () { super .sleep(); System.out.println(getName() + " 睡得很香" ); } @Override public void makeSound () { System.out.println(getName() + " 汪汪叫" ); } @Override public void move () { System.out.println(getName() + " 正在奔跑,速度: " + speed + "km/h" ); } @Override public double getSpeed () { return speed; } @Override public void start () { speed = 30.0 ; System.out.println(getName() + " 开始奔跑" ); } @Override public void stop () { speed = 0.0 ; System.out.println(getName() + " 停止奔跑" ); } public void bark () { System.out.println(getName() + " 汪汪!" ); } public void bark (int times) { for (int i = 0 ; i < times; i++) { System.out.println(getName() + " 汪!" ); } } public void bark (String message) { System.out.println(getName() + " 说: " + message); } public class Tail { private boolean wagging; public void wag () { wagging = true ; System.out.println(getName() + " 的尾巴在摇摆" ); } } public static class DogHouse { private String location; public DogHouse (String location) { this .location = location; } public void showInfo () { System.out.println("狗窝位置: " + location); } } } final class Cat extends Animal { public Cat (String name, int age) { super (name, age); } @Override public void eat () { System.out.println(getName() + " 正在吃鱼" ); } @Override public void makeSound () { System.out.println(getName() + " 喵喵叫" ); } } public class JavaConceptDemo { public static void main (String[] args) { System.out.println("=== Java 核心概念综合演示 ===\n" ); System.out.println("1. 封装 - 创建对象:" ); Dog dog = new Dog ("旺财" , 3 , "金毛" ); Cat cat = new Cat ("小咪" , 2 ); System.out.println("\n2. 继承 - 调用父类方法:" ); dog.breathe(); dog.sleep(); System.out.println("\n3. 多态 - 父类引用指向子类对象:" ); Animal animal = new Dog ("大黄" , 5 , "哈士奇" ); animal.eat(); animal.makeSound(); if (animal instanceof Dog) { System.out.println("animal 是 Dog 的实例" ); Dog d = (Dog) animal; d.bark(); } System.out.println("\n4. 接口实现 - 多接口:" ); Vehicle vehicle = dog; vehicle.start(); vehicle.move(); vehicle.stop(); System.out.println("最高速度限制: " + Movable.MAX_SPEED); System.out.println("\n5. 方法重载 (Overload):" ); dog.bark(); dog.bark(3 ); dog.bark("你好!" ); System.out.println("\n6. 静态成员:" ); System.out.println("动物总数: " + Animal.getAnimalCount()); System.out.println("\n7. 内部类:" ); Dog.Tail tail = dog.new Tail (); tail.wag(); Dog.DogHouse house = new Dog .DogHouse("后院" ); house.showInfo(); System.out.println("\n8. 匿名内部类:" ); Animal bird = new Animal ("小鸟" , 1 ) { @Override public void eat () { System.out.println(getName() + " 正在吃虫子" ); } @Override public void makeSound () { System.out.println(getName() + " 叽叽喳喳" ); } }; bird.eat(); bird.makeSound(); System.out.println("\n9. final 关键字:" ); final int MAX_AGE = 100 ; System.out.println("最大年龄限制: " + MAX_AGE); cat.breathe(); System.out.println("\n=== 演示完成 ===" ); } }
这个示例代码包含了以下所有 Java 核心概念:
封装 :private 属性 + getter/setter
继承 :Dog/Cat extends Animal
多态 :父类引用指向子类对象、方法重写
接口 :Movable、Soundable、Vehicle 接口定义和实现
接口继承 :Vehicle extends Movable
抽象类 :Animal 抽象类
重写(Override) :子类重写父类方法
重载(Overload) :bark() 方法的多个版本
static 关键字 :静态变量、静态方法、静态代码块
final 关键字 :final 类、final 方法、final 变量
super 关键字 :调用父类构造方法和方法
this 关键字 :引用当前对象
instanceof 关键字 :类型判断
向上转型 :子类转父类/接口
向下转型 :父类转子类(强制转换)
内部类 :成员内部类、静态内部类、匿名内部类
构造方法 :有参构造、构造方法调用顺序
参考