js的学习
上周学到了js的异步编程,这周对js的学习进行的基本首位,掌握了js基本用法,可以制作一些简单的网页。
<!DOCTYPE html>
<html>
<head>
<title>JS动态列表</title>
<style>
.list {
font-family: Arial, sans-serif;
margin: 20px;
padding: 20px;
border: 1px solid #ddd;
}
.list-item {
margin-bottom: 10px;
}
</style>
<script src="main.js"></script>
</head>
<body>
<div id="listContainer">
<button onclick="addItem()">添加项</button>
<div id="list" class="list">
</div>
</div>
</body>
</html>
var list = document.getElementById("list");
function addItem() {
var listItem = document.createElement("div");
listItem.className = "list-item";
listItem.textContent = "列表项 " + (list.children.length + 1);
list.appendChild(listItem);
}
Java面向对象的学习
上一次学习我们讲述了很多理论知识,这一次我们就用代码实例来对接下来的问题进行讲解。
1.Java面向对象的三大特性:封装,继承和多态
首先让我们看看面向对象的封装,也就是只暴露必要的接口,为了方便理解我们用代码来掩饰:
public class Person {
// 私有属性
private String name;
private int age;
// 构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 公开的getter和setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// 公开的方法
public void sayHello() {
System.out.println("Hello, my name is " + name + " and I am " + age + " years old.");
}
// 入口方法
public static void main(String[] args) {
// 创建一个Person对象
Person p = new Person("John", 25);
// 调用公开的方法
p.sayHello();
// 调用setter方法修改属性值
p.setName("Tom");
p.setAge(30);
// 再次调用公开的方法
p.sayHello();
}
}
这个示例中,创建了一个Person类,该类有一个私有属性name和age,以及相应的getter和setter方法用于访问和修改属性值。还有一个公开的sayHello方法用于打印个人信息。在主方法中,创建了一个Person对象并调用了一系列方法来操作对象的属性和行为。
接下来我们在看看面向对象的继承代码实例:
// 创建一个父类Animal
public class Animal {
// 公开的方法
public void eat() {
System.out.println("Animal is eating...");
}
public void sleep() {
System.out.println("Animal is sleeping...");
}
}
// 创建一个子类Dog,继承自Animal
public class Dog extends Animal {
// 重写父类的eat方法
@Override
public void eat() {
System.out.println("Dog is eating bones...");
}
// 新增子类的方法
public void bark() {
System.out.println("Dog is barking...");
}
}
// 创建一个子类Cat,继承自Animal
public class Cat extends Animal {
// 重写父类的sleep方法
@Override
public void sleep() {
System.out.println("Cat is sleeping on the sofa...");
}
// 新增子类的方法
public void purr() {
System.out.println("Cat is purring...");
}
}
// 入口方法
public static void main(String[] args) {
// 创建一个Dog对象
Dog dog = new Dog();
// 通过子类对象调用继承自父类的方法
dog.eat(); // 调用子类重写的eat方法
dog.sleep(); // 调用父类的sleep方法
dog.bark(); // 调用子类自己的方法
// 创建一个Cat对象
Cat cat = new Cat();
// 通过子类对象调用继承自父类的方法
cat.eat(); // 调用父类的eat方法
cat.sleep(); // 调用子类重写的sleep方法
cat.purr(); // 调用子类自己的方法
}
在上述示例中,我们创建了一个父类Animal,该类有两个公开的方法eat()和sleep()。然后我们创建了两个子类Dog和Cat,分别继承自Animal类。在子类中,我们重写了父类的eat()和sleep()方法,并且新增了属于子类自己的方法bark()和purr()。
在主方法中,我们创建了一个Dog对象和一个Cat对象,并分别通过这两个子类对象调用继承自父类的方法和子类自己的方法。通过运行程序,我们可以看到不同子类对象调用相同的方法时,表现出不同的行为。
最后我们来学习多态:
// 创建一个父类Animal
public class Animal {
// 公开的方法
public void makeSound() {
System.out.println("Animal is making a sound...");
}
}
// 创建一个子类Dog,继承自Animal
public class Dog extends Animal {
// 重写父类的方法
@Override
public void makeSound() {
System.out.println("Dog is barking...");
}
}
// 创建一个子类Cat,继承自Animal
public class Cat extends Animal {
// 重写父类的方法
@Override
public void makeSound() {
System.out.println("Cat is meowing...");
}
}
// 入口方法
public static void main(String[] args) {
// 创建一个Animal类型的引用,指向一个Dog对象
Animal dog = new Dog();
// 通过父类引用调用makeSound方法,实际执行的是子类Dog的方法
dog.makeSound(); // 输出:Dog is barking...
// 创建一个Animal类型的引用,指向一个Cat对象
Animal cat = new Cat();
// 通过父类引用调用makeSound方法,实际执行的是子类Cat的方法
cat.makeSound(); // 输出:Cat is meowing...
}
在上述示例中,我们创建了一个父类Animal,该类有一个公开的方法makeSound()。然后我们创建了两个子类Dog和Cat,分别继承自Animal类,并且分别重写了父类的makeSound()方法。
在主方法中,我们创建了一个Animal类型的引用dog,指向一个Dog对象,和一个Animal类型的引用cat,指向一个Cat对象。然后通过这两个父类引用分别调用makeSound()方法。尽管我们声明的引用类型都是父类Animal,但由于多态的特性,实际执行的是子类Dog和Cat中重写的方法。
通过运行程序,我们可以看到不同类型的对象调用相同的方法时,表现出不同的行为。这就是多态的效果。
2.Java面向对象的抽象类:
// 创建一个抽象类Animal
public abstract class Animal {
// 抽象方法
public abstract void makeSound();
// 具体方法
public void sleep() {
System.out.println("Animal is sleeping...");
}
}
// 创建一个子类Dog,继承自Animal
public class Dog extends Animal {
// 实现抽象方法
@Override
public void makeSound() {
System.out.println("Dog is barking...");
}
}
// 创建一个子类Cat,继承自Animal
public class Cat extends Animal {
// 实现抽象方法
@Override
public void makeSound() {
System.out.println("Cat is meowing...");
}
}
// 入口方法
public static void main(String[] args) {
// 创建一个Animal类型的引用,指向一个Dog对象
Animal dog = new Dog();
// 通过父类引用调用makeSound方法,实际执行的是子类Dog的方法
dog.makeSound(); // 输出:Dog is barking...
// 创建一个Animal类型的引用,指向一个Cat对象
Animal cat = new Cat();
// 通过父类引用调用makeSound方法,实际执行的是子类Cat的方法
cat.makeSound(); // 输出:Cat is meowing...
// 通过父类引用调用具体方法sleep
dog.sleep();
cat.sleep();
}
在上述示例中,我们创建了一个抽象类Animal,该类有一个抽象方法makeSound()和一个具体方法sleep()。然后我们创建了两个子类Dog和Cat,分别继承自Animal类,并且分别实现了父类的抽象方法。子类Dog和Cat可以根据自身的特性定义自己的makeSound()实现。
在主方法中,我们创建了一个Animal类型的引用dog,指向一个Dog对象,和一个Animal类型的引用cat,指向一个Cat对象。然后通过这两个父类引用分别调用makeSound()和sleep()方法。尽管我们声明的引用类型都是父类Animal,但由于多态的特性,实际执行的是子类Dog和Cat中实现的方法。
通过运行程序,我们可以看到不同类型的对象调用相同的方法时,表现出不同的行为。抽象类定义了某个类的抽象概念和行为,子类通过实现父类的抽象方法来具体化这些行为。而具体方法则提供了一些通用的行为,可以直接使用或在子类中重写。
3.Java面向对象的接口:
// 创建一个接口Animal
public interface Animal {
// 抽象方法
public void makeSound();
// 默认方法
public default void sleep() {
System.out.println("Animal is sleeping...");
}
// 静态方法
public static void breathe() {
System.out.println("Animal is breathing...");
}
}
// 创建一个实现接口Animal的类Dog
public class Dog implements Animal {
// 实现接口的抽象方法
@Override
public void makeSound() {
System.out.println("Dog is barking...");
}
}
// 创建一个实现接口Animal的类Cat
public class Cat implements Animal {
// 实现接口的抽象方法
@Override
public void makeSound() {
System.out.println("Cat is meowing...");
}
}
// 入口方法
public static void main(String[] args) {
// 创建一个Animal类型的引用,指向一个Dog对象
Animal dog = new Dog();
// 通过接口引用调用makeSound方法,实际执行的是子类Dog的实现
dog.makeSound(); // 输出:Dog is barking...
// 创建一个Animal类型的引用,指向一个Cat对象
Animal cat = new Cat();
// 通过接口引用调用makeSound方法,实际执行的是子类Cat的实现
cat.makeSound(); // 输出:Cat is meowing...
// 通过接口调用默认方法和静态方法
dog.sleep(); // 输出:Animal is sleeping...
Animal.breathe(); // 输出:Animal is breathing...
}
在上述示例中,我们创建了一个接口Animal,该接口有一个抽象方法makeSound()、一个默认方法sleep()和一个静态方法breathe()。
然后我们创建了两个实现接口Animal的类Dog和Cat,并分别实现了接口的抽象方法。这两个类必须提供makeSound()方法的具体实现。
在主方法中,我们创建了一个Animal类型的引用dog,指向一个Dog对象,和一个Animal类型的引用cat,指向一个Cat对象。然后通过这两个接口引用分别调用makeSound()方法,实际执行的是子类Dog和Cat的实现。
接口和抽象类都可以定义抽象方法,但接口只能定义抽象方法,并且不能包含具体实现。接口还可以定义默认方法和静态方法。
通过运行程序,我们可以看到不同类型的对象调用相同的方法时,表现出不同的行为。接口定义了某个类的能力(方法),实现该接口的类必须提供这些能力的具体实现。接口的默认方法和静态方法可以提供一些通用的行为或功能,可以直接使用。
4.最后是Java面向对象异常的学习:
public class Calculator {
public double divide(int num1, int num2) throws ArithmeticException {
if (num2 == 0) {
throw new ArithmeticException("除数不能为0");
}
return (double) num1 / num2;
}
public static void main(String[] args) {
Calculator calculator = new Calculator();
try {
double result = calculator.divide(10, 0);
System.out.println("计算结果:" + result);
} catch (ArithmeticException e) {
System.out.println("发生异常:" + e.getMessage());
}
}
}
在上述示例中,我们创建了一个Calculator类,其中有一个divide()方法用于计算两个数的商。在divide()方法中,我们首先检查除数是否为0,如果是,则抛出一个ArithmeticException的异常,异常消息为"除数不能为0"。否则,计算两个数的商并返回。
在主方法中,我们创建了一个Calculator对象,并调用divide()方法计算10除以0的结果。由于除数为0,会抛出ArithmeticException异常。我们使用try-catch块来捕获并处理异常,当捕获到ArithmeticException异常时,会打印异常消息。
通过运行程序,我们可以看到当除数为0时,会抛出异常并打印异常消息。通过异常处理,我们可以在程序中处理可能出现的异常情况,使程序更加健壮。