最近一直在追Java写博客,如有问题欢迎添加QQ:1776136546(微信同步)。
1.类的继承
关键字:extends
package st.peter.obj2;
public class Animal {
String name;
public void shout() {
System.out.println("动物发出叫声");
}
}
package st.peter.obj2;
public class Dog extends Animal{
public void printName() {
System.out.println("name="+name);
}
}
package st.peter.obj2;
public class Demo1 {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name = "哈士奇";
dog.printName();
dog.shout();
}
}
子类在继承父类的时候,会自动拥有父类的所有成员。
Java中类只支持单继承,不容许多重继承。
重写:
子类中重写的方法需要和父类被重写的方法具有相同的方法名、参数列表以及返回值类型。
package st.peter.obj2;
public class Animal {
String name;
public void shout() {
System.out.println("动物发出叫声");
}
}
package st.peter.obj2;
public class Dog extends Animal{
//重写父类的方法
public void shout() {
System.out.println("汪汪汪......");
}
}
package st.peter.obj2;
public class Demo1 {
public static void main(String[] args) {
Dog dog = new Dog();
dog.shout();
}
}
super关键字:
super关键字用来访问父类的成员。访问父类的成员变量,成员方法和构造方法。
(1):super关键字调用父类的成员变量和成员方法
package st.peter.obj2;
public class Animal {
String name = "动物";
public void shout() {
System.out.println("动物发出叫声");
}
}
package st.peter.obj2;
public class Dog extends Animal{
String name = "犬类";
//重写父类的方法
public void shout() {
super.shout(); //调用父类的成员方法
}
public void printName() {
System.out.println("name="+super.name); //调用父类的成员变量
}
}
package st.peter.obj2;
public class Demo1 {
public static void main(String[] args) {
Dog dog = new Dog();
dog.shout();
dog.printName();
}
}
(2):使用super关键字调用父类的构造方法
package st.peter.obj2;
public class Animal {
public Animal(String name) {
System.out.println("name="+name);
}
}
package st.peter.obj2;
public class Dog extends Animal{
public Dog() {
super("hahah");
}
}
package st.peter.obj2;
public class Demo1 {
public static void main(String[] args) {
Dog dog = new Dog();
}
}
2.final关键字
final修饰的类不能被继承
final修饰的方法不能被子类重写
final修饰的变量是常量,只能赋值一次。
3.抽象类和接口
(1)抽象类
Java允许在定义方法时不写方法体,不包含方法体的方法为抽象方法,抽象方法必须使用abstract关键字来修饰。
当一个类包含了抽象方法,该类必须使用abstract关键字来修饰。
抽象类不能用来实例化,如果想要调用抽象类中的方法,则需创建一个子类,在子类中将抽象类中的抽象方法进行实现。
package st.peter.obj2;
public abstract class Animal1 {
//定义抽象方法
abstract void shout();
}
package st.peter.obj2;
public class Dog extends Animal1{
@Override
void shout() {
// TODO Auto-generated method stub
System.out.println("汪汪汪。。。。。。");
}
}
package st.peter.obj2;
public class Demo2 {
public static void main(String[] args) {
Dog dog = new Dog();
dog.shout();
}
}
(2)接口
接口中定义的方法默认使用“public abstract”来修饰。
接口中的变量默认使用“public static final”来修饰
需要定义一个类,通过关键字“implements”实现接口中的所有方法。
package st.peter.obj2;
public interface Ani {
int ID = 1;
void breathe();
void run();
}
package st.peter.obj2;
public class Dog1 implements Ani {
@Override
public void breathe() {
System.out.println("狗在呼吸!");
}
@Override
public void run() {
System.out.println("狗在跑!");
}
}
package st.peter.obj2;
public class Demo3 {
public static void main(String[] args) {
Dog1 dog = new Dog1();
dog.run();
dog.breathe();
}
}
接口之间可以继承,可以单继承,也可以双继承。
4.多态
在同一个方法中,由于参数类型不同而导致执行效果各异的现象就是多态。
package st.peter.obj3;
public interface Animal {
void shout();
}
package st.peter.obj3;
public class Dog implements Animal{
@Override
public void shout() {
System.out.println("狗在叫......");
}
}
package st.peter.obj3;
public class Cat implements Animal{
@Override
public void shout() {
System.out.println("猫在叫......");
}
}
package st.peter.obj3;
public class Test1 {
public static void main(String[] args) {
Animal a1 = new Cat(); //将Cat对象当做Animal类型来使用
Animal a2 = new Dog();
animalShout(a1);
animalShout(a2);
}
public static void animalShout(Animal ani) {
ani.shout();
}
}
对象类型转换-强转
package st.peter.obj3;
public interface Animal {
void shout();
}
package st.peter.obj3;
public class Dog implements Animal{
@Override
public void shout() {
System.out.println("狗在叫......");
}
public void run() {
System.out.println("狗在跑!");
}
}
package st.peter.obj3;
public class Test1 {
public static void main(String[] args) {
Dog dog = new Dog();
animalShout(dog);
}
public static void animalShout(Animal ani) {
Dog dog = (Dog)ani;
dog.shout();
dog.run();
// ani.shout();
// ani.run();
}
}
Java提供了一个关键字instanceof,判断一个对象是否为某个类(接口)的实例或者子类实例。
package st.peter.obj3;
public interface Animal {
void shout();
}
package st.peter.obj3;
public class Dog implements Animal{
@Override
public void shout() {
System.out.println("狗在叫......");
}
public void run() {
System.out.println("狗在跑!");
}
}
package st.peter.obj3;
public class Cat implements Animal{
@Override
public void shout() {
System.out.println("猫在叫......");
}
}
package st.peter.obj3;
public class Test1 {
public static void main(String[] args) {
//Dog dog = new Dog();
//animalShout(dog);
Cat cat = new Cat();
animalShout(cat);
}
public static void animalShout(Animal ani) {
if(ani instanceof Cat) {
Cat cat = (Cat)ani;
cat.shout();
}else {
System.out.println("是狗不能强转为猫");
}
}
}
Object类
他是所有类的父类,即每个类都直接或间接继承自该类
匿名内部类
匿名内部类的格式:
new 父类(参数列表)或父接口(){
//匿名内部类的实现部分
}
package st.peter.obj4;
public interface Animal {
void shout();
}
package st.peter.obj4;
public class Test1 {
public static void main(String[] args) {
//定义匿名内部类作为参数传递给方法
animalShout(new Animal() {
@Override
public void shout() {
System.out.println("动物在叫");
}
});
}
public static void animalShout(Animal ani) {
ani.shout();
}
}
5.异常
语法格式如下:
try{
//程序代码块
}catch(ExceptionType e){
//对Exception的处理
}
try代码块中编写可能发生异常的Java语句。在try代码块中发生异常语句后面的代码是不会执行的。
catch代码块中编写针对异常进行处理的代码。
在程序中,有时候我们希望有些语句无论程序是否发生异常都要执行。加一个finally代码块。
package st.peter.obj4;
public class Test2 {
public static void main(String[] args) {
//try ... catch ... finally 用于捕获异常
try {
int result = divide(4,0);
System.out.println(result);
}catch(Exception e) {
System.out.println("捕获的异常信息为:"+e.getMessage());
return; //结束当前的方法,System.out.println("程序继续向下执行");不会执行
}finally {
System.out.println("finally代码块。。。");
}
System.out.println("程序继续向下执行");
}
public static int divide(int a,int b) {
int result = a/b;
return result;
}
}
throws关键字
编译时异常与运行时异常
自定义异常
6.包
import语句
7.访问控制
访问控制级别